如果 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")
有没有我做错了什么或有什么其他方法可以做到这一点?
看来您可能有四个问题:
select
和 where not exists
之间缺少一个 from
子句。
- 使用准备好的语句时,不要将占位符参数
%s
括在引号内。您的 SQL 应该是:
- 你的循环:
循环:
t = []
r = [elem for elem in lst if not elem in lst2]
for i in r:
print(i)
t.append(i)
如果您试图只包含来自远程站点的不会重复的行,那么您应该明确检查两个重要的字段,即 UserId
和 LogDate
。但是,既然您的 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]))
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")
有没有我做错了什么或有什么其他方法可以做到这一点?
看来您可能有四个问题:
select
和where not exists
之间缺少一个from
子句。- 使用准备好的语句时,不要将占位符参数
%s
括在引号内。您的 SQL 应该是: - 你的循环:
循环:
t = []
r = [elem for elem in lst if not elem in lst2]
for i in r:
print(i)
t.append(i)
如果您试图只包含来自远程站点的不会重复的行,那么您应该明确检查两个重要的字段,即 UserId
和 LogDate
。但是,既然您的 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]))