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))