【问题标题】:Python - UPDATE or INSERT to sqlite using dictionaryPython - 使用字典更新或插入到 sqlite
【发布时间】:2019-07-25 12:36:44
【问题描述】:

如果不存在行到 sqlite 表中,我正在尝试更新或插入。 无法使用 executemany

从 python 级别执行此操作

我的输入 csv 如下所示:

cfthostname,cftshortname,cftenv,cert_time
lx1234.pl.net,lx1234,tst,28/01/2021
plx169.net,plx169,tst,26/03/2021
sp2444445.net,sp2444445,prd,12/06/2021

我的数据库模型

cfthostname,cftshortname,cftenv,cert_time
lx1234.pl.net,lx1234,tst,DD/MM/RRRR
plx169.net,plx169,tst,DD/MM/RRRR
sp2444445.net,sp2444445,prd,DD/MM/RRRR

我需要做的是:
1. 如果输入 csv 中的 cfthostname 与 db 中的 cfthostname 匹配,则更新 cert_time
2. 如果 cfthostname 在 DB 中不存在,则插入所有 4 列

db_update.py

import sqlite3
import csv

conn = sqlite3.connect("C:\db.sqlite3")
cursor = conn.cursor()
[...]
######---Import to DB---######
cursor.execute("CREATE TABLE IF NOT EXISTS itpassed_host (cfthostname, cftshortname, cftenv, cert_time);")
with open('C:\csv\cfthosts.csv','rt') as fin:
    dr = csv.DictReader(fin)
    to_db = [(i['cfthostname'], i['cftshortname'], i['cftenv'], i['cert_time']) for i in dr]

cursor.executemany("INSERT INTO itpassed_host (cfthostname, cftshortname, cftenv, cert_time) VALUES (?, ?, ?, ?) ON CONFLICT (cfthostname) DO UPDATE SET cert_time=excluded.cert_time;", to_db)
conn.commit()
conn.close()

我明白了

sqlite3.OperationalError: near "ON": syntax error

我有 sqlite 3.7.17

【问题讨论】:

  • 假设cfthostname是主键或者有唯一索引,如果你更新到现代版本的sqlite,你可以像这样使用ON CONFLICT。但是,您缺少所需的约束,并且使用的是非常过时的 sqlite 版本。
  • 有没有其他方法可以做这样的更新,即使忽略插入(我可以用其他方式处理插入)。
  • 您总是可以通过几个步骤来完成;首先查看是否存在特定行,如果存在则更新它,如果不存在,则插入新行。
  • 下载了 3.29.0 版本的 sqlite 还是同样的问题

标签: python sqlite csv


【解决方案1】:

使用“WHERE True”来避免这种冲突:

cursor.executemany("INSERT INTO itpassed_host (cfthostname, cftshortname, cftenv, cert_time) VALUES (?, ?, ?, ?) **WHERE True** ON CONFLICT (cfthostname) DO UPDATE SET cert_time=excluded.cert_time;", to_db)

UPSERT Parsing Ambiguity

【讨论】:

  • 歧义出现在 INSERT ... SELECT ... 语句中,而不是出现在 WHERE 子句无效的 INSERT ... VALUES ... 语句中。
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多