не могу разрешить загадочную ошибку в программе Python / sqlite - PullRequest
0 голосов
/ 08 марта 2012

Я сталкиваюсь с этой ошибкой, которую не могу решить. Я пишу некоторый код на 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 (строка "INSERT INTO" ... (примерно на 6 строк вверх) я получаю эту ошибку: ** cur.execute ("INSERT INTO" + self.new_tablename + "VALUES ("+ _entry_list +") ") sqlite3.OperationalError: near". ": синтаксическая ошибка **

Я изменил это во многих отношениях. Одно время у меня было целое" INSERT INTO ...VALUES .... "string в качестве переменной и использовал

cur.execute(*variable*)

, когда я сделал это таким образом, ошибка была такой же, за исключением того, что« OperationalError: near ».» Был «OperationalError: near» of »..... и нигде не было 'of'.

Я действительно смущен и расстроен. Кто-то сломал это для моего удовольствия ??

Спасибо F

, текстовый файл выложил строкиЧтение настроено так: Большая звезда в Голливуде, Сандра Дикинсон

, поэтому я решилчто если я использую .join (), чтобы поставить пробел после запятой, то строка будет эквивалентна двум ЗНАЧЕНИЯМ для оператора INSERT INTO.

Ответы [ 3 ]

5 голосов
/ 08 марта 2012

Удалить

_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_tablename и self.new_fieldname.Это должно быть перед тем, как использовать их в любых операторах sql.

0 голосов
/ 08 марта 2012

Я предлагаю вам сделать следующее:

a) Вместо выполнения оператора выведите его на консоль.Измените строку:

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

на:

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

b) Запустите вашу программу после внесения этого изменения.Посмотрите на операторы SQL, которые вы выводите на консоль.Это действительные операторы SQL?Запустите командную строку SQLite и скопируйте / вставьте операторы, созданные вашей программой.Выдает ли SQLite какие-либо ошибки при попытке выполнить вставленные операторы?

0 голосов
/ 08 марта 2012

Вам нужно заключить в кавычки ваши строки.

Как написано, ваш оператор 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")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...