Thread: [SQLObject] bug with python24 and fromDatabase=True
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: sophana <so...@zi...> - 2006-04-04 23:27:15
|
Hi I'm running centos 4 which has python2.3. I installed python24 from atrpms to run kid templates. I have create an SQLObject with sqlmeta.fromDatabase=True. with python23, everything work fine with python24, I have an error when sqlobject list the columns. instead of getting strings, it gets an array object: seems like dbConnection.fetchAll returns weird values. >>> pdb.pm() > /usr/lib/python2.4/site-packages/SQLObject-0.7.0-py2.4.egg/sqlobject/mysql/mysqlconnection.py(140)guessClass() -> if t.startswith('int'): (Pdb) print t array('c', 'int(11) unsigned') (Pdb) print t.__class__ <type 'array.array'> (Pdb) l 135 # @@ skip extra... 136 results.append(colClass(**kw)) 137 return results 138 139 def guessClass(self, t): 140 -> if t.startswith('int'): 141 return col.IntCol, {} 142 elif t.startswith('varchar'): 143 if t.endswith('binary'): 144 return col.StringCol, {'length': int(t[8:-8]), 145 'char_binary': True} (Pdb) u > /usr/lib/python2.4/site-packages/SQLObject-0.7.0-py2.4.egg/sqlobject/mysql/mysqlconnection.py(130)columnsFromSchema() -> colClass, kw = self.guessClass(t) (Pdb) l 125 % tableName) 126 results = [] 127 for field, t, nullAllowed, key, default, extra in colData: 128 if field == 'id': 129 continue 130 -> colClass, kw = self.guessClass(t) 131 kw['name'] = soClass.sqlmeta.style.dbColumnToPythonAttr(field) 132 kw['notNone'] = not nullAllowed 133 kw['default'] = default 134 # @@ skip key... 135 # @@ skip extra... (Pdb) print colData ((array('c', 'id'), array('c', 'int(11) unsigned'), array('c'), array('c', 'PRI'), None, array('c', 'auto_increment')), (array('c', 'UserName'), array('c', 'varchar(64)'), array('c'), array('c', 'MUL'), array('c'), array('c')), (array('c', 'Attribute'), array('c', 'varchar(32)'), array('c'), array('c'), array('c'), array('c')), (array('c', 'op'), array('c', 'char(2)'), array('c'), array('c'), array('c', '=='), array('c')), (array('c', 'Value'), array('c', 'varchar(253)'), array('c'), array('c'), array('c'), array('c'))) (Pdb) |
From: Oleg B. <ph...@ma...> - 2006-04-05 07:38:56
|
On Wed, Apr 05, 2006 at 01:28:25AM +0200, sophana wrote: > 139 def guessClass(self, t): > 140 -> if t.startswith('int'): > 141 return col.IntCol, {} Is 't' an array here? Would it help if you insert the following code? def guessClass(self, t): + if isinstance(t, array): + t = t.tostring() if t.startswith('int'): return col.IntCol, {} Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Oleg B. <ph...@ph...> - 2006-04-05 08:11:13
|
(Reply to the list, please) On Wed, Apr 05, 2006 at 09:54:53AM +0200, sophana wrote: > in my previous mail, you can see that the whole colData elements are > array instead of strings. > > /usr/lib/python2.4/site-packages/SQLObject-0.7.0-py2.4.egg/sqlobject/mysql/mysqlconnection.py(130)columnsFromSchema() > > -> colClass, kw = self.guessClass(t) > (Pdb) l > 125 % tableName) > 126 results = [] > 127 for field, t, nullAllowed, key, default, extra in colData: > (Pdb) print colData > ((array('c', 'id'), array('c', 'int(11) unsigned'), array('c'), > array('c', 'PRI'), None, array('c', 'auto_increment')), (array('c', > 'UserName'), array('c', 'varchar(64)'), array('c'), array('c', 'MUL'), > array('c'), array('c')), (array('c', 'Attribute'), array('c', > 'varchar(32)'), array('c'), array('c'), array('c'), array('c')), > (array('c', 'op'), array('c', 'char(2)'), array('c'), array('c'), > array('c', '=='), array('c')), (array('c', 'Value'), array('c', > 'varchar(253)'), array('c'), array('c'), array('c'), array('c'))) A big tuple of arrays. "for" loop will assign an array for its every varaible including 't'. Right? Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: sophana <so...@zi...> - 2006-04-05 12:35:20
|
Oleg Broytmann wrote: >(Reply to the list, please) > >On Wed, Apr 05, 2006 at 09:54:53AM +0200, sophana wrote: > > >>in my previous mail, you can see that the whole colData elements are >>array instead of strings. >> >>/usr/lib/python2.4/site-packages/SQLObject-0.7.0-py2.4.egg/sqlobject/mysql/mysqlconnection.py(130)columnsFromSchema() >> >>-> colClass, kw = self.guessClass(t) >>(Pdb) l >>125 % tableName) >>126 results = [] >>127 for field, t, nullAllowed, key, default, extra in colData: >> >> > > > >>(Pdb) print colData >>((array('c', 'id'), array('c', 'int(11) unsigned'), array('c'), >>array('c', 'PRI'), None, array('c', 'auto_increment')), (array('c', >>'UserName'), array('c', 'varchar(64)'), array('c'), array('c', 'MUL'), >>array('c'), array('c')), (array('c', 'Attribute'), array('c', >>'varchar(32)'), array('c'), array('c'), array('c'), array('c')), >>(array('c', 'op'), array('c', 'char(2)'), array('c'), array('c'), >>array('c', '=='), array('c')), (array('c', 'Value'), array('c', >>'varchar(253)'), array('c'), array('c'), array('c'), array('c'))) >> >> > > A big tuple of arrays. "for" loop will assign an array for its every >varaible including 't'. Right? > >Oleg. > > briefly looking at the code, it seems that all these arrays should have been strings. colData comes from a self.queryAll call which is handled in the dbconnection.py. colData = self.queryAll("SHOW COLUMNS FROM %s" % tableName) itself call cursor.fetchall() to get all these arrays. As I don't know what it is, I didn't go farther. Note: my other sqlobjects without fromDatabase=true work fine. |
From: sophana <so...@zi...> - 2006-04-06 12:35:40
|
did some debug. seems that the faulting array comes from mysqldb cursors. There is are function char_array that gets called in MySqlDb/converters.py. def char_array(s): return array.array('c', s) ... FIELD_TYPE.STRING: [ (FLAG.BINARY, char_array), (None, None), ], does this mean that there is a binary flag somewhere that make this conversion? I installed MySQL-python-1.2.1c6.tar.gz, is it supported? |
From: Oleg B. <ph...@ma...> - 2006-04-06 12:47:48
|
On Thu, Apr 06, 2006 at 02:35:20PM +0200, sophana wrote: > I installed MySQL-python-1.2.1c6.tar.gz, is it supported? 1.2.0 is supported, I think. Is 1.2.1 so much different? Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |