我想从多个实例访问相同的SQLite数据库。
我尝试了两个Python shell,但是在另一个连接上显示新条目时没有得到真正一致的结果。这实际上是否有效或仅仅是侥幸(或者是我的误解)?
我使用的是以下代码段:
>>> import sqlite3
>>> conn = sqlite3.connect("test.db")
>>> conn.cursor().execute("SELECT * from foo").fetchall()
>>> conn.execute("INSERT INTO foo VALUES (1, 2)")
当然,我并不总是添加新条目。
答案 0 :(得分:8)
这不是一个侥幸,只是对如何处理连接的误解。来自docs:
当多个连接访问数据库时,其中一个连接 进程修改数据库,SQLite数据库被锁定,直到 该事务已提交。 timeout参数指定方式 连接应该等待锁定消失直到提升 一个例外。 timeout参数的默认值为5.0(五 秒)。
要查看其他连接的更改,您必须commit()
从execute()
命令进行更改。再次,来自文档:
如果您不调用此方法,则自上次调用以来您执行的任何操作 从其他数据库连接中看不到commit()。如果你想知道 为什么你没有看到你写入数据库的数据 检查你没有忘记称这种方法。
答案 1 :(得分:2)
您还应该在任何DML语句之后包含提交。如果连接字符串的autocommit属性设置为false
>>> import sqlite3
>>> conn = sqlite3.connect("test.db")
>>> conn.cursor().execute("SELECT * from foo").fetchall()
>>> conn.execute("INSERT INTO foo VALUES (1, 2)")
>>> conn.commit()