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

Python 如果表中不存在记录,则从列表中插入记录,python,mysql,database,erpnext,Python,Mysql,Database,Erpnext,如果记录不存在但出现错误,我正在尝试上面的代码将数据插入我的表中: pymysql.err.ProgrammingError:1064,您的SQL语法有错误;查看与您的MariaDB服务器版本对应的手册,以了解在“1111,in,2019-12-03 06:37:15”附近使用的正确语法,如果不存在,请在第1行选择“从生物识别中选择*” 我有没有做错什么,或者有没有其他方法来达到这个目的 看来您可能有四个问题: select和where not之间缺少from子句。 使用准备好的语句时,不要将占

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

pymysql.err.ProgrammingError:1064,您的SQL语法有错误;查看与您的MariaDB服务器版本对应的手册,以了解在“1111,in,2019-12-03 06:37:15”附近使用的正确语法,如果不存在,请在第1行选择“从生物识别中选择*”


我有没有做错什么,或者有没有其他方法来达到这个目的

看来您可能有四个问题:

select和where not之间缺少from子句。 使用准备好的语句时,不要将占位符参数%s括在引号内。您的SQL应该是: 您的循环: 循环:

如果您试图只包含来自远程站点的不会重复的行,那么应该明确检查两个重要字段,即UserId和LogDate。但是,既然SQL负责确保排除这些重复行,那么有什么意义呢?还有,把一切从r复制到t有什么意义

SQL:

但即使使用上述SQL,也存在以下问题:

如果not exists子句为false,则选择%s,%s,%s from DUAL。。。不返回任何列,列计数与您尝试插入的列数(即三列)不匹配

如果您担心由于UserId、LogDate是唯一键或主键而导致重复键而出现错误,则在INSERT语句中添加IGNORE关键字,如果已存在具有该键的行,则将忽略插入。但由于您未提供以下信息,因此无法知晓:

Insert into biometric(UserId,C1,LogDate) select %s,%s,%s from DUAL where not exists(select * from biometric where UserID=%s and LogDate=%s
如果您不希望多行具有相同的UserId、LogDate组合,那么您应该在这两列上定义一个唯一的键,这样上面的SQL就足够了。还有一个重复的密钥集。。。INSERT语句的变体,如果密钥存在,则可以执行更新,而不是查找此项

如果在这两列上没有定义唯一键,或者需要打印出正在更新的行,则需要测试现有键的存在。但这将是实现这一目标的方法:

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

如果您使用的是mariadb和MySQL,为什么要标记sqlserver?请只标记您实际使用的RDBMS。如果是我,我现在会忘记非sql的东西,而是专注于查询及其相关逻辑。如果您同意这是一个好主意,请参见:将列表r复制到列表t有什么意义?我建议存在第三个问题:逻辑前提有缺陷。但我是从列表而不是表中插入数据。@草莓,您能解释一下吗?如果您选择的是表单,则该表名为DUAL。
Insert into biometric(UserId,C1,LogDate) select %s,%s,%s from DUAL where not exists(select * from biometric where UserID=%s and LogDate=%s
for i in t:
    frappe.db.sql("Insert IGNORE into biometric(UserId,C1,LogDate) values(%s,%s,%s)",(i[0],i[1],i[2]))
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]))