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

Code: Alles auswählen

Error  table "lang" already exists
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 :lol:

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 :wink:

Edit:
Achso eine Spalte?! Oder meinst du eine Tabelle? Naja, ich lass es einfach mal stehen, evtl hilfts ja jemanden :lol:

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
:-)