【问题标题】:Python sqlite3 what happens if executemany() encounters an integrity error partway through?Python sqlite3 如果 executemany() 在中途遇到完整性错误会发生什么?
【发布时间】:2019-03-25 12:07:39
【问题描述】:

如果我运行 SQL 命令

INSERT INTO my_table VALUES (?);

有约束

CREATE my_table(
    user_name VARCHAR(255) PRIMARY KEY
);

在列表['a', 'b', 'c', 'd', 'e', 'f', 'a', 'b', 'g', 'h', 'i']上使用sqlite3的executemany()命令,我会得到一个sqlite3.IntegrityError

我对@9​​87654326@ 遇到此错误时的行为有一些疑问,我一直无法找到有关该行为的任何文档。

1) 在异常之前插入的值是否总是完好无损?

2) 是否有可能插入发生异常之后的值?

3) 有什么方法可以确定哪些值会导致异常? (我能想到的最好的办法是将列表包装在生成器中以跟踪状态,记录问题条目,然后在生成器的其余部分重试,直到整个列表被消耗完。)

【问题讨论】:

    标签: python sql python-3.x sqlite executemany


    【解决方案1】:

    下面的测试脚本提供了一些证据:

    1. 在完整性约束之前插入的值似乎完好无损
    2. 异常后要插入的值没有插入
    3. 我没有找到 - 我使用了与您建议的解决方案类似的方法。

    请注意,如果您想防止在出现IntegrityError 时插入任何值,您可以使用事务。下面的例子。另请参阅here 了解更多信息。

    import sqlite3
    conn = sqlite3.connect('del.db')
    tuples = ('a','b','c','a','d')
    
    conn.execute('create table test (col text primary key)')
    
    conn.commit()
    c = conn.cursor()
    try:
        c.executemany('insert into test  values (?)', tuples)
    except sqlite3.IntegrityError as exc:
        print(exc)
    
    c.close()
    
    results = conn.execute('select * from test')
    results.fetchall()
    

    产生以下输出

    UNIQUE constraint failed: test.col
    [('a',), ('b',), ('c',)]
    

    而如果您使用交易:

    c = conn.cursor()
    c.execute('begin')
    try:
        c.executemany('insert into test  values (?)', tuples)
    except sqlite3.IntegrityError as exc:
        c.execute('rollback')
    

    没有输入数据。

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2018-05-12
      • 2014-01-19
      相关资源
      最近更新 更多