mysql und wxwidgets

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich benutze eine MySQL-Abfrage, die mir Textfelder in einem wxwidgets Frame anzeigen soll. die Routine sieht so aus:

Code: Alles auswählen

   def refreshForm (self):
		conn = dbtools.opendb ()
		cursor = conn.cursor()
		cursor.execute("""SELECT
			name, vname, strasse, tel, mobil, email,
			fax, web, plz, ort
			from kontakte
			where id = %s""", self.getDataId (self))
		ergebnis = cursor.fetchall ()
		conn.close ()
		for row in ergebnis:
			self.text_name.SetValue (row [0])
			self.text_vname.SetValue (row [1])
			self.text_strasse.SetValue (row [2])
			self.text_tel.SetValue (row [3])
			self.text_mobil.SetValue (row [4])
			self.text_email.SetValue (row [5])
			self.text_fax.SetValue (row [6])
			self.text_web.SetValue (row [7])
			self.text_plz.SetValue (row [8])
			self.text_ort.SetValue (row [9])
Das funktioniert auch so weit, bis in der Datenbank, oder einem entsprechendem Feld ein "äöß" oder so vorkommt, dann bekomme ich eine Fehlermeldung:

Code: Alles auswählen

UnicodeDecodeError: 'utf8' codec can't decode byte 0xfc in position 6: invalid start byte
Das liegt wohl an der Zeichencodierung, aber wie kann ich das Problem umgehen?
deets

Indem du dir die Dokumentation zu MySQLdb durchliest & deine Datenbankverbindung so konfigurierst, dass sie unicode-Objekte zurueckliefert. Dann sollte es eigentlich gehen.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Aso, hatte ich mich noch nie weiter drum gekümmert. Ich hoffe, man kann das gleich beim öffen der Datenbank erledigen ...
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du MySQL direkt benutzt kann das ein bisschen tricky sein, weil es ein Transfer-Encoding, ein Client-Encoding und ein Server-Encoding gibt. Außerdem hat die Tabelle ein Encoding. Teilweise wird zwar automatisch gewandelt, aber nicht überall...

Bei Debian / Ubuntu steht in der Default-Installation - warum auch immer - das Transferencoding auf Latin-1... Das kannst du aber mit dem "SET..." Befehlt von MySQL übersteuern. Oder du änderst direkt die Konfiguration von MySQL. Das ist recht easy und im Handbuch erklärt.

Oder du nimmst SQLAlchemy, da kann man es bei der Festlegung der Engine nämlich definitiv einstellen, ob SQLAlchemy nur Unicode liefern soll. :-)

Gruß, noisefloor
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Oder du nimmst SQLAlchemy, da kann man es bei der Festlegung der Engine nämlich definitiv einstellen, ob SQLAlchemy nur Unicode liefern soll.
Sagt mir jetzt gar nichts. Was ist denn das?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

grrrrrrr. Man, ich habe nen Internetführerschein ;)
Das sieht auf den ersten Blick ganz gut aus. Wenn das ne Art Framework für mySQL, klingt das sehr interessant für mich.
lunar

Nicht nur für MySQL, sondern für jedes auch nur einigermaßen bekanntes DBMS. Absolut empfehlenswert für jedweden Kontakt mit SQL.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Das schaue ich mir genauer an. Danke.
Kollege programmiert Java und der meinte das so was standart ist. Ihm idst es egal, welche Datenbank dahinter steckt, da Java das wohl auch transparent macht.
lunar

@The Hit-Man: Als Pendant zu SQLAlchemy gibt es in Java Hibernate, doch diese Bibliothek ist nicht Bestandteil der Standardbibliothek, also auch nicht „Standard“ im eigentlichen Sinne. Dein Kollege bezieht sich also wohl eher auf JDBC, das Pendant zur DB-API, welches mitnichten äquivalent zu SQLAlchemy ist, sondern nur – wie die DB-API unter Python – eine standardisierte API für Datenbankabfragen bietet, ohne allerdings von den Eigenheiten des jeweiligen DBMS zu abstrahieren.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@The Hit-Man: Wichtig ist, dass SQLAlchemy nicht nur ein ORM ist, sondern - wie lunar sagt - viel mehr. Es gibt die SQL Expression Language (quasi "SQL auf pythonisch"), SQLSoup, usw. Du kannst SQLAlchemy auch "nur" für das Connection Pooling und die Engine (=DB-Anbindung) an sich nutzen und den Rest in "rohem" SQL abwickeln.

Als Einsteigslektüre ist die offizielle Doku sehr empfehlenswert. Die umfasst immerhin 200 Seiten.

Gruß, noisefloor
Antworten