OperationalError "no such table: vocabulary"

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hallo Alle,

ich bin neu hier im Forum und habe ein kleines Problem. Undzwar bin ich Anfänger in der Python Programmierung und will durch das programmieren eines Vokabel-Programms meine Kenntnisse erweitern.
Leider bin ich schon ziehmlich am Anfang hängen geblieben: Ich will zum einen eine Datenbank mit der Tabelle vocabulary und zum anderen Daten in die Datenbank schreiben.
Der Code zum erstellen der Datenbank:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import sqlite3 
def new_table():
    connection = sqlite3.connect("vocabulary1.db")

    cursor = connection.cursor()
    connection.commit()

    cursor.execute("""CREATE TABLE vocabulary (frontside TEXT, backside TEXT, date INTEGER, layer INTEGER )""")
    
    new_table()
Und der Code zum füllen der Datenbank:

Code: Alles auswählen

# -*- coding: utf-8 -*-

def new_vok(frontside,  backside,  date):
    import sqlite3 
    con = sqlite3.connect('vocabulary1.db')
    cursor = con.cursor()
    con.commit()

    [color=red]cursor.execute("""INSERT INTO vocabulary VALUES ('go', 'gehen', 2, 1)""")[/color] 
In der letzten Zeile kommt die Meldung "OperationalError"no such table: vocabulary"". Ich habe schon alles mögliche probiert aber schaffe es nicht, da ich nicht verstehe weshalb es die Tabelle nicht geben sollte.

Ich hoffe mir kann jemand weiterhelfen!

MfG Jonny
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

In "new_table" fehlen am Ende ein commit und ein close.

Das commit in new_vok gehört hinter das execute. Allgemein sieht die Funktion etwas seltsam aus, da du sqlite in jedem Aufruf importierst und jedes mal eine neue Datenbankverbindung aufbaust.
Das Leben ist wie ein Tennisball.
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hmmm Danke EyDu für deine schnelle Antwort, leider hat es nicht geklappt ---> gleiche Fehlermeldung. Ach ja und der code sieht so ... aus, weil ich aus verzweiflung alles möglicge ausprobiert hab. Wenns funktioniert werd ich nochma bisle "aufräumen".

Hat noch jemand ne Idee?

Liebe Grüße
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bist Du Dir auch sicher, dass die Tabelle wirklich angelegt wurde? Prüf das doch einfach mit einer SQLite-Shell aus, wie z.B. dieser hier:
http://code.google.com/p/sqlite-manager/

Einfach zu installieren, falls Du nen Firefox auf Deinem System hast.

Wenn dem nicht so ist, leg die Tabelle doch einfach erst einmal mit dem Manager an und prüfe, ob Du überhaupt etwas reinschreiben kannst.

Wenn das dann klappt, kümmerst Du Dich noch einmal um das Anlegen. (Wobei dort das commit() auch hinter das execute gehört ...)
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Also laut dem Manager wurde keine Tabelle angelegt. Lustiger Weise zeigt er die gleiche Fehlermeldung an, wenn ich die Tabelle mit dem Manager erstelle -> "no such table: vocabulary"

Ich bin echt verwirrt...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kannst Du denn eine neue Datenbank anlegen und in dieser dann über den Manager eine Tabelle erstellen?

Und dann per Python auf diese DB lesend zugreifen?

Mach doch erst einmal so weiter. Evtl. ist Das Anlegen deiner DB irgend wie schon schief gelaufen!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Jonny!

Willkommen im Python-Forum! :-)

Probiere doch mal diesen Code aus http://www.python-forum.de/topic-11615.html und lies dir die Kommentare genau durch. Vielleicht findest du dich dann etwas besser mit SQLite zurecht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Vielen Dank Gerold!
Ich habe mir deinen Code genau angeguckt und einen ähnlichen für meine Zwecke erstellt. Es funktioniert, War übriegens sehr schön erklärt und übersichtlich! Danke für die schnelle Hilfe an alle!

Mfg Jonny
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Noch ein Tipp: Gewöhne dich von Anfang an daran, die Werte für INSERT usw. immer als Parameter und nie direkt anzugeben. Das vermeidet Probleme mit Werten, die besondere Zeichen enthalten und im Falle von Webanwendungen die gerade bei PHP so beliebten SQL-Injection-Fehler.

Code: Alles auswählen

con = sqlite3.connect('/tmp/vocabulary1.db') 
cursor = con.cursor() 
cursor.execute("INSERT INTO vocabulary VALUES (?, ?, ?, ?)", ['go', 'gehen', 2, 1]);
cursor.close()
con.commit()
con.close()
Stefan
N2Ndesign
User
Beiträge: 5
Registriert: Dienstag 21. August 2012, 15:07

Probiere doch mal diesen Code aus http://www.python-forum.de/topic-11615.html und lies dir die Kommentare genau durch. Vielleicht findest du dich dann etwas besser mit SQLite zurecht.
404 :(

Ich hab grad dasselbe Problem, gibt es vergleichbare Threads oder Sites?

Danke!

Grüße
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du musst den Link anpassen: http://www.python-forum.de/viewtopic.php?t=11615

Einfach mal bei so etwas gucken, wie die aktuelle URL so aussieht und dann "einsetzen" ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten