pysqlite if not exists

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

pysqlite if not exists

Beitragvon DatenMetzgerX » Sonntag 16. Juli 2006, 12:50

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 16. Juli 2006, 14:32

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 Modvoice
BlackJack

Re: pysqlite if not exists

Beitragvon BlackJack » Sonntag 16. Juli 2006, 15:12

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)

Beitragvon DatenMetzgerX » Sonntag 16. Juli 2006, 15:13

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

Beitragvon Whitie » Sonntag 16. Juli 2006, 19:31

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)

Beitragvon DatenMetzgerX » Sonntag 16. Juli 2006, 19:34

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

Beitragvon CrackPod » Sonntag 16. Juli 2006, 19:43

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 16. Juli 2006, 21:21

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=]SELECT sql FROM sqlite_master
WEHERE (name = "lang") AND (type = "table");[/code]
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder