Seite 1 von 1
ProgrammingError
Verfasst: Dienstag 10. August 2010, 10:18
von Sync32
Hallo.
Ich programmiere gerade mit Bottle ein kleines Gästebuch. Klappt soweit auch alles.
Wenn ich nur eine längere Eingabe mache, kommt das hier:
ProgrammingError('You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode string
Hab denn auch
c.execute(query, (entry, entry2, ))
in
c.execute(query, (entry, unicode(entry2), ))
entry2 ist die große Texteingabe
geändert. Aber der Fehler kommt immer noch.
Ich nutze Python 2.6.
Re: ProgrammingError
Verfasst: Dienstag 10. August 2010, 10:40
von Hyperion
1.) Welche DB Anbindung nutzt Du denn?
2.) Woher weißt Du, dass sich der Fehler auf die gezeigte Zeile bezieht?
3.) Was steht denn in den entrys und query?
Generell gilt wie immer bei dem Thema: Viel lesen
http://wiki.python-forum.de/Von%20Umlau ... 0Encodings
http://wiki.python-forum.de/User%20Grou ... folien.pdf
Re: ProgrammingError
Verfasst: Dienstag 10. August 2010, 10:43
von Sync32
Code: Alles auswählen
#.....
entry= request.GET.get('username', '').strip()
entry2= request.GET.get('user_msg', '').strip()
conn = sqlite3.connect('message.db')
c = conn.cursor()
msg_date = time.strftime("%d. %m. %Y")
query = "INSERT INTO message (name,msg, topic_id, msg_date) VALUES (?,?,%s,'%s')" % (new_id, msg_date)
c.execute(query, (entry, entry2, ))
conn.commit()
c.close()
#....
Hätte nicht gedacht, dass es Schwerigkeiten bereitet.
Möchte einfach nur ein eingegebnen Text (via HTML Formular) in die Datenbank speichern und ausgeben.
Re: ProgrammingError
Verfasst: Dienstag 10. August 2010, 10:55
von Dav1d
http://docs.python.org/library/sqlite3 hat geschrieben:Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.) For example:
Ich würde time.time() als Zeitangabe verwenden (damit kann man meistens mehr anfangen)
Re: ProgrammingError
Verfasst: Dienstag 10. August 2010, 11:00
von Sync32
So hab meien Nachricht vorm Speichern decodiert:
entry2 = entry2 .decode("iso-8859-1")
Aber nun gibt er Umlaute so wieder:
¶Ã¤
Re: ProgrammingError
Verfasst: Dienstag 10. August 2010, 11:10
von Hyperion
Sync32 hat geschrieben:
entry2 = entry2 .decode("iso-8859-1")
Woher weißt Du, dass dieses Encoding stimmt?
Sync32 hat geschrieben:
Aber nun gibt er Umlaute so wieder:
¶Ã¤
Wo denn? Im Browser?
Generell: Wenn Du die Parameter-Ersetzung wie von Dav1d angegeben verwendest, wird sqlite aus utf-8 codierte Strings direkt verarbeiten können. So wie im Moment hängt alles nur vom encoding der Python-Datei ab!
Zusätzlich: Ich würde meine Webseiten nur als utf-8 codiert ausliefern.
Re: ProgrammingError
Verfasst: Dienstag 10. August 2010, 11:10
von BlackJack
@Dav1d: Ich würde ja eher die Spalte als Datum deklarieren und `sqlite3.Timestamp.now()` verwenden. Ist besser als eine Zahl der Sekunden von einem bestimmten Zeitpunkt ab gerechnet wobei dieser Zeitpunkt halt nicht überall gleich interpretiert werden muss.
@Sync32: Es hilft nicht weiter wenn Du sagst Umlaute werden so "¶Ã¤" wiedergegeben, weil ja niemand weiss wie diese Glyphen da Zustandegekommen sind. An solchen Stellen solltest Du -- auch selbst! -- immer auf die Bytewerte schauen und nicht wie das irgendwo dargestellt werden mag.
Warum dekodierst Du mit "iso-8859-1"? Bist Du sicher dass die Daten in der Kodierung ankommen?