【问题标题】:How to query an SQLite db in batches如何批量查询 SQLite 数据库
【发布时间】:2014-04-15 21:41:19
【问题描述】:

我在 .NET 4.5 中使用 C#。我正在制作一个收集特定数据的刮板。每次抓取一个值时,我都需要确保它尚未添加到 SQLite 数据库中。

为此,每次抓取一个值以查询数据库以检查它是否包含该值时,我都会进行调用,如果不包含该值,我会再次调用以将该值插入数据库。

由于我每秒抓取多个值,这会变得非常 IO 密集型,不断调用数据库。

我的问题是,有没有更好的方法来做到这一点?也许我可以将抓取的值排队,然后一次运行批处理查询?这可能吗?

【问题讨论】:

    标签: c# sql .net sqlite


    【解决方案1】:

    我看到了三种方法:

    1. 使用INSERT OR IGNORE,如果条目已经存在(基于主键和唯一字段),它将拒绝该条目。或者简单地说是 INSERT(或其等效项 (INSERT or ABORT),它将返回 SQLITE_CONSTRAINT,如果您想计算失败的插入,则必须捕获和管理该值。
    2. 在数据库外部累积您想要进行的更新。当你积累了足够的/全部,开始一个事务(BEGIN;),做你的插入(你也可以在这里使用INSERT OR IGNORE),提交事务(COMMIT;
    3. 如果您的数据模型允许,您可以根据具体情况预先获取您已有的项目列表,然后对照该列表进行检查。

    【讨论】:

    • #1 听起来很有趣...这将使我当前的通话减少一半。我假设如果插入不成功,这会引发异常,对吗?对于#2,我能知道每次插入尝试的结果吗?
    • documentation 表示忽略时不会返回任何错误。所以不,不会有任何异常或警告说项目被忽略。至于#2,如果你使用INSERT OR IGNORE,同样的情况,成功没有警告。然而,默认值 INSERT(相当于 INSERT OR ABORT)在冲突时将返回 SQLITE_CONSTRAINT。您需要捕获该返回值并实现自己的错误/日志记录系统。
    • 但是,如果您在事务中使用INSERT 而不使用冲突解决算法(即INSERT OR ABORT),则插入失败将停止该事务并回滚自事务开始以来的所有先前更改会发生交易。我不认为你想要那个。
    • 嗯,那么不幸的是,我又回到了原点。如果有办法判断 Insert 或 Ignore 是否成功,那将是完美的解决方案。
    • 此时不要插入或忽略,插入即可。你会收到警告。你可以找到文档here
    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多