两个进程可以同时访问内存(:memory :) sqlite数据库吗?

时间:2013-03-30 16:16:39

标签: python 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

2 个答案:

答案 0 :(得分:20)

不,他们无法从不同的进程访问相同的内存数据库相反,与:memory: 的新连接始终会创建新的数据库。 / p>

来自SQLite documentation

  

每一个:内存:数据库彼此不同。因此,打开两个数据库连接,每个连接的文件名为“:memory:”,将创建两个独立的内存数据库。

这与磁盘数据库不同,其中使用相同的连接字符串创建多个连接意味着您将连接到一个数据库。

一个进程中,如果您使用file::memory:?cache=shared URI,则可以共享内存数据库:

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

但仍无法通过其他其他流程访问。

答案 1 :(得分:14)

当然我同意@Martijn,因为doc是这样说的,但是如果你专注于像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

至少200万条记录,在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;"' &
;