我有一个python脚本,它使用executemany将行批量插入mysql表。数据是从不同的api中检索的,因此时不时会有意外的数据导致一行导致异常。
如果我理解正确-当调用包含1000行的executemany时,其中一行有问题-整个bulk不会被插入。
我想找到一种方法来提交1000条记录,并成功加载那些没有问题的记录。例如,如果一千个中的一个有问题,它将不会被加载,但是所有其他的999都会被加载。
这方面的最佳做法是什么?我正在考虑捕获一个异常并创建一个回退来逐个重新提交所有1000个异常-但似乎必须有更好的方法来实现相同的结果。
建议?
2条答案
按热度按时间mwngjboj1#
插入时,
executemany
将所有数据行批处理在一起,并尝试用一个命令将它们全部插入。据我所知,在处理一次插入失败引发的异常时,不可能不破坏整批插入。如果一行失败,则整个命令失败。下面是它的样子(示例取自mysql文档)。如果你让它这么做:
INSERT INTO employees (first_name, hire_date)
VALUES ('Jane', '2005-02-12'), ('Joe', '2006-05-23'), ('John', '2010-10-03')
try:
cursor.executemany(stmt, data)
except ___Error: # fill in the blank
for datum in data:
try:
cursor.execute(stmt, datum)
except ___Error:
# handle exception, eg print warning
...
for datum in data:
try:
cursor.execute(stmt, datum)
except ___Error:
# handle exception, eg print warning
...
eufgjt7s2#
在“executemany”查询的开头执行一个“insert or ignore”语句可以让您做到这一点—它只会添加不会带来错误的值。
唯一的缺点是你再也看不到发生了什么错误。例如,
原始数据库:
查询:(在python中)
最终数据库: