使用Sqlite的WAL模式

5

我一直在关注Python文档中SQLite教程,并成功创建了一个员工表并向其写入数据。

import sqlite3

conn = sqlite3.connect('employee.db')
c = conn.cursor()

firstname = "Ann Marie"
lastname = "Smith"
email = "ams@cia.com"

employee = (email, firstname, lastname)

c.execute('INSERT INTO Employee Values (?,?,?)', employee)
conn.commit()

# Print the table contents
for row in c.execute("select * from Employee"):
    print(row)

conn.close()

我一直在阅读预写式日志,但找不到解释如何实现它的教程。有人可以提供一个例子吗?
我注意到Firefox使用SQLite时会以某种方式锁定文件,如果您尝试在使用Firefox时删除sqlite文件,它会失败并显示“文件正在使用中”(或类似的消息),我该如何实现这一点?我在Windows 10下运行Python。

你没有注意到你引用的SQLite3文档告诉你如何使用PRAGMA journal_mode=WAL吗? - varro
@varro - 我试过了,但是不起作用,WAL文件从未被创建。根据文档,它应该在数据库所在的位置创建。 - user8852560
2个回答

6
conn = sqlite3.connect('app.db', isolation_level=None)

将日志模式设置为WAL:

conn.execute('pragma journal_mode=wal')

或者另一种方法(只展示如何关闭 wal 模式)

cur = conn.cursor()
cur.execute('pragma journal_mode=DELETE')

-1

PRAGMA journal_mode documentation中提到:

如果无法更改日志模式,则返回原始日志模式。[...]
请注意,在事务处于活动状态时无法更改journal_mode。

因此,您必须确保数据库库不会尝试聪明地自动启动事务


2
你能提供一个如何在Python中启用和使用SQLite的WAL的例子吗? - user8852560

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接