From: inhahe <in...@gm...> - 2008-12-03 23:47:12
|
hello, can someone tell me why i'm getting this error/how to avoid it? here's my code: ----tablestest.py--- from sqlobject import * class Houses(SQLObject): pass class Bathrooms(SQLObject): house = ForeignKey("Houses") index1 = DatabaseIndex(house) ----the file i invoke--- from sqlobject import * from connectstr import connectstr connection = connectionForURI(connectstr) sqlhub.processConnection = connection import tablestest for name in dir(tablestest): obj = getattr(tablestest, name) if hasattr(obj, "createTable"): print obj obj.createTable() ---the error--- <class 'tablestest.Bathrooms'> Traceback (most recent call last): File "E:\MERCUR~1\maketablestest.py", line 15, in <module> obj.createTable() File "d:\Python25\lib\site-packages\sqlobject-0.11dev_r3611-py2.5.egg\sqlobject\main.py", line 1399, in createTable conn.query(constraint) File "d:\Python25\lib\site-packages\sqlobject-0.11dev_r3611-py2.5.egg\sqlobject\dbconnection.py", line 346, in query return self._runWithConnection(self._query, s) File "d:\Python25\lib\site-packages\sqlobject-0.11dev_r3611-py2.5.egg\sqlobject\dbconnection.py", line 259, in _runWithConnection val = meth(conn, *args) File "d:\Python25\lib\site-packages\sqlobject-0.11dev_r3611-py2.5.egg\sqlobject\dbconnection.py", line 343, in _query self._executeRetry(conn, conn.cursor(), s) File "d:\Python25\lib\site-packages\sqlobject-0.11dev_r3611-py2.5.egg\sqlobject\mysql\mysqlconnection.py", line 117, in _executeRetry raise OperationalError(ErrorMessage(e)) sqlobject.dberrors.OperationalError: Can't create table '.\ml\#sql-ac_a6.frm' (errno: 150) I noticed that if I change the names of Houses and Bathrooms to A and B, I don't get the error. i'm using MySQL 5.0 and SQLObject 0.11. |
From: Oleg B. <ph...@ph...> - 2008-12-04 00:03:44
|
On Wed, Dec 03, 2008 at 06:47:07PM -0500, inhahe wrote: > ----tablestest.py--- > from sqlobject import * > class Houses(SQLObject): > pass > class Bathrooms(SQLObject): > house = ForeignKey("Houses") > index1 = DatabaseIndex(house) > > ----the file i invoke--- > from sqlobject import * > from connectstr import connectstr > connection = connectionForURI(connectstr) > sqlhub.processConnection = connection > import tablestest > for name in dir(tablestest): > obj = getattr(tablestest, name) > if hasattr(obj, "createTable"): > print obj > obj.createTable() dir() returns objects in a random order. It could be that dir() returns 'Bathrooms' before 'Houses', and MySQL reports it cannot create a FOREIGN KEY that points to a non-existing table. Solution: create the tables in the proper order - Houses first. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: inhahe <in...@gm...> - 2008-12-04 01:02:07
|
On Wed, Dec 3, 2008 at 7:03 PM, Oleg Broytmann <ph...@ph...> wrote: > On Wed, Dec 03, 2008 at 06:47:07PM -0500, inhahe wrote: >> ----tablestest.py--- >> from sqlobject import * >> class Houses(SQLObject): >> pass >> class Bathrooms(SQLObject): >> house = ForeignKey("Houses") >> index1 = DatabaseIndex(house) >> >> ----the file i invoke--- >> from sqlobject import * >> from connectstr import connectstr >> connection = connectionForURI(connectstr) >> sqlhub.processConnection = connection >> import tablestest >> for name in dir(tablestest): >> obj = getattr(tablestest, name) >> if hasattr(obj, "createTable"): >> print obj >> obj.createTable() > > dir() returns objects in a random order. It could be that dir() returns > 'Bathrooms' before 'Houses', and MySQL reports it cannot create a FOREIGN > KEY that points to a non-existing table. > Solution: create the tables in the proper order - Houses first. Oh, good point, thanks. Although I installed the latest bugfix release and I don't have the problem anymore. Although I'm a little confused about how the various releases work and why the latest bugfix version is 0.7 when I previously had 0.11. It was definitely doing the 'Bathrooms' table first though. The thing is I don't really know how I should do this. I don't think the documentation sufficiently explains how we should initially make the the tables vs. just have the classes defined so we can use them. I don't want to have to make two files, each defining each class, one for creating the tables and one for using them, and then have to update both files every time I change a column. So that's why I tried it the way I did. But like you said, dir can return them in any order. So what's a good way to do this? Thanks |
From: Oleg B. <ph...@ph...> - 2008-12-04 08:24:38
|
On Wed, Dec 03, 2008 at 08:02:03PM -0500, inhahe wrote: > Oh, good point, thanks. Although I installed the latest bugfix > release and I don't have the problem anymore. Although I'm a little > confused about how the various releases work and why the latest bugfix > version is 0.7 when I previously had 0.11. The latest bugfixes are 0.9.7 and 0.10.3. Version 0.7 is rather old, and version 0.11 is not yet released. > It was definitely doing the 'Bathrooms' table first though. The > thing is I don't really know how I should do this. I don't think the > documentation sufficiently explains how we should initially make the > the tables vs. just have the classes defined so we can use them. I > don't want to have to make two files, each defining each class, one > for creating the tables and one for using them, and then have to > update both files every time I change a column. So that's why I tried > it the way I did. But like you said, dir can return them in any > order. So what's a good way to do this? Thanks I am satisfied with just Houses.createTable() Bathrooms.createTable() I seldom create tables, mostly I use tables that were created long ago. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |