Variable beim Tabellen erstellen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo zusammen,

ich würde gerne eine neue Tabelle erstellen. was auch sehr gut mit dem unten aufgeführten Befehl funktioniert!
nun würde ich gerne das der TabellenNamen Variable ist
sprich, ich würde gerne eine Variable Defininieren String = 'TabellenName'
kann mir jemand sagen wie man sowas macht?
wie kann ich das sql Kommando so ausklammern, das ich eine Variable definieren kann

Code: Alles auswählen

sql = """
    -- Tabelle erstellen
    CREATE TABLE TabellenNamen (
       id SERIAL PRIMARY KEY,
        Anrede text
    ) WITHOUT OIDS;

    """
deets

Stichwort ist String-Formatierung, gibt's hier hunderte Beispiele im Forum. Oder hier die offizielle Doku:

http://docs.python.org/library/stdtypes ... formatting
BlackJack

@erdmulch: Das geht mit Zeichenkettenformatierung. Du musst allerdings aufpassen, dass die Daten für den Tabellennamen aus einer vertrauenswürdigen Quelle kommen. Und so etwas zu machen beziehungsweise machen zu wollen ist IMHO ein „code smell”. In normalen Programmen gibt es keine variablen Tabellennamen.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

also mit dem % Modulo operator funktioniert es nicht:
A = 'Test'
'%A'
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Was hast du denn versucht? (Code)
Was ist passiert? (Fehlermeldung)
Was hast du erwartet?

All das ist nötig um dir zu helfen, nichts von dem kann ich aus deinem letzten Post erkennen.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Code: Alles auswählen

def create_table(conn):
    cur = conn.cursor()
    A = 'test';
    sql = """
    -- Tabelle erstellen
    CREATE TABLE %A (
       id SERIAL PRIMARY KEY,
        Anrede text
    ) WITHOUT OIDS;

    """
    # SQL-Anweisungen ausführen
    cur.execute(sql)
    conn.commit()

Hier die Fehlermeldung dazu:
psycopg2.ProgrammingError: FEHLER: Syntaxfehler bei »%«
LINE 3: CREATE TABLE %A (

will nur damit die tabelle "test" heißt!
aber mit dem modulo kommando geht das nicht
deets

Du musst schon die Doku richtig lesen.

Code: Alles auswählen

tablename = 'foo'
sql = "CREATE %(table)s (id ...)" % dict(table=tablename)
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

was hat das jetzt mit einem dictionary zu tun?
deets

Hast du es ausprobiert? Dann klaert sich deine Frage vielleicht von gaaaaanz alleine...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

deets gibt dem Platzhalter einen Namen, darum braucht er ein dict, anstelle von `%(table)s` kannst du auch `%s` verwenden und brauchst das nicht, zu lasten der Lesbarkeit.
Wenn dir das aber nicht klar ist, solltest du nochmal die Doku lesen, das erste Beispiel dort nutzt es sogar.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Oder einfach den Inhalt der Dokumentation lesen, die deets 2. Post des Threads zielisicher verlinkt hat.
Antworten