pysqlite if not exists

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

ab sqlite 3.3 sollte es existieren
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

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
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Genau...

So geht es :)

Nur wie kann ich prüfen ob eine Spalte schon existiert?
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

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:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten