将列表中的多个项目插入SQLite

des4xlb0  于 2023-01-13  发布在  SQLite
关注(0)|答案(2)|浏览(107)

我有一个包含大量数据的列表(将接近1000)。我想一次添加到一行中。这是不是直接像一个for循环那样在列表上进行多次插入?多次提交?这是不是不好的做法?谢谢
我还没有尝试,因为只是设置表列,这是许多需要知道,如果可行的,谢谢

gz5pxeao

gz5pxeao1#

如果使用SQL插入:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2');

如果您使用代码...使用for循环生成上面的查询,然后运行它。
要获得更有效的方法,请考虑如下所示的并集:Is it possible to insert multiple rows at a time in an SQLite database?

insert into 'tablename' ('column1','column2') 
     select data1 as 'column1',data2 as 'column2'
     union select data3,data4
     union...
utugiqy6

utugiqy62#

在sqlite中,你没有网络延迟,所以向引擎发出很多小请求并不影响性能。要了解更多关于这方面的参考,你可以阅读官方文档:https://www.sqlite.org/np1queryprob.html
但是在写模式下(插入或更新),每个单独的查询都必须支付隐式事务的成本。为了避免这种情况,你需要将插入查询集中到一个显式事务中。根据你的编程语言,你可以改变你的做法。下面是一个代码样本,说明如何在go中做到这一点。我简化了错误代码管理,以便更好地了解要点。

tx, _ := db.Begin() 
for _, item := range items {
    tx.Exec(`INSERT INTO testtable (col1, col2) VALUES (?, ?)`, item.Field1, item.Field2)
}
tx.Commit()

如果在循环中检测到错误,则需要调用tx.Commit()来取消之前对数据库的所有写入,以便最终状态就像根本没有发出插入查询一样。

相关问题