2011-04-29 90 views
8

是否可以將我的內存中的sqlite數據庫保存到硬盤上? 如果可能的話,一些python代碼會很棒。python保存在內存中sqlite

在此先感謝。

編輯:

我用APSW成功這個任務。它像一個魅力。感謝您的貢獻。

+1

你的意思是在'創建DB:內存:',然後用它的工作,並將其保存到磁盤?這會給你什麼,而不是隻是在磁盤上創建它? – 2011-04-29 11:53:01

+0

@Shansai:除了感謝,(1)接受答案(2)upvote它。 – 2011-05-08 02:08:42

回答

2

打開一個基於磁盤的數據庫,並將所有內容從一個複製到另一個。

+0

你可以提供一些python代碼嗎? – Shansal 2011-05-04 08:01:33

6

是的。在創建到數據庫的連接時,請將:memory:替換爲要保存數據庫的路徑。

sqlite使用基於文件的數據庫的緩存,所以這應該不會太慢。

9

(披露:我是APSW作者)

比較安全的方法,使數據庫的二進制副本是使用備份API是SQLite的的一部分,由APSW曝光。這對於排序,鎖定和併發來說是正確的。

要製作數據庫的SQL(文本)副本,請使用包含非常完整的.dump實現的APSW外殼。您可以使用cursor.execute()將SQL轉換回數據庫。

在最近的平臺上,當操作系統維護一個文件系統緩存時,您不太可能在內存數據庫和磁盤之間看到很多差異(假設您爲磁盤啓用日記功能)。像Windows XP這樣的老式操作系統的默認配置只有10MB的內存用於文件緩存,不管你擁有多少內存。

3

sqlite3 python documentation,您可以使用iterdump()方法,讓您在內存數據庫的.sql文件轉儲,然後是微不足道的是.sql文件應用到新的SQLite數據庫文件。

# Convert file existing_db.db to SQL dump file dump.sql 
import sqlite3, os 

con = sqlite3.connect('existing_db.db') 
with open('dump.sql', 'w') as f: 
    for line in con.iterdump(): 
     f.write('%s\n' % line) 
0
import apsw 

memconn = apsw.Connection(":memory:") 
memcursor = memconn.cursor() 
memcursor.execute("create table foo(x,y,z)") 
memcursor.execute("insert into foo values(?,?,?)", (1, 1.1, None)) 

thediskconn = apsw.Connection("adisk.db") 
with thediskconn.backup("main", memconn, "main") as backup: 
    backup.step() # copy whole database in one go 

memcursor.close() 
memconn.close() 
#continue with thediskconn