Seite 2 von 3
Re: Bottle, HTML Datenbankzugriff
Verfasst: Montag 25. Februar 2013, 18:22
von BlackJack
@DanJJo: Das sollte eigentlich überhaupt nicht nötig sein wenn Du bei Texten durchgehend mit dem `unicode`-Typ arbeitest. Vor allem sollte eine Abfrage immer ein `unicode`-Objekt liefern.
Code: Alles auswählen
In [14]: cur.execute('select Vorname, Nachname from personen')
Out[14]: <sqlite3.Cursor at 0x8fddaa0>
In [15]: cur.fetchall()
Out[15]: [(u'Max', u'Mustermann')]
Und beim Eintragen erwartet SQLite UTF-8 kodierte `str`-Objekte oder `unicode`-Objekte.
Etwas global zu definieren, so dass alle Kodierungen auf magische Weise passieren geht nicht. Die „magic line” gibt an wie der Quelltext kodiert ist und muss mit der tatsächlichen Kodierung des Quelltextes überein stimmen. Das ist aber nur für den Compiler wichtig, zur Laufzeit hat diese Angabe keine Auswirkung.
Re: Bottle, HTML Datenbankzugriff
Verfasst: Mittwoch 27. Februar 2013, 13:16
von DanJJo
Super Danke.
Ich hab da mal eine Frage zu einer SQL abfrage. Angenommen ich habe folgende Tabellen
Wagen values (Name,Modell,...) , User values(Name,...) , Favorisiert values(UserName,WagenName,..)
Nun würde ich gerne eine Tabelle ausgeben, die Beinhaltet:
WagenName, Anz.der.Fav. -
leider komme ich da nicht hin
meine Ansätze
SELECT Wagen.Name, Count(Wagen.Name) FROM Wagen, User, Favorisiert WHERE User.Name=Favorisiert.UserName AND Wagen.Name = Favorisiert.WagenName.
mir ist klar, dass er bei Count(Wagen.Name) die Anzahl der Wagen Zählt, die in der Tabelle stehen aber nicht die jeweilige Anz für jeden einzeln
Re: Bottle, HTML Datenbankzugriff
Verfasst: Mittwoch 27. Februar 2013, 13:36
von Sirius3
Code: Alles auswählen
select WagenName, count(*) from Favorisiert group by WagenName
Re: Bottle, HTML Datenbankzugriff
Verfasst: Mittwoch 27. Februar 2013, 13:44
von DanJJo
AH mit group by. Danke

Re: Bottle, HTML Datenbankzugriff
Verfasst: Mittwoch 27. Februar 2013, 16:46
von BlackJack
Wobei jetzt in der `Favorisiert`-Tabelle hoffentlich nicht wirklich die Benutzer- und Wagen*namen* stehen.
Re: Bottle, HTML Datenbankzugriff
Verfasst: Mittwoch 27. Februar 2013, 18:49
von Sirius3
@ DanJJo: normalerweise hat jede Tabelle eine Spalte ID als primary key der zum Querverweis auf andere Tabellen benutzt wird.
Code: Alles auswählen
SELECT Wagen.Name, count(*) FROM Wagen, Favorisiert WHERE Wagen.id=Favorisiert.Wagen_Id GROUP BY Wagen_Id
Re: Bottle, HTML Datenbankzugriff
Verfasst: Donnerstag 28. Februar 2013, 12:42
von DanJJo
ich bin ja klein und fang grad erst an etwas rum zu testen

also verzeih mir, dass es noch nicht optimal ist blackjack
Ich habe ein Syntaktisches Problem....
folgendes:
Ich habe ein dict mit mehreren enden.
Code: Alles auswählen
look = { "1" : "in (SELECT AutoName FROM Wagen WHERE WagenName LIKE ?),('%'+import+'%',)" ....}
<- import ist hierbei etwas, das ich aus meinem tpl bekomme
und einen festen Anfangsstring.
Code: Alles auswählen
anfangsstring="""SELECT AutoName,ps,hubraum FROM Wagen WHERE WagenName """
anfangsstring+=look.get("1", "1"))
cur=db.execute(anfangsstring)
nun bekomm ich aber immer die meldung, dass die syntax nicht stimmt...liegt es an dem "import" ? dass das nicht funktioniert oder sollte das eigentlich kein problem sein?
Re: Bottle, HTML Datenbankzugriff
Verfasst: Donnerstag 28. Februar 2013, 13:01
von BlackJack
@DanJJo: Das liegt daran, dass Du in der Zeichenkette SQL- und Python-Syntax vermischst. Und die Datenbank kann mit dem Teil, den Du für Python verwenden müsstest, nichts anfangen. So ein Funktionsaufruf mit einer Variablen als Argument ist keine textuelle Ersetzung und das Ausführen des Ergebnisses als Python-Quelltext.
Ich denke es ist die Stelle in der Entwicklung erreicht, in der Du dringend über SQLAlchemy nachdenken solltest, um Anfragen nicht aus Zeichenketten zusammen zu basteln.
Re: Bottle, HTML Datenbankzugriff
Verfasst: Donnerstag 28. Februar 2013, 13:12
von DanJJo
BlackJack hat geschrieben:@DanJJo: Das liegt daran, dass Du in der Zeichenkette SQL- und Python-Syntax vermischst. Und die Datenbank kann mit dem Teil, den Du für Python verwenden müsstest, nichts anfangen. So ein Funktionsaufruf mit einer Variablen als Argument ist keine textuelle Ersetzung und das Ausführen des Ergebnisses als Python-Quelltext.
Ich denke es ist die Stelle in der Entwicklung erreicht, in der Du dringend über SQLAlchemy nachdenken solltest, um Anfragen nicht aus Zeichenketten zusammen zu basteln.
hmpf also besteht gar keine möglichkeit mit der überlegung, die ich hatte ?!

Re: Bottle, HTML Datenbankzugriff
Verfasst: Donnerstag 28. Februar 2013, 13:26
von BlackJack
@DanJJo: Jain. *So* natürlich nicht, Du müsstest im Wörterbuch zwei Sachen hinterlegen: SQL-(Teil)Ausdruck und Wert der Eingesetzt werden soll (oder eine Funktion die diesen Wert errechnet). Wobei ``('%'+import+'%',)`` als Python-Quelltext natürlich nicht geht, weil Namen keine Python-Schlüsselwörter sein dürfen. Das heisst Du hättest diesem Namen vorher auch gar keinen Wert zuweisen können.
SQLAlchemy ist aber trotzdem besser, weil man damit deutlich schwieriger syntaktisch falsches SQL erzeugen kann (solange man nicht absichtlich „rohe” SQL-Teilausdrücke einbaut).
Re: Bottle, HTML Datenbankzugriff
Verfasst: Donnerstag 28. Februar 2013, 13:36
von Sirius3
@DanJJo: Du mußt es nur richtig machen. »import« ist ein reserviertes Wort und darf nicht als Variablennamen benutzt werden.
Was willst Du mit der zweiten 1 bei look.get("1","1") bewirkten?
Code: Alles auswählen
WHERE_CLAUSE = {1: ("WagenName in (SELECT AutoName FROM Wagen WHERE WagenName LIKE ?)", lambda imp: ('%'+imp+'%',)) }
abfrage="SELECT AutoName,ps,hubraum FROM Wagen WHERE "
where, convert_arguments = WHERE_CLAUSE.get(1, ('1', lambda arg: ()))
cur.db.execute(abfrage+where, convert_arguments(import_))
Re: Bottle, HTML Datenbankzugriff
Verfasst: Donnerstag 28. Februar 2013, 13:50
von BlackJack
Mich würde ja eher interessieren was die Abfrage insgesamt bewirken soll. Es gibt eine Tabelle `Wagen` mit Spalten `AutoName` und `WagenName` und dann *diese* Abfrage!?
Re: Bottle, HTML Datenbankzugriff
Verfasst: Freitag 1. März 2013, 11:30
von DanJJo
BlackJack hat geschrieben:@DanJJo: Das sollte eigentlich überhaupt nicht nötig sein wenn Du bei Texten durchgehend mit dem `unicode`-Typ arbeitest. Vor allem sollte eine Abfrage immer ein `unicode`-Objekt liefern.
Code: Alles auswählen
In [14]: cur.execute('select Vorname, Nachname from personen')
Out[14]: <sqlite3.Cursor at 0x8fddaa0>
In [15]: cur.fetchall()
Out[15]: [(u'Max', u'Mustermann')]
Und beim Eintragen erwartet SQLite UTF-8 kodierte `str`-Objekte oder `unicode`-Objekte.
Etwas global zu definieren, so dass alle Kodierungen auf magische Weise passieren geht nicht. Die „magic line” gibt an wie der Quelltext kodiert ist und muss mit der tatsächlichen Kodierung des Quelltextes überein stimmen. Das ist aber nur für den Compiler wichtig, zur Laufzeit hat diese Angabe keine Auswirkung.
hmpf bringt mich irgendwie nicht weiter, da ich immer wieder einen Fehler bekomme.
an anderer Stelle hab ich
im Browser URL FELd WIRd angezeigt ../Wagen/ÖMW aber der Browser selbst liefer den Fehler
Error: 500 Internal Server Error
Sorry, the requested URL '
http://localhost:8080/Wagen/%C3%96mw' caused an error:
wo liegt mein problem?
Re: Bottle, HTML Datenbankzugriff
Verfasst: Freitag 1. März 2013, 11:51
von Sirius3
@DanJJo: wie sollen wir aus diesem unzusammenhängenden Angaben irgendwie ableiten können, an welcher Stelle nicht das passiert, was Du erwartest?
Wenn Du eine Route Wagen/... definierst, findet er natürlich den Link user/... nicht.
Re: Bottle, HTML Datenbankzugriff
Verfasst: Freitag 1. März 2013, 11:57
von DanJJo
sorry sollte natürlich Wagen heißen...
bei User tritt nur das gleiche problem mit den Umlauten auf..
also ich speicher irgendwann den Namen des Wagens in meiner DB und wenn ich auf die seite des Wagens gehen möchte kommt dieser fehler...
EDIT*:
Habs selbst gelöst -> Lösung
Code: Alles auswählen
@route("/Wagen/<Wagenname>")
wagenname = wagenname.decode('utf-8')
es reicht nicht die daten beim einfügen in die DB zu decoden. In den Routen muss es nochmals geschehen.