用于减少数据库写入的 SQLite executemany 或 union select

Sqlite executemany or union select for reduced db writes

在将多行插入 table 时,我正在尝试减少写入 Sqlite 数据库的次数。

到目前为止,我已经找到了两种方法,使用 union select 语句或使用 sqlite3 中的 executemany 命令。

executemany 是否通过单次写入工作?

作为参考,请参阅我正在使用的以下语句(union select):

INSERT INTO table1
SELECT "hello" AS field1, 15 AS field2, 1262340000 AS timestamp 
UNION SELECT "byebye", 10, 1262340000 
UNION SELECT "hi", 20, 1262340000 
UNION SELECT "boo", 25, 1262340000 

更新

我知道从安全的角度来看,通过字符串连接构建 SQL 语句确实很糟糕,但在这种情况下,数据库所有者也是数据提供者,因此 SQL 注入问题可以忽略。

这是 Python 2.7

sqlite3 版本 2.6.0

SQLite 在事务提交时将数据从其页面缓存刷新到磁盘。 所以你只需要将所有的 INSERT 放入一个事务中:

BEGIN;
INSERT INTO table1 VALUES('hello', 15, 1262340000);
INSERT INTO table1 VALUES('byebye', 10, 1262340000);
INSERT INTO table1 VALUES('hi', 20, 1262340000);
INSERT INTO table1 VALUES('boo', 25, 1262340000);
COMMIT;

Python automatically inserts transactions behind your back,所以你可以只使用一堆 execute(),或者 executemany():

data = [('hello', 15, 1262340000),
        ('byebye', 10, 1262340000),
        ('hi', 20, 1262340000),
        ('boo', 25, 1262340000)]
con.executemany("INSERT INTO table1 VALUES(?, ?, ?);", data)
con.commit()