如何在以键为占位符的python多维字典中使用Sqlite3 UPSERT with executemany克服语法错误?

2024-10-04 11:24:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从服务器接收的json对象,它在kivy应用程序中被转换成python多维字典。我要使用executemany()将此字典插入Sqlite3数据表或在发生冲突时更新它。问题是我收到了near "ON": syntax error。有人能告诉我如何解决这个问题吗?

我试着从查询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数据表:

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

我想使用多维字典插入或更新表键:值对尽可能高效?你知道吗


Tags: selfidnumber字典namesnotnullerr
1条回答
网友
1楼 · 发布于 2024-10-04 11:24:56

您使用的UPSERT表示法是在3.24版本中添加到Sqlite的,您使用的是3.22,它不理解语法。你知道吗

在旧版本上工作的另一种方法是使用INSERT OR REPLACE。从the documentation

When a UNIQUE or PRIMARY KEY constraint violation occurs, the REPLACE algorithm deletes pre-existing rows that are causing the constraint violation prior to inserting or updating the current row and the command continues executing normally.

所以,试着用

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

但是,由于您的emp_number列是UNIQUE,因此它的作用不会完全相同,因为如果冲突,替换也会触发,而不仅仅是emp_id主键发生冲突。你得自己决定这是不是个问题。你知道吗

相关问题 更多 >