Как преодолеть синтаксическую ошибку, используя Sqlite3 UPSERT с executemany в многомерном словаре Python с ключами в качестве заполнителей? - PullRequest
1 голос
/ 13 октября 2019

У меня есть объект json, полученный от сервера, который преобразуется в многомерный словарь python в приложении kivy. Этот словарь, в который я хочу вставить или обновить информацию о конфликте Sqlite3, используя executemany(). Проблема в том, что я получаю near "ON": syntax error. Может кто-нибудь подсказать, пожалуйста, как я могу решить эту проблему?

Я попытался удалить двоеточие из запроса VALUES, а также получить только словарь dictionary.values ​​(), но безуспешно.

Многомерный макет словаря:

arr = {0: {'empid': 0, 'empname': 'employee0', 'empnumber': 2000}, 1: {'empid': 1, 'empname': 'employee1', 'empnumber': 2001}, 2: {'empid': 2, 'empname': 'employee2', 'empnumber': 2002}, 3: {'empid': 3, 'empname': 'employee3', 'empnumber': 2003}, 4: {'empid': 4, 'empname': 'employee4', 'empnumber': 2004}, 5: {'empid': 5, 'empname': 'employee5', 'empnumber': 2005}, 6: {'empid': 6, 'empname': 'employee6', 'empnumber': 2006}, 7: {'empid': 7, 'empname': 'employee7', 'empnumber': 2007}, 8: {'empid': 8, 'empname': 'employee8', 'empnumber': 2008}, 9: {'empid': 9, 'empname': 'employee9', 'empnumber': 2009}, 10: {'empid': 10, 'empname': 'employee10', 'empnumber': 2010}}

Sqlite datatable:

import os
import sqlite3 as sl
    def create_emp_table(self, cur):
        cur.execute('CREATE TABLE IF NOT EXISTS emp_tb(\
                    emp_id INTEGER PRIMARY KEY NOT NULL,\
                    emp_names TEXT NOT NULL,\
                    emp_number TEXT NOT NULL UNIQUE)')

Sqlite-запрос:

    def insert_emp_name_data_mult(self,conn, cur, arr):
        sql_err = (sl.IntegrityError, sl.OperationalError, sl.ProgrammingError, sl.InterfaceError)
        try:
            query = "INSERT INTO emp_tb(emp_id, emp_names, emp_number)\
                        VALUES(:empid,:empname, :empnumber) ON CONFLICT (emp_id) DO UPDATE SET  emp_names=excluded.emp_names, emp_number.excluded.emp_number"
            cur.executemany(query, arr.values())
            conn.commit()
            return True
        except self.sql_err as err:
            print('error', err)
            cur.close()
            return False

Я бы хотел вставить или обновить таблицу, используя пару многомерного словаря ключ: значение максимально эффективно?

1 Ответ

1 голос
/ 13 октября 2019

Используемая вами нотация UPSERT была добавлена ​​в Sqlite в версии 3.24, а вы используете 3.22, который не понимает синтаксис.

Альтернатива, которая работает наболее старые версии должны использовать INSERT OR REPLACE. Из документации :

При возникновении нарушения ограничения UNIQUE или PRIMARY KEY алгоритм REPLACE удаляет ранее существующие строки, вызывающие нарушение ограничения, перед вставкой или обновлением текущегострока и команда продолжает выполняться нормально.

Итак, попробуйте использовать

INSERT OR REPLACE INTO emp_tb(emp_id, emp_names, emp_number)
VALUES(:empid, :empname, :empnumber)

Однако, поскольку ваш столбец emp_number равен UNIQUE, это не будет действовать совсем так же,замена также сработает, если это конфликтует, а не только если первичный ключ emp_id делает. Вы должны решить для себя, является ли это проблемой или нет.

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