2015-09-20 13 views
5

Tôi muốn kết hợp cơ sở dữ liệu SQLite và một số có thể nằm trong bộ nhớ. Tôi tạo cơ sở dữ liệu trong bộ nhớ bằng cách chỉ định đường dẫn cơ sở dữ liệu là :memory:. Theo sau this post, sử dụng tính năng attach của SQLite có vẻ giống như một cách tiếp cận đơn giản và hiệu quả. Nhưng làm cách nào tôi có thể chỉ định cơ sở dữ liệu trong bộ nhớ của mình làm nguồn để đính kèm?Làm cách nào để đính kèm cơ sở dữ liệu SQLite trong bộ nhớ bằng Python?

Ví dụ, tôi muốn làm một cái gì đó như:

c1 = sqlite3.connect(":memory:") 
c1.execute(...create table, insert a bunch, commit...) 

c2 = sqlite3.connect(":memory:") 
c2.execute(""" 
    ATTACH ? AS ToMerge; 
    BEGIN; 
    INSERT INTO Records SELECT * FROM ToMerge.Records; 
    COMMIT; 
""", (c1.get_attach_id(),)) 

nhưng, tất nhiên, c1.get_attach_id() là một phương pháp tôi đã thực hiện lên cho các mục đích trình diễn, kể từ khi sử dụng chuỗi :memory: sẽ là mơ hồ. Làm cách nào tôi có thể chỉ định cơ sở dữ liệu hiện tại c1?

Trả lời

12

Một chuỗi :memory: đồng bằng kết nối với cơ sở dữ liệu trong bộ nhớ không thể được chia sẻ hoặc đính kèm từ các kết nối khác.

Bạn cần sử dụng file:URI filename connection string với tham số ?cache=shared để có thể chia sẻ cơ sở dữ liệu trong bộ nhớ giữa các kết nối; thì bạn cũng có thể đính kèm vào nó:

# first connection 
c1 = sqlite3.connect("file::memory:?cache=shared") 

# second connection, to the *same database* 
c2 = sqlite3.connect("file::memory:?cache=shared") 

# third connection, to a different database altogether 
c3 = sqlite3.connect('/tmp/sqlite3.db') 
# can attach to the shared in-memory database 
c3.execute("ATTACH DATABASE 'file::memory:?cache=shared' AS inmem") 

Xem In-Memory Databases documentation.

Lưu ý rằng chỉ có thể là một cơ sở dữ liệu được chia sẻ trong bộ nhớ đó; tất cả các cơ sở dữ liệu trong bộ nhớ khác phải duy trì riêng tư đối với kết nối của chúng. Sử dụng cơ sở dữ liệu với một lưu trữ hệ thống tập tin thực tế nếu bạn cần thiết lập phức tạp hơn; những thứ này cũng đủ dễ dàng để dọn dẹp sau đó nếu bạn tạo chúng trong một tempfile.mkdtemp() temporary directory mỗi cái.

Demo:

>>> import sqlite3 
>>> c1 = sqlite3.connect("file::memory:?cache=shared") 
>>> c1.execute('CREATE TABLE foo (bar, baz)') 
<sqlite3.Cursor object at 0x106839490> 
>>> c1.execute("INSERT INTO foo VALUES ('spam', 'ham')") 
<sqlite3.Cursor object at 0x106839500> 
>>> c1.commit() 
>>> c2 = sqlite3.connect("file::memory:?cache=shared") 
>>> c2 = sqlite3.connect("file::memory:?cache=shared") 
>>> list(c2.execute('SELECT * FROM foo')) 
[(u'spam', u'ham')] 
>>> c3 = sqlite3.connect('/tmp/sqlite3.db') 
>>> c3.execute("ATTACH DATABASE 'file::memory:?cache=shared' AS inmem") 
<sqlite3.Cursor object at 0x1068395e0> 
>>> list(c3.execute('SELECT * FROM inmem.foo')) 
[(u'spam', u'ham')] 

Hỗ trợ cho các kết nối chia sẻ bộ nhớ cache trong bộ nhớ đã được thêm vào phiên bản SQLite 3.7.13; cho Python bạn có thể kiểm tra phiên bản của thư viện cơ bản với sqlite3.sqlite_version (string) hoặc sqlite3.sqlite_version_info (tuple với số nguyên):

>>> sqlite3.sqlite_version_info 
(3, 8, 10, 2) 
+0

đẹp giải thích và ví dụ. –

+0

Phần này không nói rằng DB trong bộ nhớ có thể được đặt tên và chia sẻ: https://www.sqlite.org/inmemorydb.html#sharedmemdb? – Djizeus

+0

@Djizeus: vâng, miễn là bạn sử dụng 'file :: memory:' URI, không phải là tên ': memory:' thuần túy. Đó là câu trả lời của tôi. –

Các vấn đề liên quan