2014-02-23 128 views
3

在我的服務器中,我試圖從一堆sqlite3數據庫(從Web客戶端發送)中讀取並處理它們的數據。數據庫文件在S3存儲桶中,我有他們的網址,我可以在內存中打開它們。從sqlite3遠程數據庫中讀取

現在的問題是sqlite3.connect只需要一個絕對路徑字符串,我不能傳遞給它在內存中的文件。

conn=sqlite3.connect() #how to pass file in memory or url 
c=conn.cursor() 
c.execute('''select * from data;''') 
res=c.fetchall() 
# other processing with res 
+2

爲什麼你有一個* remote * SQLite數據庫?這遠遠超出了嵌入的範圍。 – Makoto

回答

7

的SQLite 需要數據庫文件存儲在磁盤上(它使用各種鎖和分頁技術)。內存中的文件是不夠的。

我會創建一個臨時目錄來保存數據庫文件,將其寫入該目錄,然後然後連接到它。該目錄還爲SQLite提供了寫入提交日誌的空間。

爲了處理這一切,上下文管理器可能會有所幫助:

import os.path 
import shutil 
import sqlite3 
import sys 
import tempfile 

from contextlib import contextmanager 


@contextmanager 
def sqlite_database(inmemory_data): 
    path = tempfile.mkdtemp() 
    with open(os.path.join(path, 'sqlite.db'), 'wb') as dbfile: 
     dbfile.write(inmemory_data) 
    conn = None 
    try: 
     conn = sqlite3.connect(os.path.join(path, 'sqlite.db')) 
     yield conn 
    finally: 
     if conn is not None: 
      conn.close() 
     try: 
      shutil.rmtree(path) 
     except IOError: 
      sys.stderr.write('Failed to clean up temp dir {}'.format(path)) 

和使用,作爲:

with sqlite_database(yourdata) as connection: 
    # query the database 

這在內存中的數據寫入到磁盤,打開一個連接,可以讓你使用該連接,之後清理。