0
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)

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

pymysql.err.ProgrammingError: (1064, "您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,了解在 '1111''、''in''、''2019 附近使用的正确语法-12-03 06:37:15'' 在不存在的地方(从第 1 行的生物特征中选择 *)

有什么我做错了或任何其他方式来实现这一目标吗?

4

1 回答 1

0

看来您可能有四个问题:

  1. 和之间缺少一个from子句。selectwhere not exists
  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子句为 false,则select %s,%s,%s from DUAL ...返回不返回任何列,并且列数将与您尝试插入的列数(即三)不匹配。

如果您担心由于重复键而导致错误,因为(UserId, LogDate)是唯一键或主键,则在 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 就足够了。ON DUPLICATE KEY SET ...INSERT 语句还有一个变体,如果密钥存在,您可以进行更新(查看此内容)。

如果您没有在这两列上定义 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]))
于 2019-12-19T11:43:40.137 回答