kann ich meine sqlite-Verbindung und der cursor in einer Funktion?
Ich dachte, ich würde versuchen, meine sqlite-db-Verbindung, einer Funktion anstelle von kopieren/einfügen ~6 Zeilen benötigt, um eine Verbindung herstellen und eine Abfrage ausführen, die alle über dem Platz.
Ich möchte, um es vielseitig, so kann ich mit der gleichen Funktion zum erstellen/auswählen/einfügen/etc...
Unten ist das, was ich versucht habe. Die 'EINFÜGEN' und 'CREATE TABLE' - Abfragen arbeiten, aber wenn ich einen "SELECT" - Abfrage, wie kann ich mit den Werten arbeiten, die es herunterlädt, außerhalb der Funktion?
Normalerweise würde ich gerne drucken Sie die Werte, die Sie ruft und tun auch andere Dinge mit Ihnen.
Wenn ich es wie unten bekomme ich eine Fehlermeldung
Traceback (most recent call last):
File "C:\Users\steini\Desktop\py\database\test3.py", line 15, in <module>
for row in connection('testdb45.db', "select * from users"):
ProgrammingError: Cannot operate on a closed database.
Also ich denke die Verbindung muss geöffnet sein, so kann ich die Werte aus dem cursor, aber ich brauche, um es zu schließen, damit die Datei nicht immer gesperrt.
Hier ist mein Test-code:
import sqlite3
def connection (db, arg, cubby):
conn = sqlite3.connect(db)
conn.execute('pragma foreign_keys = on')
cur = conn.cursor()
cur.execute(arg)
for row in cur:
cubby.append(row)
conn.commit()
conn.close()
cubby=[]
connection('testdb.db', "create table users ('user', 'email')", cubby)
connection('testdb.db', "insert into users ('user', 'email') values ('joey', 'foo@bar')", cubby)
for row in connection('testdb45.db', "select * from users", cubby):
print row
Wie kann ich diese Arbeit machen?
BEARBEITEN: verändert den code ein wenig, so dass die cur-Werte, so ist es angehängt, um eine externe Liste, aber immer noch ziemlich schlecht
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das problem ist ein wenig schwieriger als es auf den ersten Blick aussieht.
Sehen Sie die Fehler, weil Sie geschlossen haben, Ihre Verbindung zu der Datenbank in der "Verbindung" - Funktion.
Ihr wahrscheinlich besser dran, die Schaffung eines DatabaseManagement-Klasse zur Verwaltung einer einzelnen Verbindung.
Etwas wie:
Dann sollten Sie in der Lage sein, etwas zu tun:
Diese halten die Verbindung offen für die Dauer des Vorhandenseins des Objekts.
Können Sie immer noch finden, das ist ein tieferes problem, aber spielen Sie herum und sehen, was für Sie arbeitet.
Es fehlschlägt, weil Ihre Funktion schließt die Verbindung vor der Rückkehr. Die Art und Weise, dies zu beheben ist, schalten Sie die Funktion in einen generator, der geht auf die Ergebnisse. So etwas wie die folgenden ungetesteten code sollte funktionieren:
Müssen Sie besonders vorsichtig sein, zu konsumieren, alle Zeilen, die beim aufrufen dieser Funktion, denn wenn nicht, dann wird die Verbindung nicht geschlossen werden. Sie könnten in der Lage sein, um dieses problem zu vermeiden, indem Sie suchen, bei der Umsetzung der notwendigen Funktionen für die
with
syntax.