在一个爬虫中使用了Sqlite3数据库,在将内容写入数据库时,可以正常执行,并且使用同一个游标可以正常读出数据,但是数据库中并没有内容。
在网上搜索时发现,是因为sqlite的事务控制导致,其中在执行数据库操作时,会有两种commit状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 智能commit状态: 生成方式: 在connect()中不传入 isolation_level, 此时isolation_level=='' 在进行 执行Data Modification Language (DML) 操作(INSERT/UPDATE/DELETE/REPLACE)时, 会自动打开一个事务, 在执行 非DML, 非query (非 SELECT 和上面提到的)语句时, 会隐式执行commit 可以使用 connection.commit()方法来进行提交 注意: 不能和cur.execute("COMMIT")共用 自动commit状态: 生成方式: 在connect()中传入 isolation_level=None 这样,在任何DML操作时,都会自动提交 事务处理 connection.execute("BEGIN TRANSACTION") connection.execute("COMMIT") 如果不使用事务, 批量添加数据非常缓慢
|
智能commit状态
即在下面这种非数据修改操作时,会自动执行commit操作。
1
| result = c.execute("select * from bing_images")
|
当进行数据库写入时,这种数据修改操作并不会自动提交,需要在执行完成后进行手动提交(需要connection.commit()进行提交)。
1 2
| c.execute(insert_sql) conn.commit()
|
自动commit状态
在这种情况下,无论是数据修改操作还是非数据修改操作都会自动提交。