sqlite3执行ON CONFLICT… do …采坑


python3.6在调用的sqlite3执行插入语句存在则更新时报错

建表语句

CREATE TABLE order_temp ( order_day date, item_no text,  order_qty real, qty real, input_time timestamp);
CREATE UNIQUE INDEX idx_order_temp_union ON order_temp (order_day,  item_no);

python代码:

import sqlite3

db = sqlite3.connect('local.db')
data_list = [('2023-03-22', '80013', '2', '4.00', '2023-03-22 16:03:36')]
sql = "INSERT INTO sale_detail_temp (order_day, item_no, qty,order_qty, input_time) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT (order_day,  item_no) DO UPDATE SET qty = excluded.qty, order_qty = excluded.order_qty, input_time = excluded.input_time"
db.executemany(sql, data_list)
db.commit()

报错:

sqlite3.OperationalError: near "ON": syntax error

排错过程

同个多种查询得到sqlite3的版本就是3.21.0

sqlite3.sqlite_version
# 或者连接 SQLite 版本号
conn = sqlite3.connect('path/to/database')
version = conn.execute('SELECT sqlite_version()').fetchone()[0] 
print(version)
虽然网上说这个版本是支持ON CONFLICT语句,但是几种方法无果,觉得升级对应版本,python的sqlite3无法升级模块,实际是由sqlite.dll决定数据库版本!
sqlite.dll下载最新版本
然后dll文件覆盖python目录,python总安装目录DLLs文件夹 下替换,虚拟环境是在对于的 Scripts文件夹