SO处女和SQLite新手,我使用的是python 2.7.9。
我想使用数据库约束和executemany方法将数据插入我的数据库。在创建测试时,我注意到如果应用了约束,我的导入会因 executemany 而失败,但如果我使用 execute 导入则可以。
具体来说,如果我使用executemany,我的迭代器在第一个应用的约束下变为空,但如果我使用execute,我必须理解正确的内容。
样本:
import sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.executescript("""
CREATE TABLE test(a INTEGER CHECK(a<5));
""")
x = iter(range(10))
for r in x:
try: cur.execute("REPLACE INTO test VALUES(?)", (r,))
except sqlite3.IntegrityError:
break
print list(x) # [6, 7, 8, 9] are left
x = iter(range(10))
try: cur.executemany("REPLACE INTO test VALUES(?)", map(lambda r: (r,), x))
except sqlite3.IntegrityError:
pass
print list(x) # [] is left, why NOT [6, 7, 8, 9]?
# 3rd version
x = iter(range(10))
try: cur.executemany("REPLACE INTO test VALUES(?)", [(r,) for r in x])
except sqlite3.IntegrityError: pass
print list(x) # [] is left
为什么在后一种方法中 x 为空?我想在异常之后继续,但什么都没有了。
谢谢 :)