2013-03-30 69 views
9

是否可以在一個進程中訪問數據庫,在另一個進程中創建? 我嘗試:兩個進程可以同時訪問內存中(:內存:) sqlite數據庫嗎?

IDLE#1

import sqlite3 
conn = sqlite3.connect(':memory:') 
c = conn.cursor() 
c.execute("create table test(testcolumn)") 
c.execute("insert into test values('helloooo')") 
conn.commit() 
conn.close() 

IDLE#2

import sqlite3 
conn = sqlite3.connect(':memory:') 
c = conn.cursor() 
c.execute("select * from test") 

錯誤:

Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    q = c.execute("select * from test") 
sqlite3.OperationalError: no such table: test 
+0

每個連接過程':內存:'創建自己的,獨特的,私有數據庫,不可見的所有其他進程。 – zwol

回答

13

不,他們無法訪問相同的內存數據庫。相反,新連接:memory:總是創建一個新的數據庫。

SQLite documentation

Every :memory: database is distinct from every other. So, opening two database connections each with the filename ":memory:" will create two independent in-memory databases.

這是從磁盤上的數據庫中,創建具有相同的連接字符串建立多個連接意味着你要連接到一個數據庫中的不同。

一個過程就可以共享一個內存數據庫,如果你使用file::memory:?cache=shared URI:

conn = sqlite3.connect('file::memory:?cache=shared') 

但是這仍然是從另一處理無法訪問。

+0

感謝您的支持! – DDC

+0

即使「file :: memory:?cache = shared」也只允許單獨的數據庫連接共享相同的內存數據庫。但是,共享內存數據庫的所有數據庫連接都需要處於相同的過程中。 https://www.sqlite.org/inmemorydb.html – corretge

+2

@corretge:'file :: memory:?緩存=共享網址在我寫這篇文章前幾個月才被引入,我明白了。我添加了一個提到,但正如你所說,這在多個進程中不可用。 –

9

當然我@Martijn同意,因爲醫生說的話,但如果你是集中在類Unix系統,那麼您可以使用共享內存:

如果您在/dev/shm文件夾中創建文件,所有文件創建有直接映射到RAM,因此您可以使用從兩個不同的進程訪問相同的數據庫。

#/bin/bash 
rm -f /dev/shm/test.db 
time bash -c $' 
FILE=/dev/shm/test.db 
sqlite3 $FILE "create table if not exists tab(id int);" 
sqlite3 $FILE "insert into tab values (1),(2)" 
for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done; #inserts at most 2'000'000 records to db. 
sqlite3 $FILE "select count(*) from tab;"' 

花費那麼多的時間:

FILE=/dev/shm/test.db 
real 0m0.927s 
user 0m0.834s 
sys 0m0.092s 

至少2萬張唱片,做同樣的HDD上的需要(這是相同的命令,但FILE=/tmp/test.db):

FILE=/tmp/test.db 
real 0m2.309s 
user 0m0.871s 
sys 0m0.138s 

所以基本上這允許你從不同的進程訪問相同的數據庫(不會丟失r/w速度):

這裏是演示證明這就是我講的:

xterm -hold -e 'sqlite3 /dev/shm/testbin "create table tab(id int); insert into tab values (42),(1337);"' & 
xterm -hold -e 'sqlite3 /dev/shm/testbin "insert into tab values (43),(1338); select * from tab;"' & 
; 
+1

不要使用'/ dev/shm'本身,創建'tmpfs'的另一個實例,請參閱https://stackoverflow.com/a/42884337/846250 –

相關問題