Du meinst mein Vokabelbfrager soll sich eine zufällige ID aus VOKABEL(die mit den IDs) holen, und dann
ein Kommando ausführen, dass alle Wörter mit dieser ID aus TRANSLATION(die Übersetzungen) zurückgibt?
Datenbank mit Liste
Das wäre eine Möglichkeit. Ich würde es wahrscheinlich andersherum angehen und das zufällige Wort in meiner Quellsprache in TRANSLATION suchen. Wenn man es schön machen will, dann kann man auf Basis der identischen vokabel_id auch noch direkt überprüfen ob das Wort in der gewünschten Zielsprache ebenfalls existiert, denn sonst wäre ein Heraussuchen ja sinnlos.Tobs hat geschrieben:Du meinst mein Vokabelbfrager soll sich eine zufällige ID aus VOKABEL(die mit den IDs) holen, und dann
ein Kommando ausführen, dass alle Wörter mit dieser ID aus TRANSLATION(die Übersetzungen) zurückgibt?
Das könnte (ohne Zufallskomponente) etwa so aussehen.
Code: Alles auswählen
SELECT t1.vokabel_id, t1.word, t2.word
FROM translation as t1
JOIN translation as t2 ON
t2.vokabel_id = t1.vokabel_id AND
t2.language_code = "de"
WHERE
t1.language_code = "en"
Ich hab mich halb totgesucht, um ein Programm zu finden, dass SQLite3 Datenbanken (datenbank.db) öffnen kann
Habt ihr da ne Freeware für mich, weil es echt verdammt mies ist so viele Datensätze über die Konsole einzugeben
Und kommt mir jetzt nicht mit: Programmier doch ein Programm, das das macht
Danke im voraus
Habt ihr da ne Freeware für mich, weil es echt verdammt mies ist so viele Datensätze über die Konsole einzugeben
Und kommt mir jetzt nicht mit: Programmier doch ein Programm, das das macht
Danke im voraus
@Tobs: Also mal so auf die schnelle gesucht: Es gibt ein Firefox-Plugin: SQLite Manager und zum Beispiel Sqliteman als Desktopanwendung.
Ausserdem gibt es ja noch das ``sqlite3``-Programm für die Kommandozeile womit man Textdateien importieren kann, die man zum Beispiel mit einer Tabellenkalkulation oder einem Texteditor erstellen kann.
Edit: Wie man variable Werte in einer SQL-Anfrage verwendet steht in der Dokumentation zum `sqlite3`-Modul.
Ausserdem gibt es ja noch das ``sqlite3``-Programm für die Kommandozeile womit man Textdateien importieren kann, die man zum Beispiel mit einer Tabellenkalkulation oder einem Texteditor erstellen kann.
Edit: Wie man variable Werte in einer SQL-Anfrage verwendet steht in der Dokumentation zum `sqlite3`-Modul.
Aber wozu ist jetzt vokabel_id gut, ich dachte, man braucht für die Tabelle keinen extra Primärschlüssel, weil ja alle Wörter unterschiedlich sind,oder?
Oder meinst du, dass die Vokabel ID dazu da ist nach Adjektiven,Verben,etc zu unterscheiden?
Oder meinst du, dass die Vokabel ID dazu da ist nach Adjektiven,Verben,etc zu unterscheiden?
OK ich hab die ID aus der Tabelle rausgeworfen, sieht jetzt so aus:
Tabelle 1 (von 1):
WORT, ÜBERSETZUNG, SPRACHE
-------------------------------
"HELLO","HALLO","ENG"
"HELLO","SERVUS","ENG"
Da ich nur 2 Sprachen hab will ich es dann noch weiterkürzen:
Tabelle 1 (von 1):
DEUTSCHES_WORT,ENGLISCHES_WORT
--------------------------------------
"HALLO","HELLO"
"SERVUS","HELLO"
Seht ihr da irgendwelche Probleme?
Tabelle 1 (von 1):
WORT, ÜBERSETZUNG, SPRACHE
-------------------------------
"HELLO","HALLO","ENG"
"HELLO","SERVUS","ENG"
Da ich nur 2 Sprachen hab will ich es dann noch weiterkürzen:
Tabelle 1 (von 1):
DEUTSCHES_WORT,ENGLISCHES_WORT
--------------------------------------
"HALLO","HELLO"
"SERVUS","HELLO"
Seht ihr da irgendwelche Probleme?
@Tobs: Es ist üblich einen numerischen Primärschlüssel zu verwenden, weil die in der Regel effizienter sortiert und verglichen werden können als Zeichenketten.
Mit dem Tabellenansatz ohne IDs sehe ich das Problem das die Daten redundant gespeichert sind. HELLO steht dort zweimal drin. Jetzt überlege Dir mal wieviel Aufwand das macht eine Vokabel bei der man sich verschrieben hat, in der Datenbank zu ändern. Und was zum Beispiel passiert wenn der Verschreiber dazu führt, dass sie den gleichen Namen hat, wie eine bereits vorhandene.
Das mit der max(ID) + 1 ist überflüssig. Alle mir bekannten relationalen DBMS kennen einen Mechanismus um die automatisch zu vergeben. So auch SQLite. Einfach eine ``INTEGER PRIMARY KEY`` deklarieren und dann den Wert beim Eintragen nicht angeben. SQLite trägt dann selbst eine passende ID ein.
Mit dem Tabellenansatz ohne IDs sehe ich das Problem das die Daten redundant gespeichert sind. HELLO steht dort zweimal drin. Jetzt überlege Dir mal wieviel Aufwand das macht eine Vokabel bei der man sich verschrieben hat, in der Datenbank zu ändern. Und was zum Beispiel passiert wenn der Verschreiber dazu führt, dass sie den gleichen Namen hat, wie eine bereits vorhandene.
Das mit der max(ID) + 1 ist überflüssig. Alle mir bekannten relationalen DBMS kennen einen Mechanismus um die automatisch zu vergeben. So auch SQLite. Einfach eine ``INTEGER PRIMARY KEY`` deklarieren und dann den Wert beim Eintragen nicht angeben. SQLite trägt dann selbst eine passende ID ein.
@Tobs: die Vokabel-Id beschreibt ist für jede Bedeutung eines Wortes die selbe. Jeder Bedeutungs-ID sind dann verschiedene Wörter in verschieden Sprachen zugeordnet. Du hast jetzt eine künstliche Trennung zwischen Wort und Übersetzung. Ist die Übersetzung etwa kein Wort?
ID, WORT, SPRACHE
-------------------------------
1, "HELLO","ENG"
1, "HALLO","DEU"
1, "SERVUS","BAY"
2, "BANK", "ENG"
2, "BANK", "DEU"
3, "BENCH", "ENG"
3, "BANK", "DEU"
ID, WORT, SPRACHE
-------------------------------
1, "HELLO","ENG"
1, "HALLO","DEU"
1, "SERVUS","BAY"
2, "BANK", "ENG"
2, "BANK", "DEU"
3, "BENCH", "ENG"
3, "BANK", "DEU"
@Tobs: Dann stellt sich als nächstes die Frage woran solche Informationen wie „zuletzt abgefragt” geknüpft werden sollen. An die Vokabel mit all ihren Übersetzungen, oder an die einzelnen Übersetzungen?
Solang das Programm weiß, dass wenn es deutsch_englisch "HALLO" abfragt,
alles richtig ist, was "HALLO" in der Spalte "Deutsch" stehen hat, passt es.
Ist der Geschwindigkeitsverlust wirklich SOOO schlimm?
Mehr als ne halbe Sekunde macht das doch eh net aus, oder?
alles richtig ist, was "HALLO" in der Spalte "Deutsch" stehen hat, passt es.
Ist der Geschwindigkeitsverlust wirklich SOOO schlimm?
Mehr als ne halbe Sekunde macht das doch eh net aus, oder?
@Tobs: Es ist im Grunde völlig egal wie schnell das ist wenn Du es unsauber programmierst, es bleibt unsauber. Mach es so wenn Du magst, aber dann frag halt auch nicht wie man es richtig macht.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ach wozu gibt es denn Indizes... *duck und weg*BlackJack hat geschrieben:@Tobs: Es ist üblich einen numerischen Primärschlüssel zu verwenden, weil die in der Regel effizienter sortiert und verglichen werden können als Zeichenketten.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Am Ende will ich es schon richtig haben, aber momentan steh ich unter Zeitdruck,
deshalb lieber Dreckig und jetzt fertig als, ich blick noch nicht durch und Chaos
Sry, hab schon wieder ein Problem:
c.execute("DELETE FROM vokabeln WHERE eng = " + attribut)
Das haut nicht hin, mit DELETE * FROM ... geht es auch nicht...
deshalb lieber Dreckig und jetzt fertig als, ich blick noch nicht durch und Chaos
Sry, hab schon wieder ein Problem:
c.execute("DELETE FROM vokabeln WHERE eng = " + attribut)
Das haut nicht hin, mit DELETE * FROM ... geht es auch nicht...
Ich hab ein jetzt richtig mieses Problem mit mit miesen Folgen...
Ich hab ungefähr 200 Datensätze angelegt, und danach festgestellt, dass er die zwei Spalten genau verkehrt herum
reingeschrieben hat. Ich hab versucht mit nem externen Programm die Spalten umzubenennen, aber wenn ich es in
Python öffne ist alles so wie vorher
Wie kann ich die Inhalte der beiden Spalten tauschen?
Oder muss ich alles neu schreiben???
Edit: Hat sich erledigt, ich hab die Datenbank geschrottet, indem ich sie mit nem Texteditor geöffnet hab. Ja ihr dürft mich jetzt auslachen
Ich hab ungefähr 200 Datensätze angelegt, und danach festgestellt, dass er die zwei Spalten genau verkehrt herum
reingeschrieben hat. Ich hab versucht mit nem externen Programm die Spalten umzubenennen, aber wenn ich es in
Python öffne ist alles so wie vorher
Wie kann ich die Inhalte der beiden Spalten tauschen?
Oder muss ich alles neu schreiben???
Edit: Hat sich erledigt, ich hab die Datenbank geschrottet, indem ich sie mit nem Texteditor geöffnet hab. Ja ihr dürft mich jetzt auslachen
Dann hast du doch jetzt gleich mehrere Dinge gelernt:
1. Dinge die automatisierbar sind, sollte man automatisieren. Wenn du Daten per Hand eingibst, dann darfst du dich nicht beschweren, wenn du das irgendwann noch einmal machen musst. Anders hättest du nur das Programm zum Einfügen umschreiben müssen. Ich zitiere dich mal:
3. Versionsverwaltungssystem sind etwas Tolles.
4. Gib keine 200 Datensätze ein ohne zwischendurch vielleicht mal zu testen
5. Wer den Schaden hat ...
1. Dinge die automatisierbar sind, sollte man automatisieren. Wenn du Daten per Hand eingibst, dann darfst du dich nicht beschweren, wenn du das irgendwann noch einmal machen musst. Anders hättest du nur das Programm zum Einfügen umschreiben müssen. Ich zitiere dich mal:
2. Verändere nie binäre Daten mit einem einfachen Texteditor.Tobs hat geschrieben:Habt ihr da ne Freeware für mich, weil es echt verdammt mies ist so viele Datensätze über die Konsole einzugeben
Und kommt mir jetzt nicht mit: Programmier doch ein Programm, das das macht
3. Versionsverwaltungssystem sind etwas Tolles.
4. Gib keine 200 Datensätze ein ohne zwischendurch vielleicht mal zu testen
5. Wer den Schaden hat ...
Das Leben ist wie ein Tennisball.
Ich hab bereits ein Programm zum beschreiben und löschen mit easygui geschrieben, trotzdem muss ich es noch von Hand eingeben,
das Programm erspart mir nur den Code und die Groß-Klein-Schreibung, und fragt mich ob ich einen Datensatz löschen will, wenn er
bereits vorhanden ist, aber ich habs jetzt halt trotzdem nochmal von Hand eingeben müssen :-/
das Programm erspart mir nur den Code und die Groß-Klein-Schreibung, und fragt mich ob ich einen Datensatz löschen will, wenn er
bereits vorhanden ist, aber ich habs jetzt halt trotzdem nochmal von Hand eingeben müssen :-/