如果 table 中不存在,则从列表中插入记录

Insert record from list if not exists in table

cHandler = myDB.cursor()
cHandler.execute('select UserId,C1,LogDate from DeviceLogs_12_2019') // data from remote sql server database

curs = connection.cursor() 
curs.execute("""select * from biometric""")  //data from my database table

lst = []
result= cHandler.fetchall()
for row in result:
    lst.append(row)

lst2 = []
result2= curs.fetchall()
for row in result2:
    lst2.append(row)

t = []
r = [elem for elem in lst if not elem in lst2]
for i in r: 
    print(i)
    t.append(i)

for i in t:
    frappe.db.sql("""Insert into biometric(UserId,C1,LogDate) select '%s','%s','%s'  where not exists(select * from biometric where UserID='%s' and LogDate='%s')""",(i[0],i[1],i[2],i[0],i[2]),as_dict=1)

如果记录不存在但出现错误,我正在尝试使用上面的代码将数据插入到我的 table 中:

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1111'',''in'',''2019-12-03 06:37:15'' where not exists(select * from biometric ' at line 1")

有没有我做错了什么或有什么其他方法可以做到这一点?

看来您可能有四个问题:

  1. selectwhere not exists 之间缺少一个 from 子句。
  2. 使用准备好的语句时,不要将占位符参数 %s 括在引号内。您的 SQL 应该是:
  3. 你的循环:

循环:

t = []
r = [elem for elem in lst if not elem in lst2]
for i in r: 
    print(i)
    t.append(i)

如果您试图只包含来自远程站点的不会重复的行,那么您应该明确检查两个重要的字段,即 UserIdLogDate。但是,既然您的 SQL 负责确保您排除了这些重复的行,那有什么意义呢?另外,将 r 中的所有内容复制到 t 有什么意义?

SQL:

Insert into biometric(UserId,C1,LogDate) select %s,%s,%s from DUAL where not exists(select * from biometric where UserID=%s and LogDate=%s

但是上面的问题还是有的 SQL:

如果 not exists 子句为假,则 select %s,%s,%s from DUAL ... returns 没有列,列数将与您尝试插入的列数不匹配,即三列。

如果您担心由于 (UserId, LogDate) 是 UNIQUE 或 PRIMARY KEY 而导致重复键出现错误,则在 INSERT 语句中添加 IGNORE 关键字,然后如果包含该键的行已经存在,插入将被忽略。但是没有办法知道,因为你没有提供这个信息:

for i in t:
    frappe.db.sql("Insert IGNORE into biometric(UserId,C1,LogDate) values(%s,%s,%s)",(i[0],i[1],i[2]))

如果您不希望多行具有相同的(UserId, LogDate)组合,那么您应该在这两列上定义一个UNIQUE KEY,然后在上面的SQL 应该足够了。 INSERT 语句还有一个 ON DUPLICATE KEY SET ... 变体,如果密钥存在,您可以改为执行更新(查找)。

如果您没有在这两列上定义 UNIQUE KEY 或者您需要打印出那些正在更新的行,那么您需要测试现有键是否存在。但这是这样做的方法:

cHandler = myDB.cursor()
cHandler.execute('select UserId,C1,LogDate from DeviceLogs_12_2019') // data from remote sql server database
rows = cHandler.fetchall()
curs = connection.cursor() 
for row in rows:
    curs.execute("select UserId from biometric where UserId=%s and LogDate=%s", (ros[0], row[2])) # row already in biometric table?
    biometric_row = curs.fetchone()
    if biometric_row is None: # no, it is not
        print(row)
        frappe.db.sql("Insert into biometric(UserId,C1,LogDate) values(%s, %s, %s)", (row[0],row[1],row[2]))