我使用以下代码在2个表中插入数据:
#begin transaction
cur.execute("begin")
id_var = 0
for red in prop_redirect["results"]["bindings"]:
var_res = red["x"]["value"].split('/')[-1]
var_type = "t1"
#insert data in table VARIATIONS
cur.execute("INSERT INTO VARIATIONS (ID, NAME, TYPE) VALUES (?, ?, ?)", (str(id_var) + "_" + str(ID), var_res, var_type))
#insert data in table VAR_ENTITY
cur.execute("INSERT INTO VAR_ENTITY(ID_ENTITY, ID_VAR, LANGUAGE) VALUES(?, ?, ?)", (str(ID), str(id_var) + "_" + str(ID), "en" ) )
id_var = id_var + 1
#commit after for loop
cur.execute("commit")
根据我的理解,使用"开始交易"并且"承诺"允许更快地访问数据库Bulk insert huge data into SQLite using Python
cur.execute("begin")
和cur.execute("commit")
语句是否正确放置?
我在stackoverflow上发现的以前的问题:
答案 0 :(得分:1)
如果语句与for
处于同一级别,则它们位于正确的位置,但您还需要将isolation_level
设置为None
以外的其他语句或驱动程序每次拨打cur.execute()
时都会提交。
您也不应该使用cur.execute("commit")
而是使用conn.commit()
,因此驱动程序可以注意到您正在做的事情。
begin
也不是必需的。如果没有,数据库将自动为您启动一个事务。所以这会更好:
conn.isolation_level = '...' # anything but none
with conn: # let the driver handle transaction management
cur = conn.cursor()
for ...
cur.execute(...)