SQlite3 - Verbindungsobjekt bzw. Cursor in Funktion

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hi mcdaniels,

habe deine Funktionen mal ausprobiert und es funktioniert doch eher suboptimal (ich hoffe du bist mit IPython vertraut):

Code: Alles auswählen

In [2]: conn = db_connect(':memory:')

In [3]: db_add_entry()
Name: bla
Kommentar: blub
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/home/gerrit/<ipython-input-3-2f82cd18e3da> in <module>()
----> 1 db_add_entry()

/home/gerrit/<string> in db_add_entry()

NameError: global name 'db_connection' is not defined

In [4]: db_connection = db_connect(':memory:')

In [5]: db_add_entry()
Name: bla
Kommentar: blub
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
/home/gerrit/<ipython-input-5-2f82cd18e3da> in <module>()
----> 1 db_add_entry()

/home/gerrit/<string> in db_add_entry()

OperationalError: no such table: guestbook

In [6]: db_create()

In [7]: db_add_entry()
Name: bla
Kommentar: blub

In [8]: db_add_entry()
Name: foo
Kommentar: flub
---------------------------------------------------------------------------
ProgrammingError                          Traceback (most recent call last)
/home/gerrit/<ipython-input-8-2f82cd18e3da> in <module>()
----> 1 db_add_entry()

/home/gerrit/<string> in db_add_entry()

ProgrammingError: Cannot operate on a closed database.
Wie hier schon mehrmals erwähnt solltest du das "Connections Objekt" als Parameter übergeben. Auch kannst du die Datenbank auch nicht einfach in einer Funktion schließen, da das zu ungewollten Seiteneffekten führt. Hier mal deine Funktion etwas abgewandelt:

Code: Alles auswählen

def db_add_entry(conn):
    db_action = conn.cursor()
    db_action.execute('INSERT INTO guestbook VALUES(?,?)', (raw_input("Name: "), raw_input("Kommentar: ")))
    conn.commit()
Grüße
Gerrit
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo,
nein IPython hab ich selbst noch nicht angewendet.

Betreffend das Connection Objekt als Parameter übergeben, sollte das doch so aussehen oder:

Code: Alles auswählen

def db_add_entry(db_connection):
    db_action = db_connection.cursor()
    db_action.execute('INSERT INTO guestbook VALUES(?,?)',
                      (raw_input("Name: "), raw_input("Kommentar: ")))
    db_connection.commit()
    

db_connection = db_connect("c:/guestbook.db")
db_connection = <sqlite3.Connection object at 0x0206F0B0>

Dann muss ich die Funktion aber so aufrufen:

Code: Alles auswählen

db_add_entry(db_connection)
damit es funktioniert.

@gkuhl: Kann es sein, dass es bei deinem Versuch daran scheitert, dass bei dir das Connection-Objekt nicht db_connection heisst, sondern nur conn du dann aber mein Programm verwendest in dem auf "db_connection" zugegriffen wird?

Könnte man den Cursor auch ausserhalb der Funktionen als globale Variable erstellen, oder gilt: Je weniger globale Variablen, desto besser?




LG
Daniel
Antworten