2017-05-12 8 views
0

Ich versuche, eine In-Memory-SQLite3-Datenbank mit Twisted twisted.enterprise.adbapi.ConnectionPool Klasse zu erstellen. Mein Testfall ist wie folgt:Warum existiert meine sqlite3 In-Memory-Tabelle nicht nach dem Ausführen einer CREATE-Abfrage?

#! /usr/bin/env python 
from twisted.internet import task 
from twisted.internet import defer 
from twisted.enterprise.adbapi import ConnectionPool 

sql_init = (
    "CREATE TABLE ajxp_index (node_id INTEGER PRIMARY KEY AUTOINCREMENT);", 
    "INSERT INTO ajxp_index (node_id) VALUES (9001);", 
) 


@task.react 
@defer.inlineCallbacks 
def main(reactor): 
    cp = ConnectionPool("sqlite3", ":memory:", check_same_thread=False) 
    for sql in sql_init: 
     print(sql) 
     yield cp.runQuery(sql) 

Sie das Skript auszuführen erzeugt die folgenden Fehler: sqlite3.OperationalError: no such table: ajxp_index

Wo die Dinge seltsam bekommen, wenn wir :memory: mit einem Pfad zu einer Datei auf persistenten Speicher zu ersetzen, zum Beispiel: /tmp/foo.sqlite. Unter dieser Bedingung wird das Skript wie erwartet ausgeführt.

Weiteren die gleichen SQL-Abfragen mit dem sqlite3 Modul in der Standardbibliothek läuft läuft wie erwartet:

import sqlite3 

conn = sqlite3.connect(":memory:") 
for sql in sql_init: # same commands as in above example 
    conn.execute(sql) 

Was soll das? Ist das ein Fehler in Twisted oder mache ich etwas falsch?

EDIT:

Gemäß Vorschlag des notorious.no, ich habe mein Beispiel aktualisiert cp.runInteraction zu verwenden, aber das Ergebnis bleibt das gleiche:

@task.react 
@defer.inlineCallbacks 
def main(reactor): 
    cp = ConnectionPool("sqlite3", ":memory:", check_same_thread=False) 
    for sql in sql_init: 
     print(sql) 
     yield cp.runInteraction(lambda cursor: cursor.execute(sql)) 

EDIT 2

Okay, das scheint zu arbeiten:

def _interact(cursor, script): 
    cursor.executescript(script) 


@task.react 
@defer.inlineCallbacks 
def main(reactor): 
    cp = ConnectionPool("sqlite3", ":memory:", check_same_thread=False) 
    yield cp.runInteraction(_interact, "\n".join(sql_init)) 

Antwort

Verwandte Themen