Thread: RE: [SQLObject] _fromDatabase + configurable database connections
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Jennings J. L C. 46 SK/C. <jar...@eg...> - 2005-07-19 21:59:42
|
kevin dangoor said: (darn you outlook) > The idea is to use a descriptor for > _connection, so that the value of _connection is arrived at > dynamically. That would be cool - but I'm also using _fromDatabase = True. I think that with a ConnectionHub to get and hold the connection, the immediate evaluation of _connection in SQLObject.addColumnsFromDatabase called from the __classinit__ would mean I still need a real connection by the time the class block is executed. Indeed, I don't see how you could magically put column objects in the class if you didn't have a connection when the __classinit__ ran; I think the only way you could do that is to not call addColumnsFromDatabase from __classinit__, so you'd have to say:: class User(SQLObject): _fromDatabase = True #... User._connection = myConnection User.addColumnsFromDatabase() u = User.get(17) print u.shortName |
From: Kevin D. <da...@gm...> - 2005-07-20 13:10:01
|
On 7/20/05, Jennings Jared L Contr 46 SK/CCI <jar...@eg...> wrote: > kevin dangoor said:=20 > > jared jennings said:=20 > > > class User(SQLObject):=20 > > > _fromDatabase =3D True=20 > > > #...=20 > > > User._connection =3D myConnection=20 > > > User.addColumnsFromDatabase()=20 > > > u =3D User.get(17)=20 > > > print u.shortName=20 > >=20 > > Does this work as written? Or do you get an error by=20 > > specifying _fromDatabase=3DTrue without providing a connection?=20 >=20 > No, there's an error. The __classinit__ calls addColumnsFromDatabase, whi= ch > fails without the _connection.=20 I guess it would be possible to add a flag that effectively says "I'll add the columns later" to help with this specific scenario. > I have an SQL script that sets up the database, so I didn't want to put t= he > field definitions in Python too. I couldn't create the tables using only > SQLObject, because (1) there are many people here for whom SQL is normal = and > Python is new, (2) there are permissions and views to set up.=20 Don't Repeat Yourself is a good motto. Actually, in the project I'm working on I have had to do some database-specific calls in the creation process (which is written in Python). What I did was access the low-level connection object (ie not SQLObject's connection object, but the one SQLObject is holding on to) to do the low-level stuff, and then I'd loop through the modules' __dicts__ to find SQLObject classes and create those tables in the database using SQLObject. > I could give up and put the column definitions in the class; this seems t= o > be more idiomatic to SQLObject, at least in my type of application.=20 Depending on how frequently you change your schema, that could be a real drag. Personally, I would either do the database initialization in a Python script (as above) or think about making addColumnsFromDatabase work as you have pictured above. Kevin |
From: Kevin D. <da...@gm...> - 2005-07-20 12:40:58
|
On 7/19/05, Jennings Jared L Contr 46 SK/CCI <jar...@eg...> wrote: > kevin dangoor said: (darn you outlook)=20 > > The idea is to use a descriptor for=20 > > _connection, so that the value of _connection is arrived at=20 > > dynamically.=20 >=20 > That would be cool - but I'm also using _fromDatabase =3D True. I think t= hat > with a ConnectionHub to get and hold the connection, the immediate > evaluation of _connection in > SQLObject.addColumnsFromDatabase called from the > __classinit__ would mean I still need a real connection by the time the > class block is executed.=20 Woops. I missed the _fromDatabase in my original reading of your message. You're right, it would be hard to figure out the columns without a database. >=20 > Indeed, I don't see how you could magically put column objects in the cla= ss > if you didn't have a connection when the __classinit__ ran; I think the o= nly > way you could do that is to not call addColumnsFromDatabase from > __classinit__, so you'd have to say::=20 >=20 > class User(SQLObject):=20 > _fromDatabase =3D True=20 > #...=20 > User._connection =3D myConnection=20 > User.addColumnsFromDatabase()=20 > u =3D User.get(17)=20 > print u.shortName=20 Does this work as written? Or do you get an error by specifying _fromDatabase=3DTrue without providing a connection? If this works as written, that seems like the most pleasant solution. To try to make SQLObject itself pull the columns from the database at first access or something like that could possibly get ugly. Kevin |