Bottle, HTML Datenbankzugriff

Django, Flask, Bottle, WSGI, CGI…
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.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

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
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

select WagenName, count(*) from Favorisiert group by WagenName
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

AH mit group by. Danke :)
BlackJack

Wobei jetzt in der `Favorisiert`-Tabelle hoffentlich nicht wirklich die Benutzer- und Wagen*namen* stehen.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@ 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
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

ich bin ja klein und fang grad erst an etwas rum zu testen :roll: 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?
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.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

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 ?! :|
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).
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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_))
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!?
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

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.

Code: Alles auswählen

WagenName = request.forms.get('wgn').decode('utf-8')
an anderer Stelle hab ich

Code: Alles auswählen

@route('Wagen/<WagenName>')
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?
Zuletzt geändert von DanJJo am Freitag 1. März 2013, 11:56, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

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.
Antworten