2016-07-30 7 views
4

Ich versuche eine In-Memory-Datenbank mit sqlite3 in Python zu erstellen.Wie kann ich mit SQLite eine In-Memory-Datenbank erstellen?

Ich habe eine Funktion erstellt, um eine Datenbank-Datenbank-Datei zu erstellen und Informationen darin zu speichern, und das funktioniert 100%.

Aber versuchen, mit :memory: verbinden Ich habe einige Probleme konfrontiert.

Was ich tue, ist:

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. Namentabelle

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

    schaffen, die True

  2. einige Informationen zu dieser Tabelle einfügen zurück

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

    die

    no such table: name 
    False 
    

zurück Warum funktioniert das nicht? Es funktioniert, wenn ich eine Datei:

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

Warum die doppelte 'db.commit()' wenn Daten geändert werden? –

+0

@MartijnPieters Ohh, mein schlechtes Dankeschön. – Deounix

Antwort

5

Sie ein jedes Mal, wenn Sie die Funktion aufrufen neue Verbindung erstellen. Jeder Verbindungsaufruf erzeugt eine neue In-Memory-Datenbank.

Erstellen Sie die Verbindung außerhalb der Funktion, und in die Funktion übergeben, oder erstellen shared memory connection:

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

Allerdings wird die Datenbank gelöscht werden, wenn die letzte Verbindung aus dem Speicher gelöscht wird; In deinem Fall wird das jedes Mal, wenn die Funktion endet.

Anstatt db.commit() explizit aufrufen, verwenden Sie nur die Datenbankverbindung 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 

Die Transaktion automatisch verpflichtet ist, wenn es keine Ausnahme war, sonst zurückgerollt. Beachten Sie, dass das Übergeben einer Abfrage, die nur Daten liest, sicher ist.

+0

aber wenn ich Shared-Memory-Verbindung erstellen, ist diese Verbindung Fast als Speicherverbindung? – Deounix

+0

@Dounix: Es gibt keine Geschwindigkeitsdifferenz. –