如何为多个查询和不同的表使用begin transaction(sqlite3,python)

时间:2015-03-16 12:42:18

标签: python sqlite

我使用以下代码在2个表中插入数据:

  1. 变体形式
  2. Var_entity

  3.     #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上发现的以前的问题:

1 个答案:

答案 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(...)