SQLite并发:第二个进程没有得到数据库更新

2024-04-24 15:05:37 发布

您现在位置:Python中文网/ 问答频道 /正文

为了查看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发挥作用?


Tags: 方法keypyimport数据库executesqlitetime
2条回答

REPLACE需要唯一或主键约束才能检测重复项。(SELECT MAX(value)...就行了。)

这在sqlite3中运行良好: 从答案转移到this问题

脚本1.py

import sqlite3, time
conn = sqlite3.connect('test.db')
conn.execute("CREATE TABLE IF NOT EXISTS kv (key text unique, value text)")

for i in range(1000):
    conn.execute('REPLACE INTO kv (key, value) VALUES (?,?)', (1, i))
    conn.commit()
    print i
    time.sleep(1)

脚本2.py

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)

输出

python script2.py 
(u'3',)
(u'4',)
(u'5',)
(u'6',)
(u'7',)

问题是您最初没有制作unique

When a UNIQUE or PRIMARY KEY constraint violation occurs, the REPLACE algorithm deletes pre-existing rows that are causing the constraint violation prior to inserting or updating the current row and the command continues executing normally.

如果不是唯一的,则会发生以下情况:

sqlite3 test.db 
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
sqlite> select * from kv;
1|0
1|1
1|2
1|3
1|4
sqlite> select * from kv;
1|0
1|1
1|2
1|3
1|4
1|5
sqlite> select * from kv;
1|0
1|1
1|2
1|3
1|4
1|5
1|6
1|7
sqlite> 

是的,sqlite3supports事务,但有一些注意事项。 因此,如果您还需要支持多个编写器-多个读取器场景,由于锁争用,一切都可能变得有点棘手

如果你需要的话,这里有一个related关于多重作者案例的讨论

相关问题 更多 >