Mysql Syntaxfehler

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Charger
User
Beiträge: 2
Registriert: Samstag 12. Dezember 2020, 19:04

Hallo,
wenn ich den Code unten ausführe kommt eine Fehlermeldung, (Zeile 11 ist die Ursache)
wer kann mir helfen?

Code: Alles auswählen

import mysql.connector

try:
    conn = mysql.connector.connect\
        (host='localhost',
        database='newbase',
        user='root',
        password='Nevada80#')

#Creating a cursor object using the cursor() method
cursor = conn.cursor()       ################ Zeile 11, Ursache für den Syntaxfehler  #########

#Dropping EMPLOYEE table if already exists.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

#Creating table as per requirement
sql ='''CREATE TABLE EMPLOYEE(
   FIRST_NAME CHAR(20) NOT NULL,
   LAST_NAME CHAR(20),
   AGE INT,
   SEX CHAR(1),
   INCOME FLOAT
)'''
cursor.execute(sql)

#Closing the connection
conn.close()
################
File "/home/cha......../testmy.py", line 11
cursor = conn.cursor()
^
SyntaxError: invalid syntax

Process finished with exit code 1
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Den abschließenden Backslash in Zeile 4 kannst du dir sparen. Das macht den Code füchterlich unleserlich. Wenn du da die öffnende Klammer hin setzt, dann weiß jeder: Alles klar, ist ein Funktionsaufruf. Wie du selbst ja eine Zeile weiter siehst, kann man in der Parameterliste nach den einzelnen Parametern einfach die Zeile umbrechen.



Und wo ein try ist, muss auch ein except sein.
Benutzeravatar
Dennis89
User
Beiträge: 1155
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

Zeile 11 und ff stehen nicht im gleichen Namensraum wie dein 'conn'.
Man hat übrigends keinen Vorteil wenn man Abkürzungen verwendet, eher den Nachteil dass der Code schlecht zu lesen ist.

Code: Alles auswählen

import mysql.connector as connector

try:
    connection = connector.connect(
    		host='localhost',
        	database='newbase',
        	user='root',
        	password='Wuerdeichnichtoeffentlichmachen!'
        	)

    cursor = connection.cursor(buffered=True)
    cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

    sql ='''CREATE TABLE EMPLOYEE(
   		FIRST_NAME CHAR(20) NOT NULL,
   		LAST_NAME CHAR(20),
   		AGE INT,
   		SEX CHAR(1),
   		INCOME FLOAT
		)'''
    cursor.execute(sql)
    connection.close()
except:
    print('Hier stimmt was nicht')
Habe gerade keine Möglichkeit den Code zu testen.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Dennis89 hat geschrieben: Dienstag 15. Dezember 2020, 23:01Zeile 11 und ff stehen nicht im gleichen Namensraum wie dein 'conn'.
@Dennis89: Bist du dir sicher, dass die nicht im selben Namensraum existieren? Aus der interaktiven Session:

Code: Alles auswählen

>>> try:
	text = "Hallo"
except:
	pass

>>> text
'Hallo'
Benutzeravatar
Dennis89
User
Beiträge: 1155
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen @sparrow
Ich hatte keine Möglichkeit zum testen, aber du kannst natürlich recht haben. Wenn der TE bis heute Abend nicht antwortet, versuche ich es mal.

Bei dieser kurzen Abfrage würde ich es schon sinnvoll finden, alles "unter" 'try' zu setzen oder gibt es Gründe die dagegen sprechen?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Dennis89: Ich wollte demonstrieren, dass ein try-Block keinen eigenen Namensraum hat. Module, Funktionen, Klassen und deren Instanzen: ja. Jeder Block: Nein.

Was in einen try-Block gehört, kann man pauschal nicht sagen. So viel wie nötig ist, um durch try/except die Ausnahme so zu verarbeiten, dass das Programm hinterher in einem kontrollierten Zustand ist.
Das tust du in deinem Codebeispiel nicht. Im Gegenteil. Du verschluckst die potentielle Fehlermeldungen und gibst stattdessen einen Text aus. Niemals(!) nackte Excepts verwenden, weil die auch Fehler schlucken, mit denen man nicht rechnet. Stattdessen nur die Fehler fangen, die man auch durch den folgenden Except-Block verarbeiten kann.

Und in diesem Fall: wenn man sowieso nichts tut um auf die Ausnahme zu reagieren, ist es besser komplett auf try/except zu verzichten. Dann eskaliert der Fehler nach oben, das Programm stoppt und man bekommt einen wunderschönen traceback mit Fehlermeldung statt eines generischen Fehlertextes, der einem nicht hilft.
Benutzeravatar
Dennis89
User
Beiträge: 1155
Registriert: Freitag 11. Dezember 2020, 15:13

@sparrow Danke für die Erklärung.

Werde es in Zukunft berücksichtigen.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten