2016-07-30 52 views
4

我正嘗試在Python中使用sqlite3創建內存數據庫。如何使用sqlite創建內存數據庫?

我創建了一個函數來創建一個數據庫數據庫文件並存儲信息到它並且工作100%。

但試圖連接:memory:我遇到了一些問題。

我在做什麼是:

import sqlite3 

def execute_db(*args): 
    db = sqlite3.connect(":memory:") 
    cur = db.cursor() 
    data = True 
    try: 
     args = list(args) 
     args[0] = args[0].replace("%s", "?").replace(" update "," `update` ") 
     args = tuple(args) 
     cur.execute(*args) 
     arg = args[0].split()[0].lower() 
     if arg in ["update", "insert", "delete", "create"]: db.commit() 
    except Exception as why: 
     print why 
     data = False 
     db.rollback() 
    db.commit() 
    db.close() 
    return data 
  1. 創建名稱表

    execute_db("create table name(name text)") 
    

    其返回True

  2. 插入一些信息,該表

    這回

    no such table: name 
    False 
    

execute_db("insert into name values('Hello')") 

爲什麼不工作的呢?它的工作原理,當我使用一個文件:

db = sqlite3.connect("sqlite3.db") 
+0

爲什麼在更改數據時雙'db.commit()'? –

+0

@MartijnPieters哦,我的謝謝你。 – Deounix

回答

5

創建的每個調用該函數的時間連接。每個連接調用都會生成一個新的內存數據庫

創建功能的外部的連接,並把它傳遞到函數,或者創建一個shared memory connection

db = sqlite3.connect("file::memory:?cache=shared") 

然而,數據庫將被擦除最後連接被從內存中刪除;在你的情況下,這將是每次功能結束。

而不是顯式調用db.commit(),只需要使用數據庫連接as a context manager

try: 
    with db: 
     cur = db.cursor() 
     # massage `args` as needed 
     cur.execute(*args) 
     return True 
except Exception as why: 
    return False 

如果沒有例外的自動提交事務,回滾否則。請注意,提交只讀取數據的查詢是安全的。

+0

但如果我創建共享內存連接是此連接快速作爲內存連接? – Deounix

+0

@Deounix:沒有速度差異。 –

相關問題