如何用executemany(mysql和python)处理异常

sqyvllje  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(859)

我有一个python脚本,它使用executemany将行批量插入mysql表。数据是从不同的api中检索的,因此时不时会有意外的数据导致一行导致异常。
如果我理解正确-当调用包含1000行的executemany时,其中一行有问题-整个bulk不会被插入。
我想找到一种方法来提交1000条记录,并成功加载那些没有问题的记录。例如,如果一千个中的一个有问题,它将不会被加载,但是所有其他的999都会被加载。
这方面的最佳做法是什么?我正在考虑捕获一个异常并创建一个回退来逐个重新提交所有1000个异常-但似乎必须有更好的方法来实现相同的结果。
建议?

mwngjboj

mwngjboj1#

插入时, executemany 将所有数据行批处理在一起,并尝试用一个命令将它们全部插入。据我所知,在处理一次插入失败引发的异常时,不可能不破坏整批插入。如果一行失败,则整个命令失败。
下面是它的样子(示例取自mysql文档)。如果你让它这么做:

data = [
  ('Jane', date(2005, 2, 12)),
  ('Joe', date(2006, 5, 23)),
  ('John', date(2010, 10, 3)),
]
stmt = "INSERT INTO employees (first_name, hire_date) VALUES (%s, %s)"
cursor.executemany(stmt, data)
``` `executemany` 将执行以下操作:

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
...

如果你认为这将是一个经常出现的问题,那么放弃可能会更有效 `executemany` 就这么做吧:

for datum in data:
try:
cursor.execute(stmt, datum)
except ___Error:
# handle exception, eg print warning
...

eufgjt7s

eufgjt7s2#

在“executemany”查询的开头执行一个“insert or ignore”语句可以让您做到这一点—它只会添加不会带来错误的值。
唯一的缺点是你再也看不到发生了什么错误。例如,
原始数据库:

('kaushik', 3)
('maria', 4)
('shreya', 38)

查询:(在python中)

listofnames = [
('kaushik', 3),
('maria', 4),
('jane', 56)
]

c.executemany("INSERT OR IGNORE INTO bob (name, number) VALUES (?,?)", 
listofnames)

最终数据库:

('kaushik', 3)
('maria', 4)
('shreya', 38)
('jane', 56)

相关问题