【问题标题】:Python and sqlite3 - adding thousands of rowsPython 和 sqlite3 - 添加数千行
【发布时间】:2011-06-10 19:52:51
【问题描述】:

我有一个 .sql 文件,其中包含数千个单独的插入语句。完成所有这些需要很长时间。我试图找出一种更有效地做到这一点的方法。在 python 中,sqlite3 库不能执行“.read”或“.import”之类的操作,但是对于这么多插入来说,executescript 太慢了。

我安装了 sqlite3.exe shell 希望使用“.read”或“.import”,但我不知道如何使用它。在 Eclipse 中通过 django 运行它不起作用,因为它希望数据库位于我的 C 驱动器的根目录中,这看起来很愚蠢。通过命令行运行它不起作用,因为它找不到我的数据库文件(除非我做错了什么)

有什么建议吗?

谢谢!

【问题讨论】:

标签: python sql django sqlite


【解决方案1】:

你在使用交易吗? SQLite 将为每个 insert statement individually by default 创建一个事务,这会减慢速度。

默认打开 sqlite3 模块 在数据之前隐式交易 修改语言 (DML) 语句 (即插入/更新/删除/替换)

如果您在开始时手动创建一个事务并在结束时提交它,它将大大加快速度。

【讨论】:

  • 这就是我喜欢这个网站的原因。我遇到了与 OP 完全相同的问题,试图将 42000+ 行插入数据库。花了几分钟。根据此处的答案,我在 INSERT 周围添加了 BEGIN..COMMIT 语句,插入所有行只用了不到 5 秒。谢谢!
  • 你是说只放置一个 BEGIN 和 COMMIT 语句来包裹所有的插入?如果 sqlite3 自动进行交易,那么这不会加剧问题还是会停止 sqlite3 的行为
  • @JPC 是的,在第一个插入之前放一个 BEGIN,在最后一个插入之后放一个 COMMIT。 Sqlite 只会在尚未在一个事务中时自动创建一个事务,因此手动创建一个可以防止问题发生。
【解决方案2】:

您是否尝试在单个事务中运行插入? 如果不是,那么每个插入都被视为一个事务,并且......好吧,你可以阅读这个here的 SQLite 常见问题解答

【讨论】:

    【解决方案3】:

    除了在单个事务中批量运行查询之外,还可以尝试VACUUMANALYZE 数据库文件。它帮助了我的类似问题。

    【讨论】:

      【解决方案4】:

      使用参数化查询

      使用事务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-21
        • 2021-04-28
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多