Formatierte Select abfrage funktioniert nicht

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

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
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

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()
Benutzeravatar
pillmuncher
User
Beiträge: 1511
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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
In specifications, Murphy's Law supersedes Ohm's.
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke nicht, dass er wollte, dass das Codebeispiel scheunentorgrosse Sicherheitslücken reißt. Darum ist der Kommentar nicht blöd, sondern akkurat.
Benutzeravatar
pillmuncher
User
Beiträge: 1511
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
pillmuncher
User
Beiträge: 1511
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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'"
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1121
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann solltest du diese Tutorials oder Videos vermeiden, oder zumindest sehr kritisch betrachten. Denn wer weiß was die sonst noch so verbocken.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1121
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

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.
Antworten