I think I made some progress and wanted to share it. I'm forced to use
threadlocal because TurboGears uses it. My SA definitions exist outside
of TG so I have to associate a connection to them after they are
imported, and that's where I've been hung up.
When sqlalchemy.mods.threadlocal is imported, a global SessionContext is
created and associated to all mappers (from the docs) and references via
sqlalchemy.objectstore. That's great, but how to I hook up an engine?
Without threadlocal, I would use create_session(bind_to=engine), but my
session already exists as sqlalchemy.objectstore and I can't find any
way to assign an engine to it. A solution, I found was to define the
engine for the metadata. So I would fetch a class and get to it's
metadata like this:
metadata = class_mapper(Project).mapped_table.metadata
Then connect like so:
metadata.connect(my_engine)
Now, every class that uses metadata is connected when using the
threadlocal SessionContext. So now I can to this:
project = sqlalchemy.objectstore.query(Project).select()[0]
But I would get an error if I did this:
print project.reviewer
Because reviewer uses a different DynamicMetaData instance. So to get
it connected I do:
class_mapper(User).mapped_table.connect(my_engine)
Now I can access project.reviewer.
Now I'm off to apply this in TG.
Randall
Randall Smith wrote:
> Michael Bayer wrote:
>
>>it seems from symptom 1 and symptom 2 that your objects are not
>>finding their way into Sessions, or are getting removed. if you
>>stick with the simpler pattern above, it should be clear what Session
>>your objects are a part of. symptom 2 also should be raising an
>>error instead of returning None/blank list; you should use the latest
>>trunk until i release 0.2.4 which fixes this issue.
>>
>
>
> I can't use the simple pattern. I'm using a RESTful pattern in which
> the data record's ID is taken from the URL and looked up before the
> requested action is taken. So in this case, _get_item looks up the
> project and passes it to the save method. So how do I operate on
> 'project' after it is received by the saved method? I thought I could
> retrieve the session and go from there.
>
> def _get_item(self, atom):
> session = create_session(engine)
> query = session.query(Project)
> project = query.get(int(atom))
> return project
>
> def save(self, project, **data):
> session = sqlalchemy.object_mapper(project).get_session()
> project.title = data['title']
> session.flush()
> tg.flash("Changes saved!")
> raise tg.redirect("/")
>
> The simple patterns never seem to suffice past the tutorial stage.
> Requirements get complicated really quickly.
>
> Randall
>
>
> Using Tomcat but need to do more? Need to support web services, security?
> Get stuff done quickly with pre-integrated technology to make your job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users