Seite 1 von 1
pysqlite if not exists
Verfasst: Sonntag 16. Juli 2006, 12:50
von DatenMetzgerX
Hallo
Kleines PRoblem mit IF NOT EXISTS. Ich benutze die API von Python 2.5.
Code: Alles auswählen
CREATE TABLE "lang"
IF NOT EXISTS
(
"short" VARCHAR(5) UNIQUE NULL,
"long" TEXT NULL
)
Nur kommt dann immer die Meldung
Aber das will ich ja gerade verhindern???
Wie kann ich prüfen ob eine Tabelle alle gewünschten Spalten besitzt und wenn nicht die Spalten adden?
Thx
DM
Verfasst: Sonntag 16. Juli 2006, 14:32
von Leonidas
Das ist eigentlich eine SQLite-Frage und hat mit PySQLite eigentlich wenig zu tun, wie es geht steht
hier beschrieben. Es sieht so aus, dass du guckst, ob es die Tabelle in sqlite_master gibt und wenn nicht, dann erstellst du eine neue Tabelle.
Re: pysqlite if not exists
Verfasst: Sonntag 16. Juli 2006, 15:12
von BlackJack
DatenMetzgerX hat geschrieben:Kleines PRoblem mit IF NOT EXISTS. Ich benutze die API von Python 2.5.
Code: Alles auswählen
CREATE TABLE "lang"
IF NOT EXISTS
(
"short" VARCHAR(5) UNIQUE NULL,
"long" TEXT NULL
)
Das Problem mit ``IF NOT EXISTS`` ist, das es nicht existiert.
Jedenfalls nicht in SQL99. Das ist eine MySQL Erweiterung.
Verfasst: Sonntag 16. Juli 2006, 15:13
von DatenMetzgerX
ab sqlite 3.3 sollte es existieren
Verfasst: Sonntag 16. Juli 2006, 19:31
von Whitie
also zumindest mit MySQL funktioniert es so:
Code: Alles auswählen
CREATE TABLE IF NOT EXISTS "lang" (
"short" VARCHAR(5) UNIQUE NULL,
"long" TEXT NULL
)
Gruß, Whitie
Verfasst: Sonntag 16. Juli 2006, 19:34
von DatenMetzgerX
Genau...
So geht es
Nur wie kann ich prüfen ob eine Spalte schon existiert?
Verfasst: Sonntag 16. Juli 2006, 19:43
von CrackPod
Du musst in der Tabelle sqlite_master nachsehen.
Zuerst hatte ich einen recht aufwändigen Code, den Gerold dann verkürzt hat
Code: Alles auswählen
def install():
'''Erstellt die Datenbankstruktur'''
#type='table' --> Jede der Tabellen in der Datenbank ist vom Typ table
#name='xy' --> Dort wird nach einem bestimmtem Namen gesucht. Da musste halt den Namen deiner Tabelle eingeben.
sql = """SELECT name FROM sqlite_master WHERE type='table' AND name='addresses'"""
self.cur.execute(sql)
row = self.cur.fetchone()
#Wenn in dem geholten Datensatz (kann nur einer sein, da es in einer Datenbank keinen Tabellennamen 2 mal gibt) nichts drinnen steht - die Tabelle also nicht existiert - dann wird sie erstellt.
if not row:
sql = '''CREATE TABLE addresses (
id INTEGER PRIMARY KEY NOT NULL,
vorname VARCHAR(30),
zuname VARCHAR(40),
nachname VARCHAR(30),
anrede VARCHAR(20),
adresse VARCHAR(50),
plz VARCHAR(15),
ort VARCHAR(25),
land VARCHAR(30),
privatnummer VARCHAR(35),
privatfaxnummer VARCHAR(35),
mobilnummer VARCHAR(35),
bueronummer VARCHAR(35),
buerofaxnummer VARCHAR(35),
email VARCHAR(20)
)'''
self.cur.execute(sql)
self.con.commit()
Ich halte das erlichgesagt für die bessere Lösung als die mit IF NOT EXISTS, weil das eben abwärtskompatibel ist
Edit:
Achso eine Spalte?! Oder meinst du eine Tabelle? Naja, ich lass es einfach mal stehen, evtl hilfts ja jemanden
Verfasst: Sonntag 16. Juli 2006, 21:21
von gerold
DatenMetzgerX hat geschrieben:wie kann ich prüfen ob eine Spalte schon existiert?
Hi DM!
Du kannst das Schema der Tabelle abfragen. Im String steht dann auch welche Felder bereits angelegt sind.
Code: Alles auswählen
SELECT sql FROM sqlite_master
WEHERE (name = "lang") AND (type = "table");
lg
Gerold