Seite 1 von 1

Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 00:33
von gomez72
Hallo Leute, ich komme einfach nicht weiter.
Ich möchte lediglich eine Datenbank Zeile einer MySQL Tabelle auslesen und das Datum darin formatiert ausgeben.

so funktioniert mein Code, hat aber nicht das gewünschte Ergebnis:

Code: Alles auswählen

    
def get_seeding_process_by_id(self, seed_id):
	cursor = self.db.cursor(dictionary=True)
        cursor.execute("SELECT seeding_process.ID AS ID, seeding_date, planting_date, harvesting_date, "
                       "fertilize_first_after_seeding, "
                       "quantity_vegetables, personal_records, plant_ID, user_ID from seeding_process "
                       "where ID = '%s'" % str(seed_id))
        return cursor.fetchone()
        
eignetlich hätte ich es gerne so germacht, aber das funktioniert auch nicht:

Code: Alles auswählen

    
def get_seeding_process_by_id(self, seed_id):
	cursor = self.db.cursor(dictionary=True)
        cursor.execute("SELECT seeding_process.ID AS ID, DATE_FORMAT(seeding_date, '%d.%m.Y%), planting_date, harvesting_date, "
                       "fertilize_first_after_seeding, "
                       "quantity_vegetables, personal_records, plant_ID, user_ID from seeding_process "
                       "where ID = '%s'" % str(seed_id))
        return cursor.fetchone()
        
die IDE meckert wegen ADD Format specifier character

ich kann die Rätsels Lösung aber einfach nicht finden.
Hat jemand erbarmen ?
VG

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 06:24
von Sirius3
Man formatiert keine Variablen in SQL-Ausdrücke, sondern benutzt Platzhalter. Eingerückt wird mit 4 Leerzeichen pro Ebene, keine Tabs.
Du benutzt % zum Formatieren Deines Parameters und für die Formatangabe des Datums. Wie soll Python wissen, für was welches % steht?
Befolgt Du meinen ersten Satz, hast Du auch kein Problem mehr.

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 15:06
von diablo75
Ich mach es immer so:

Code: Alles auswählen

self.sqltext = """SELECT VERTRAGSPERSON.Polizzennr from VERTRAGSPERSON WHERE Personennr = '"""+ personennummer + """' AND VERTRAGSPERSON.VtgRolleCd = 'VN'"""
        try:
                conn = sqlite3.connect('verstest.db')
                c = conn.cursor()
            
                c.execute(self.sqltext)
                records = c.fetchall()

                return records  
                
        except sqlite3.OperationalError as e:
            print('Fehler in SQL (sqlite3) Abfrage: 05 ' + e.args[0])

        finally:
            conn.close()

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 15:12
von pillmuncher
diablo75 hat geschrieben: Donnerstag 4. November 2021, 15:06 Ich mach es immer so:

Code: Alles auswählen

self.sqltext = """SELECT VERTRAGSPERSON.Polizzennr from VERTRAGSPERSON WHERE Personennr = '"""+ personennummer + """' AND VERTRAGSPERSON.VtgRolleCd = 'VN'"""
Wunderbar!

Du hast eine Möglichkeit gefunden, die noch schlechter ist.

Gratulation.


Bild

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 15:23
von diablo75
pillmuncher hat geschrieben: Donnerstag 4. November 2021, 15:12
diablo75 hat geschrieben: Donnerstag 4. November 2021, 15:06 Ich mach es immer so:

Code: Alles auswählen

self.sqltext = """SELECT VERTRAGSPERSON.Polizzennr from VERTRAGSPERSON WHERE Personennr = '"""+ personennummer + """' AND VERTRAGSPERSON.VtgRolleCd = 'VN'"""
Wunderbar!

Du hast eine Möglichkeit gefunden, die noch schlechter ist.

Gratulation.


Bild
Er wollte wohl eher Codebeispiele und keine blöden Kommentare

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 15:34
von __deets__
Ich denke nicht, dass er wollte, dass das Codebeispiel scheunentorgrosse Sicherheitslücken reißt. Darum ist der Kommentar nicht blöd, sondern akkurat.

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 15:35
von pillmuncher
Wenn du keine "blöden Kommentare" willst, dann poste keinen blöden Code. Es gibt die Diskussion um SQL Injection seit 1998. Inzwischen sollte sich herumgesprochen haben, dass es die gibt, dass sie gefährlich ist, und auch wie man sie vermeidet.

https://en.wikipedia.org/wiki/SQL_injection

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 15:48
von pillmuncher
@diablo75: Nachtrag:

Code: Alles auswählen

>>> personennummer = input('Bitte Personennr eingeben: ')
Bitte Personennr eingeben: 123'; drop table VERTRAGSPERSON; --
>>> personennummer
"123'; drop table VERTRAGSPERSON; --"
>>> sqltext = """SELECT VERTRAGSPERSON.Polizzennr from VERTRAGSPERSON WHERE Personennr = '"""+ personennummer + """' AND VERTRAGSPERSON.VtgRolleCd = 'VN'"""
>>> sqltext
"SELECT VERTRAGSPERSON.Polizzennr from VERTRAGSPERSON WHERE Personennr = '123'; drop table VERTRAGSPERSON; --' AND VERTRAGSPERSON.VtgRolleCd = 'VN'"

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 16:16
von DeaD_EyE

Code: Alles auswählen

query = "SELECT VERTRAGSPERSON.Polizzennr from VERTRAGSPERSON WHERE Personennr = ? AND VERTRAGSPERSON.VtgRolleCd = ?"

conn = sqlite3.connect('verstest.db')
cursor = conn.cursor()

for row in cursor.execute(query, [123, "VN"]):
    print(row)
https://docs.python.org/3/library/sqlit ... or.execute

cursor.execute hat ein zweites optionales Argument für Werte, die Fragezeichen ersetzen sollen.
Der Vorteil: gültige SQL-Statements in den Werten werden nicht ausgeführt, sondern extra gefiltert.

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Donnerstag 4. November 2021, 17:28
von Sirius3
Da wir hier in die falsche Datenbank abgebogen sind, hier mal für den Code des OP:

Code: Alles auswählen

def get_seeding_process_by_id(self, seed_id):
    cursor = self.db.cursor(dictionary=True)
    cursor.execute("SELECT ID, DATE_FORMAT(seeding_date, '%d.%m.%Y'), planting_date, harvesting_date, "
                   "fertilize_first_after_seeding, quantity_vegetables, personal_records, plant_ID, user_ID"
                   "from seeding_process where ID = %s", [seed_id])
    return cursor.fetchone()
Wobei man die Datumsformatierung am besten bei der Ausgabe in Python macht.

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Freitag 5. November 2021, 09:25
von diablo75
Ok dann Entschuldige ich mich für meinen Kommentar. In keinem Tutorial das ich online gelesen habe oder Video wird auf solch eine Problematik hingewiesen.

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Freitag 5. November 2021, 09:27
von __deets__
Dann solltest du diese Tutorials oder Videos vermeiden, oder zumindest sehr kritisch betrachten. Denn wer weiß was die sonst noch so verbocken.

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Freitag 5. November 2021, 12:49
von DeaD_EyE
diablo75 hat geschrieben: Freitag 5. November 2021, 09:25 Ok dann Entschuldige ich mich für meinen Kommentar. In keinem Tutorial das ich online gelesen habe oder Video wird auf solch eine Problematik hingewiesen.
Von diesen "Tutorials" gibt es leider ganz viele.

Re: Formatierte Select abfrage funktioniert nicht

Verfasst: Samstag 6. November 2021, 00:50
von gomez72
Sirius3 hat geschrieben: Donnerstag 4. November 2021, 17:28 Da wir hier in die falsche Datenbank abgebogen sind, hier mal für den Code des OP:

Code: Alles auswählen

def get_seeding_process_by_id(self, seed_id):
    cursor = self.db.cursor(dictionary=True)
    cursor.execute("SELECT ID, DATE_FORMAT(seeding_date, '%d.%m.%Y'), planting_date, harvesting_date, "
                   "fertilize_first_after_seeding, quantity_vegetables, personal_records, plant_ID, user_ID"
                   "from seeding_process where ID = %s", [seed_id])
    return cursor.fetchone()
Wobei man die Datumsformatierung am besten bei der Ausgabe in Python macht.
Danke das ist eine Hilfe. Ja die Formatierung in Python liegt mir auch nahe, aber in dem Fall will ich ein komplettes Datenbank Objekt einem Modul übergeben, dass eine Tabelle ausgibt (tabulate). Da wollte ich nicht dazwischen rumfummeln müssen und dachte, das mache ich vorher in der Datenbank.