Datenbank befehle richtig erzeugen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Sebas
User
Beiträge: 2
Registriert: Freitag 13. April 2012, 01:32

Hallo Leute,
ich brauch mal eure Hilfe ich will mit Python Tabellen in einer SQL Datenbank erstellen und dort später Wörter einordnen. Für jeden anfangsbuchstaben eine eigene Tabelle.
Wenn ich jetzt allerdings meinen Tabellen Namen automatisch erstelle, und es dann in den SQL Befehl übergebe wandern immer die Anführungszeichen mit. Also statt awords wird "awords" in den Befehl übergeben. Und dadurch gibt es natürlich einen Syntaxfehler. Habt ihr Ideen wie ich das Unterbinden kann?
Ich hab auch schon gesucht hab aber nichts gefunden, weiss auch nicht so wirklich wo nach ich suchen soll...

Code: Alles auswählen

import MySQLdb

connection = MySQLdb.connect("Geheim")

cursor = connection.cursor()
a = 97
while a < 123:
    
    name = chr(a)+"words"
    cursor.execute("""
    CREATE TABLE %s (word TEXT, synonyms TEXT) 
    """,name)
    a = a+1
Vielen Dank schonmal im Voraus.
Bitte nett sein falls ich wa falsch gemacht hab. bin neu hier und neu bei Python...

mfg Sebastian
BlackJack

@Sebas: Man kann auf diese Weise nur *Werte* in einen SQL-Ausdruck einfügen und keine Tabellennamen oder sonstige Teilausdrücke.

Das was Du vorhast, klingt auch nicht nach einer guten Idee. Wenn das Programm das später auf die Tabellen zugreift, dann auch wieder die Tabellennamen dynamisch angeben muss, verwendest Du die DB für etwas für das sie eigentlich nicht gedacht ist.

Warum willst Du das überhaupt auf mehrere Tabellen aufteilen? Da reicht doch eine aus. Eventuell möchtest Du ja einen entsprechenden Index anlegen falls das Programm zu langsam ist. Aber alle Worte die mit einem bestimmten Buchstaben anfangen sollte man über eine Abgfrage aus der Tabelle filtern und nicht die Tabelle auswählen müssen. Überlege zum Beispiel mal wie Du bei vielen Tabellen eine Abgrage formulieren willst, die alle Synonyme für Wörter die mit 'haus' *enden* ergeben.

Die ``while``-Schleife ist übrigens ein Kandidat für eine ``for``-Schleife. Das ist kompakter und man hat in einer Zeile alle Informationen über die Werte die `a` annehmen kann, die jetzt auf drei Zeilen verteilt sind.
Sebas
User
Beiträge: 2
Registriert: Freitag 13. April 2012, 01:32

Danke für die schnelle Antwort!
Hmm dann werd ichs wohl mit einer Tabelle machen aber wird das bei einer großen Datenbank nicht irgendwann zu langsam?
Weil die Englische Sprache hat ca. 750.000 Wörter, daher hatte ich die Idee so eine Art Hash Funktion zu machen die die Wörter auf Tabellen aufteilt und dazu noch einen Index für jede Tabelle. Oder wäre es mit einer Tabelle und Index trotzdem schneller?
Ich will eh nur ganze Wörter nachschlagen von daher wäre es egal wenn die wörter aufgeteilt sind.
Stimmt eine For Schleife wäre wohl besser. Werde ich gleich mal umbauen.
mfg Sebastian
BlackJack

@Sebas: Datenbanken sind dafür da grosse Datenmengen zu verwalten. Und 750K Datensätze sind sicher noch nicht besonders gross. Bevor Du hier anfängst im Vorfeld schon Dein Programm komplizierter zu machen als es sein müsste um Geschwindigkeitsprobleme zu umgehen von denen Du noch nicht einmal weisst ob Du sie überhaupt hast, solltest Du erst einmal darauf vertrauen, dass die Datenbankentwickler viele Jahre Arbeit in die Optimierung von Abfragen gesteckt haben. Wenn das *messbar* zu langsam ist, kannst Du Indexe anlegen. Sollte das noch zu langsam sein, kannst Du schauen was für Feineinstellungen das verwendete DBMS für Indexe bietet.

Wenn Du nur ganze Wörter auf eine Liste von Synonymen abbilden willst, dann wäre ein RDBMS vielleicht auch etwas übertrieben und das `shelve`-Modul aus der Standardbibliothek ausreichend.
Antworten