Seite 1 von 1

bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 12:54
von Sync32
Ich arbeite gerade ein wenig mit Bottle.
Ich speicher meine Sachen in einer SQL DB.

Wenn ich meine Daten im Template auslese geschieht es so:

%for c in content:
<p>
%for s in c:
{{s}}
%end
</p>
%end

Dann listet er mir alles auf. In der DB gibt es die Spalten "Name", "Adresse", "Sonstiges".
Wie lese ich nun explizit aus, damit ich es besser gestalten kann also quasi so irgendwie:

%for c in content:
<p>
%for s in c:
Name: {{s.name}}
Adresse: {{s.adresse}}
Sonstiges: {{s.sonstiges}}
%end
</p>
%end

Geht das irgendwie?

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 12:58
von jbs
Das ist ja kein Bottle-Problem sondern in DB-spezifisches.

Was für eine Engine nutzt du denn?

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 13:01
von Sync32
Es geht darum, dass ich unter Python 2.6 + Bottle ein Gästebuch schreiben möchte.
Einträge speicher ich in ner Sql DB.

Bloß nun möchte ich die Einträge-Anzeige ein wenig gestalten:

PeterPan schrieb am 12.12.2010:
Hell worold



=> dachte das geht irgendwie in so einer Form:

{{s.name}} schrieb am {{s.date}}:
{{s.message}}

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 13:05
von jbs
Welches modul importierst du denn?

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 13:11
von Sync32

Code: Alles auswählen

   #....
    conn = sqlite3.connect('test.db')
    c = conn.cursor()
    c.execute("SELECT name, msg, datum FROM eintraege")
    result = c.fetchall()
    c.close()
    output = template('show.tpl', content = result)    
    return output

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 13:36
von jbs
Es gibt verschiedene Möglichkeiten.

Du kannst auf name, msg, datum mit s[0], s[1], s[2] zugreifen.

Oder du machst es wie hier: http://docs.python.org/library/sqlite3. ... ow_factory

Oder du nimmst ein ORM.

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 13:43
von Hyperion
Im Tutorial von bottle steht das doch gut beschrieben und man findet diesen Beispiel-Code:

Code: Alles auswählen

%#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...)
<p>The open items are as follows:</p>
<table border="1">
%for row in rows:
  <tr>
  %for r in row:
    <td>{{r}}</td>
  %end
  </tr>
%end
</table>
Du musst eben in einer inneren Schleife über die Tupel iterieren...

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 13:49
von Sync32
Hyperion hat geschrieben:Im Tutorial von bottle steht das doch gut beschrieben und man findet diesen Beispiel-Code:

Code: Alles auswählen

%#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...)
<p>The open items are as follows:</p>
<table border="1">
%for row in rows:
  <tr>
  %for r in row:
    <td>{{r}}</td>
  %end
  </tr>
%end
</table>
Du musst eben in einer inneren Schleife über die Tupel iterieren...
Ja daran hab ich mich auch orintiert.
Doch wenn ich das in dieser Form amche, denn klatscht er mir da alles einfach so hintereinander hin. Ich kann da nicht sagen:
%for r in row:
{{Inhalt aus der Spalte Name}} schrieb:
<hr>
{{Inhalt der Spalte Nachricht}}
%end

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 14:00
von Hyperion
Dann nimm eben Indexzugriffe, wie jbs beschrieben hat! (Wußte nicht, dass das geht)

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 14:02
von Sync32
Dann nimm eben Indexzugriffe, wie jbs beschrieben hat! (Wußte nicht, dass das geht)
Jop, es funktioniert.
Trotzdem danke!

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 14:03
von jbs
Die Frage lautete eigentlich wie entpacke ich Tupel und wtf, warum sind das keine dicts.

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 16:10
von Sync32
Ok noch ne Frage:
Wie handhabt ihr das mit dem Datum wenn ihr etwas in ner SQL DB einträgt?

Die Now() Func. scheint nicht zu gehen :(

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 16:53
von BlackJack
@Sync32: Welche `Now()`-Funktion!? In der Dokumentation von SQLite gibt's eine Seite zu den Datums- und Zeitfunktionen. Da gibt's keine `now()`-Funktion, aber Beispiele -- von denen gleich das allererste zeigt, wie man das aktuelle Datum bekommt.

Wobei man das ja eigentlich auch problemlos im Python-Programm erzeugen kann. Dann ist es unabhängig von irgendwelchen SQL-Dialekten oder spezifischen Datenbankeigenheiten.

Re: bottle: expliztes auslesen

Verfasst: Montag 9. August 2010, 21:59
von noisefloor
Hallo,

nichts gegen SQLite, aber...

1. MySQL kennt den DictCursor, d.h. ein Execute-Statement bzw. das folgende fetch... liefert ein Dict zurück
2. MySQL kennt die Funktion "timestamp", die denn aktuellen Zeitstempel in eine Zelle einträgt.

Wobei: Wenn das deine einzigen "Probleme" ;-) sind - beide lässt sich mir ein paar Zeilen Python-Code auch realisieren.

Gruß, noisefloor

Re: bottle: expliztes auslesen

Verfasst: Dienstag 10. August 2010, 10:52
von Dav1d
Schau dir query_db aus der Flask-Dokumentation ab :D

http://flask.pocoo.org/docs/patterns/sqlite3/#sqlite3

Und mit Jinja2 kannst du auf Dictionaries auch zugreifen wie du willst:

Code: Alles auswählen

d = dict(foo='bar', x='y')
#####
{{ d.foo }} # = bar
{{ d.x }} # = y

Re: bottle: expliztes auslesen

Verfasst: Dienstag 10. August 2010, 11:22
von Defnull
Dav1d hat geschrieben:Schau dir query_db aus der Flask-Dokumentation ab :D

http://flask.pocoo.org/docs/patterns/sqlite3/#sqlite3
Nur etwas Vorsicht: Das Flask Beispiel für query_db() macht ein cur.fetchall(), selbst wenn nur einen einziger Eintrag gebraucht wird. Der db_query(one=True) Parameter wird denkbar schlecht umgesetzt.

Re: bottle: expliztes auslesen

Verfasst: Dienstag 10. August 2010, 11:54
von noisefloor
Hallo,

das funktioniert doch mit jedem anderen Framework genau so (wenn man nicht gerade genau die "before-request" Funktion braucht).

Das Problem des OP ist doch, wie man das Ergebnis eines SQL-Queries "richtig" in Template bekommt bzw. wie man das Ergebnis des Queries (bei SQLite eine Liste von Tuplen) in ein Dict bekommt. :-)

Gruß, noisefloor

Re: bottle: expliztes auslesen

Verfasst: Dienstag 10. August 2010, 15:22
von Dav1d
@noisefloor, worauf spielst du an? auf app.before/after_request von Flask? Mir ging es nicht darum jemanden zu Flask zu "bekehren" (dazu kenne ich mich selber viel zu wenig aus), sondern auf ein Beispiel in der Flask-Dokumentation hinzuweisen, wie man aus einem SQL-Fetch ein Dictionary macht (query_db).

Re: bottle: expliztes auslesen

Verfasst: Dienstag 10. August 2010, 19:20
von noisefloor
Hallo,
Mir ging es nicht darum jemanden zu Flask zu "bekehren" (dazu kenne ich mich selber viel zu wenig aus), sondern auf ein Beispiel in der Flask-Dokumentation hinzuweisen, wie man aus einem SQL-Fetch ein Dictionary macht (query_db).
Axo. Es las' sich so, als ob Flask das Problem lösen würde (was ja nicht so ist).

Ansonsten hast du natürlich recht. :-) Bei mitsuhiko findet man immer interessant Code-Schnippsel jenseits seiner eigentlichen Progs.

Gruß, noisefloor