无法解决Python/sqlite程序中的隐藏错误

无法解决Python/sqlite程序中的隐藏错误,python,sqlite,python-3.x,tkinter,Python,Sqlite,Python 3.x,Tkinter,我遇到了这个我无法解决的错误 我正在用Python编写一些代码,使用tkinter接口将数据从文本文件传输到sqlite 首先,以下是相关代码: def submit_data(self): self.new_filename = self.file_entry.get() self.new_tablename = self.table_entry.get() self.new_fieldname = self.field_entry.get().split(',')

我遇到了这个我无法解决的错误 我正在用Python编写一些代码,使用tkinter接口将数据从文本文件传输到sqlite

首先,以下是相关代码:

def submit_data(self):
    self.new_filename = self.file_entry.get()
    self.new_tablename = self.table_entry.get()
    self.new_fieldname = self.field_entry.get().split(',')

    #print(self.new_fieldname)
    self.create_new.destroy()

    from sqlite3 import dbapi2 as sqlite

    con = sqlite.connect(self.new_filename)    
    cur = con.cursor()
    cur.execute('CREATE TABLE ' + self.new_tablename + '(id INTEGER PRIMARY KEY)')
    for field in self.new_fieldname:
        cur.execute('ALTER TABLE ' + self.new_tablename + ' ADD ' + field)

    with open(self.filename, 'r', encoding='latin-1') as self.the_file:    
        status = True
        #_keynumber=1
        while status:
            _row = self._next_line()

            if _row:
                _entry_list = _row.split(',')
                # add space after text line comma for formatting
                _entry_list = ', '.join(_entry_list)
                #print(_entry_list)

                #entries = {'row': _keynumber, 'entry': _entry_list} 
                #row_entry = "INSERT INTO " + self.new_tablename + " VALUES(" + _entry_list + ")"
                cur.execute("INSERT INTO " + self.new_tablename + " VALUES(" + _entry_list + ")")

                #_colrange = range(_colamount)                    

                #_keynumber+=1

            else:
                status = False   

        con.commit()
在cur.execute(“插入到”…行(大约6行)时,我得到以下错误: **当前执行(“插入到“+self.new\u tablename+”值(“+\u entry\u list+”)中”) sqlite3.error:near.'':语法错误**

我用很多不同的方法改变了这一点。我曾经把整个“INSERT-INTO…VALUES…”字符串作为变量,并使用

cur.execute(*variable*)
当我这样做的时候,错误是一样的,除了“OperationalError:near”是“OperationalError:near”of“…没有任何“of”

我真的很困惑和沮丧。有人打破了我的请

谢谢 F

文本文件行及其读取设置如下: 好莱坞巨星桑德拉·迪金森


所以我想如果我使用.join()在逗号后面加一个空格,那么字符串将相当于INSERT INTO语句的两个值。

您需要引用字符串

如前所述,您的SQL语句是:

插入到foo值中(您好,world,I am,无引号,字符串,不好)

你应使用:


在foo值中插入(“你好”、“世界”、“我是”、“引用的”、“字符串”、“万岁”)
您需要引用字符串

如前所述,您的SQL语句是:

插入到foo值中(您好,world,I am,无引号,字符串,不好)

你应使用:


在foo值中插入(“你好”,“世界”,“我是”,“引用”,“字符串”,“万岁”)
我建议您执行以下操作:

a) 不要执行该语句,而是将其打印到控制台。更改行:

cur.execute("INSERT INTO " + self.new_tablename + ...)
致:


b) 进行此更改后运行您的程序。看看您打印到控制台的SQL语句。它们是有效的SQL语句吗?启动SQLite命令行,复制/粘贴程序生成的语句。当您尝试执行粘贴的语句时,SQLite是否会出现任何错误?

我建议您执行以下操作:

a) 不要执行该语句,而是将其打印到控制台。更改行:

cur.execute("INSERT INTO " + self.new_tablename + ...)
致:

b) 进行此更改后运行您的程序。看看您打印到控制台的SQL语句。它们是有效的SQL语句吗?启动SQLite命令行,复制/粘贴程序生成的语句。当您尝试执行粘贴的语句时,SQLite是否会给出任何错误?

删除

_entry_list = ', '.join(_entry_list)
和使用

cur.execute("INSERT INTO " + self.new_tablename + "(" + ",".join(self.new_fieldname) +") VALUES(" + ",".join(("?" for i in xrange(len(_entry_list)))) + ")", _entry_list)
这将参数化您的查询并自动引用_entry _列表中的所有值

您仍然必须手动引用
self.new\u tablename
self.new\u fieldname
。这应该在您在任何sql语句中使用它们之前进行。

删除

_entry_list = ', '.join(_entry_list)
和使用

cur.execute("INSERT INTO " + self.new_tablename + "(" + ",".join(self.new_fieldname) +") VALUES(" + ",".join(("?" for i in xrange(len(_entry_list)))) + ")", _entry_list)
这将参数化您的查询并自动引用_entry _列表中的所有值


您仍然必须手动引用
self.new\u tablename
self.new\u fieldname
。这应该在您在任何sql语句中使用它们之前进行。

ahhh,那么文本文件字符串中的两个子字符串也需要引用吗?有没有关于以编程方式实现这一点的最佳方法的建议?实际上,有成千上万的人,不能用手来做这件事,Lollreplace
\u entry\u list=”,”。将(\u entry\u list)
\u entry\u list=”,“”。加入(\u entry\u list)
,然后通过执行
\u entry\u list=”,“+\u entry\u list[:-1]+\u entry\u list[len len(\u entry\u list)-1]+”,
ahhh来处理边缘情况,那么文本文件字符串中的两个子字符串也需要引用?有没有关于以编程方式实现这一点的最佳方法的建议?实际上,有成千上万的人,不能用手来做这件事,Lollreplace
\u entry\u list=','。用
\u entry\u list=',“'”连接(\u entry\u list)
,然后通过执行
\u entry\u list=',“+\u entry\u list[:-1]+\u entry\u list[len entry\u list]+'”,“
这是正确的方法。请注意,使用参数化查询还可以防止SQL注入攻击。谢谢你,这似乎会奏效,但我现在遇到了一种周期性的问题。因为当我创建一个以id列开始的表时,这段代码告诉我我的表有三列,但我只提供了两个值。当我添加绑定时,比如“值(?)例如,它说有太多的绑定。因此,要么提供的值有太多的绑定,要么列太多。我修改了不同的东西,如上面的示例,并得到了相同类型的错误。是的,我刚才删除了该行。但我似乎无法解决太多绑定/太多列的问题.all现在似乎是正确的,只是因为在创建表上,我使用id INTEGER主键对其进行了默认设置,然后添加了两列。因此,我得到了:sqlite3.OperationalError:TABLE mememel有3列,但提供了2个值,如果我添加了绑定,则得到:sqlite3.ProgrammingError:提供的绑定数不正确。当前状态为t使用3,但提供了2个。仍然给我带来了一些核心问题。这是正确的方法。请注意,使用参数化查询也可以保护您免受SQL注入攻击。谢谢,这似乎是可行的,但我现在遇到了一种循环问题。因为当我创建表时,我从一个id列开始,这段代码告诉我我的表有三列,但我只提供了两个值例如,它说有太多的绑定。因此,要么提供的值有太多的绑定,要么列太多。我修改了不同的东西,如上面的示例,并得到了相同类型的错误。是的,我刚才删除了该行。但我似乎无法解决太多绑定/太多列的问题.现在一切似乎都正常,只是因为