为了查看SQLite是否可以同时被两个进程使用,我尝试了以下方法:
script1.py(每1秒更新一次数据库)
import sqlite3, time
conn = sqlite3.connect('test.db')
conn.execute("CREATE TABLE IF NOT EXISTS kv (key text, value text)")
for i in range(1000):
conn.execute('REPLACE INTO kv (key, value) VALUES (?,?)', (1, i))
conn.commit()
print i
time.sleep(1)
script2.py(每1秒查询一次数据库)
import sqlite3, time
conn = sqlite3.connect('test.db')
c = conn.cursor()
while True:
c.execute('SELECT value FROM kv WHERE key = ?', (1,))
item = c.fetchone()
print item
time.sleep(1)
我开始script1.py
,然后script2.py
,让它们同时运行。我希望script2.py
会知道(但我不知道怎么知道!)数据库已经更新,必须重新加载其中的一部分。但不幸的是,我在script2.py
中得到了这样的信息:
(u'0',)
(u'0',)
(u'0',)
(u'0',)
(u'0',)
(u'0',)
(u'0',)
也就是说,它没有得到script1.py
的更新。你知道吗
有没有一种简单的方法可以让SQLite发挥作用?
REPLACE需要唯一或主键约束才能检测重复项。(
SELECT MAX(value)...
就行了。)这在sqlite3中运行良好: 从答案转移到this问题
脚本1.py
脚本2.py
输出
问题是您最初没有制作键unique
如果键不是唯一的,则会发生以下情况:
是的,sqlite3supports事务,但有一些注意事项。 因此,如果您还需要支持多个编写器-多个读取器场景,由于锁争用,一切都可能变得有点棘手
如果你需要的话,这里有一个related关于多重作者案例的讨论
相关问题 更多 >
编程相关推荐