内存数据库的SQLite文档(https://www.sqlite.org/inmemorydb.html)表明要共享:内存:跨连接,你应该使用URI命名并设置cache = shared,就像这样(C API):
rc = sqlite3_open("file::memory:?cache=shared", &db);
我从Python 2.7.14尝试了这个,具有以下属性:
>>> sqlite3.version
'2.6.0'
>>> sqlite3.apilevel
'2.0'
>>> sqlite3.sqlite_version
'3.20.1'
我发现数据库并不像我预期的那样短暂。这是一个会议。
首先,创建一个数据库并插入一行......
% python
Python 2.7.14 |Anaconda, Inc.| (default, Dec 7 2017, 17:05:42)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.Connection("file::memory:?cache=shared")
>>> curs = conn.cursor()
>>> curs.execute("select * from sqlite_master").fetchall()
[]
>>> curs.execute("create table XYZ (x int, y int, z varchar)")
<sqlite3.Cursor object at 0x7ff4b2a06110>
>>> curs.execute("insert into XYZ values (?, ?, ?)", (1, 2, '3'))
<sqlite3.Cursor object at 0x7ff4b2a06110>
>>> curs.execute("select * from sqlite_master").fetchall()
[(u'table', u'XYZ', u'XYZ', 2, u'CREATE TABLE XYZ (x int, y int, z varchar)')]
>>> curs.execute("select * from XYZ").fetchall()
[(1, 2, u'3')]
>>> conn.close()
>>>
看这里,剩下的文件是:
% ls -l file*
-rw-r--r-- 1 skip skip 8192 Jan 22 12:49 file::memory:?cache=shared
似乎会议中遗留了一些内容:
% strings -a file*
SQLite format 3
atableXYZXYZ
CREATE TABLE XYZ (x int, y int, z varchar)
确实,我可以打开它。虽然它似乎是空的(我没有在第一个会话中明确地commit(),所以也许这就是为什么),数据库仍然存在并且accessibe:
% python
Python 2.7.14 |Anaconda, Inc.| (default, Dec 7 2017, 17:05:42)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.Connection("file::memory:?cache=shared")
>>> curs = conn.cursor()
>>> curs.execute("select * from XYZ").fetchall()
[]
>>> curs.execute("select * from sqlite_master").fetchall()
[(u'table', u'XYZ', u'XYZ', 2, u'CREATE TABLE XYZ (x int, y int, z varchar)')]
当我第一次看到表格&#34; file :: memory?cache = shared&#34;时,我觉得它看起来很奇怪。它是否应该更像是&#34; file://:memory:?cache = shared&#34;?我试过了,收到了一个错误。尽管如此,虽然记录的名称有效,但它清楚地将文件写入文件系统。我早些时候意外地发现了这一点,当时我注意到它与普通的旧版本相比有多慢:&#34;:内存:&#34;以及生成的文件有多大。不幸的是,这些文件被写入NFS挂载的文件系统,这可能解释了很多缓慢的问题。
有没有办法保证可以在同一进程中从多个连接访问的内存数据库?
答案 0 :(得分:0)
使用共享缓存模式打开内存数据库需要URI filename。你的Python版本不支持这个;它总是将整个字符串视为文件名。
Python 3.4及更高版本支持URI文件名:
db = sqlite3.connect("file::memory:?cache=shared", uri=True)