Dateinamen mit . (Punkt) in SQLite DB schreiben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

Hallo,

ich habe eine simple SQLite Tabelle.

Code: Alles auswählen

sql = 'CREATE TABLE IF NOT EXISTS {} \
    (dateinummer INTEGER PRIMARY KEY NOT NULL, \
    dateiname TEXT, \
    erfassungszeit DATE)'.format(tabellenname)
Beim INSERT habe ich leider Dateinamen die einen . (Punkt) enthalten.

Code: Alles auswählen

INSERT INTO mytable VALUES (45841, 000014121011.104027544.EMDK0755)
Bei der Ausführung bekomme ich daher eine Fehlermeldung.

Code: Alles auswählen

sqlite3.OperationalError: near ".": syntax error

Code: Alles auswählen

sql = 'INSERT INTO {} VALUES ({}, {})'.format(tabellenname, int(ergebnis[1]), os.path.basename(datei))
Könnt ihr mir verraten wie ich die Dateinamen ohne Fehlermeldung schreiben kann?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

#edit: Falschinformation, danke an Sirius3 fürs korrigieren.

Wenn du einen String in die DB schreiben willst, musst du den Wert auch als einen String kennzeichnen.
Zuletzt geändert von Jankie am Donnerstag 17. September 2020, 14:22, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@16_Bit: Tabellennamen sind was fixes, die sollte man nicht mit format in den SQL.Ausdruck hineinformatieren.
Variablen sind immer variable, und dürfen niemals per format in SQL-Ausdrücke hineinformatiert werden. Dafür gibt es Platzhalter.

Code: Alles auswählen

cursor.execute("INSERT INTO mytable (dateinummer, dateiname) VALUES (?, ?)", [ergebnis[1], os.path.basename(datei)])
mytable ist ein besonders schlechter Name für eine Tabelle.

@Jankie: nein muß man nicht, weil der Typ der Platzhalter automatisch korrekt verarbeitet wird.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Noch eine Anmerkung: NOT NULL ist in PRIMARY KEY bereits enthalten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

Danke schon mal für die Unterstützung.

Die Tabelle heißt nicht mytable, dass hatte ich nur hier im Forum als Platzhalter gewählt.

Den Tabellennamen formatiere ich mit {} rein, da ich im Prinzip 5 Identische Tabellen erzeuge, jedoch für verschiedene Mandanten. Ich wollte jetzt nicht für alle Tabellen eigenen Code schreiben, da diese zu 98% identisch sind.

Code: Alles auswählen

sql = 'CREATE TABLE IF NOT EXISTS {} \
    (dateinummer INTEGER PRIMARY KEY NOT NULL, \
    dateiname TEXT, \
    erfassungszeit DATE)'.format(tabellenname)
Wie hättet ihr das denn gelöst? 5 mal create table mit dem jeweiligen Tabellennamen?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@16_Bit: man erzeugt gar nicht 5 Tabellen, sondern kodiert die zusätzliche Information "Mandant" als Spalte in einer Tabelle.
Antworten