无法解决Python / sqlite程序中的神秘错误

时间:2012-03-08 07:52:01

标签: python sqlite python-3.x tkinter

我遇到了这个我无法解决的错误 我使用tkinter接口在Python中编写一些代码,将数据从文本文件传输到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(“INSERT INTO”...行(大约6行)我收到此错误: ** cur.execute(“INSERT INTO”+ self.new_tablename +“VALUES(”+ _entry_list +“)”) sqlite3.OperationalError:接近“。”:语法错误**

我已经用许多不同的方式改变了这一点。有一段时间我将整个“INSERT INTO ... VALUES ....”字符串作为变量并使用了

cur.execute(*variable*)

当我这样做时,错误是相同的,除了“OperationalError:near”。“是”OperationalError:near“of”......并且没有任何'of'。

我真的很困惑和沮丧。为了我的请求,有人打破了这个?

由于 ˚F

文本文件行的读数设置如下: 好莱坞的大明星Sandra Dickinson

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

3 个答案:

答案 0 :(得分:5)

删除

_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_list中的所有值。

您仍然需要手动引用self.new_tablenameself.new_fieldname。这应该在你在任何sql语句中使用它们之前。

答案 1 :(得分:0)

你需要引用你的字符串。

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

INSERT INTO foo VALUES(Hello there, world, I am, unquoted, string, not good)

您应该使用:

INSERT INTO foo VALUES("Hello there","world","I am","quoted","string","hooray")

答案 2 :(得分:0)

我建议你做以下事情:

a)不是执行语句,而是将其打印到控制台。改变这一行:

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

为:

print "INSERT INTO " + self.new_tablename + ...

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