MySQL: select von sets ergibt TypeError

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
bitztoo
User
Beiträge: 4
Registriert: Freitag 6. März 2009, 18:07

Samstag 7. März 2009, 00:39

Hallo,

Ich bin hier am verzweifeln, weil ich ein MySQL set() nicht abfragen kann. In der DB ist ein Feld als set('x', 'y', 'z') definiert, und sobald ein solches Feld z.B. den Inhalt "x,y" enthält, scheitert eine simple "SELECT * FROM table mit der folgender Fehlermeldung:

Code: Alles auswählen

  File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line 158, in execute
    self.errorhandler(self, TypeError, m)
  File "/usr/lib/python2.4/site-packages/MySQLdb/connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
TypeError: str() takes at most 1 argument (2 given)
Ich verwendet Python-MySQLdb 1.2.1. Was mach ich falsch? Bin dankbar für jeden Hinweis!
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Samstag 7. März 2009, 09:19

Hallo,

poste mal deinen Code wo der besagte Fehler auftritt. Dann können wir dir weiterhelfen.

Grüße

Martin
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 7. März 2009, 11:01

Kurz gegoogelt, könnte es dieser Bug sein?

http://lists.alioth.debian.org/pipermai ... 01038.html

Stefan
bitztoo
User
Beiträge: 4
Registriert: Freitag 6. März 2009, 18:07

Samstag 7. März 2009, 12:24

Ja, es scheint dieser Bug zu sein. Mit MySQLdb 1.2.2 klappts.

Ein Beispiel um das Problem zu illustrieren:

Code: Alles auswählen

>>> import MySQLdb
>>> conn = MySQLdb.connect(host=dbhost,user=dbuser,passwd=dbpass,db=dbname)
>>> cursor = conn.cursor()
>>> query = "CREATE TABLE `table_1` (`id` int(16) NOT NULL DEFAULT '0',`set_field` set('x','y','z') COLLATE utf8_unicode_ci NOT NULL DEFAULT '')"
>>> cursor.execute(query)
0L
>>> query = "INSERT INTO table_1 (set_field) VALUES('x')"
>>> cursor.execute(query)
1L
>>> query = "SELECT * FROM table_1"
>>> cursor.execute(query)
1L
>>> row = cursor.fetchall()
>>> print row
((0L, 'x'),)
>>> query="INSERT INTO table_1 (set_field) VALUES('x,y')"
>>> cursor.execute(query)
1L
>>> query = "SELECT * FROM table_1"
>>> cursor.execute(query)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line 158, in execute
    self.errorhandler(self, TypeError, m)
  File "/usr/lib/python2.4/site-packages/MySQLdb/connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
TypeError: str() takes at most 1 argument (2 given)
Mit MySQLdb 1.2.2 siehts so aus:

Code: Alles auswählen

>>> import MySQLdb
>>> conn = MySQLdb.connect(host=dbhost,user=dbuser,passwd=dbpass,db=dbname)
>>> cursor = conn.cursor()
>>> query = "CREATE TABLE `table_1` (`id` int(16) NOT NULL DEFAULT '0',`set_field` set('x','y','z') COLLATE utf8_unicode_ci NOT NULL DEFAULT '')"
>>> cursor.execute(query)
0L
>>> query = "INSERT INTO table_1 (set_field) VALUES('x')"
>>> cursor.execute(query)
1L
>>> query = "SELECT * FROM table_1"
>>> cursor.execute(query)
1L
>>> row = cursor.fetchall()
>>> print row
((0L, 'x'),)
>>> query="INSERT INTO table_1 (set_field) VALUES('x,y')"
>>> cursor.execute(query)
1L
>>> query = "SELECT * FROM table_1"
>>> cursor.execute(query)
2L
>>> row = cursor.fetchall()
>>> print row
((0L, 'x,y'), (0L, 'x'))
Antworten