sqlite3 Syntax Fehler near FROM

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
cheers
User
Beiträge: 18
Registriert: Samstag 31. Juli 2021, 08:53
Wohnort: Deutschland

Moin, die Python grundsachen gehen mittlerweile ganz gut in Sachen Programmierung, womit ich mir immernoch schwer tue, ist auf Datenbanken zuzugreifen und mit diesen Daten zu arbeiten. Ich habe mir jetzt eine Dummydatenbank genommen, diese hier: https://www.sqlitetutorial.net/wp-conte ... hinook.zip
und versuche mir die Daten jetzt einfach erstmal anzeigen zu lassen. Leider hat er irgendeinen Syntaxfehler in der Nähe vom "FROM"
"!next
sqlite3.OperationalError: near "FROM": syntax error"

Ich hab mir jetzt mehrmals auch die Kategorienamen angesehen, dass ich ja keinen Tippfehler habe, aber ich finde das Problem einfach nicht. Davon ab, habt ihr noch tipps wie ich das mit den Datenbanken einfacher verstanden bekomme? also im Sinne der Datenverarbeitung und dem Zugriff darauf? z.b. man will nur Spalten einer bestimmten ID und die dann zusammenzählen lassen oder sowas... wenn ich mir überlege, wie ich das schreiben müsste, dass er das macht, verknote ich mir den Kopf dabei ^^

Code: Alles auswählen

import os
import sys
import sqlite3

try:
    verbindung = sqlite3.connect(r"c:/Users/Mir/Desktop/chinook.db")
    cursor = verbindung.cursor()
    print("Datenbank verbindung steht")

except sqlite3.Error as error:
    print("Es gab ein Problem beim Verbindungsaufbau")
    
#datenbank verbindnug muss geschlossen werden#

cursor = verbindung.cursor()
for row in cursor.execute("SELECT AlbumId, Title, ArtistId, FROM albums"):
    print("AlbumId", row[1])
    print("Title", row[2])
    print("ArtistId", row[3])
cursor.commit
cursor.close
    
:arrow: Viele Grüße und allen eine gute Zeit! :)
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Vermutung meinerseits: Das Komma vor dem "FROM" ist überflüssig ...
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Vermutung stimmt. Und ist doch auch leicht überprüfbar, warum nicht mal ausprobieren?

Es gibt aber noch vieles mehr:

Die Fehlerbehandlung ist komplett wertlos. Du fängst eine Fehler ab, aber machst dann weiter, als ob nix wäre. Da ist nichts machen klüger. Es fehlen Klammern bei commit und close, womit auch die ineffektiv sind. Keine Funktionen heißt, dass du mit globalen Variablen arbeitest. os und sys sind importiert, aber werden nicht genutzt.
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzend: Da wird zweimal ein `Cursor`-Objekt abgefragt, aber nur eines davon wird benutzt.

Das schliessen von Verbindung und Cursor würde ich mit ``with`` und `contextlib.closing()` machen.

Indexe fangen bei Python bei 0 an — ``row[3]`` gibt es nicht → `IndexError`. Man würde da auch besser die Werte gleich im Kopf der ``for``-Schleife an sprechende Namen binden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
import sqlite3
from contextlib import closing


def main():
    with closing(
        sqlite3.connect("c:/Users/Mir/Desktop/chinook.db")
    ) as connection:
        with closing(connection.cursor()) as cursor:
            cursor.execute("SELECT AlbumId, Title, ArtistId FROM albums")
            for album_id, title, artist_id in cursor.fetchall():
                print("AlbumId", album_id)
                print("Title", title)
                print("ArtistId", artist_id)
            cursor.commit()


if __name__ == "__main__":
    main()
Edit: Das man über den Cursor iterieren kann ist nicht DB API V2, das ist also nicht portabel zu anderen DB-Modulen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
cheers
User
Beiträge: 18
Registriert: Samstag 31. Juli 2021, 08:53
Wohnort: Deutschland

ok die Syntax mit dem Komma vor dem FROM habe ich aus einer "Tutorial Website" wo genau das behandelt wird, und es steht auch so da, nagut, ich hab verschiedene probiert, aber dieses habe ich natürlich nicht getestet.
OS und SYS werden nicht benutzt weil es ja nur ein teilausschnitt ist, und nicht komplett, die werden später noch zum Einsatz kommen. Bei der try-Geschichte wollte ich nochmal nach einem Abbruchkriterium schauen, ich glaub man kann das dann mit "finally" machen, das will ich aber noch mal nachlesen. Das Datenbank schließen war für mich ein Erinnerungsmarker dass ich die Verbindung schließen muss, wenn ich sie nicht mehr brauche. Bei den beiden cursor Verbindungen muss ich tatsächlich nochmal drüberschauen, die hab ich in der Funktion noch nicht so ganz verstanden, so wie es bisher verstehe, sind das "Marker" mit denen ich aus der Datenbank Daten rausziehen oder bearbeiten kann.
:arrow: Viele Grüße und allen eine gute Zeit! :)
cheers
User
Beiträge: 18
Registriert: Samstag 31. Juli 2021, 08:53
Wohnort: Deutschland

Und Danke für das Code beispiel, das werde ich mit in die Überlegungen einfließen lassen, wie ich es besser machen kann (y)
:arrow: Viele Grüße und allen eine gute Zeit! :)
Antworten