On Sep 29, 2008, at 5:22 PM, Christoph Zwerschke wrote:

>
> Hi Michael,
>
> we're just discussing some issues with SQLAlchemy over at the  
> TurboGears
> mailing list which appeared because the new SQLAlchemy usage as  
> promoted
> in the 0.5 docs differs from the classical usage. We are unsure how to
> solve these issues, so I thought it will be best to get some input and
> suggestions from you.
>
> In the TurboGears project, our standard application templates for
> SQLAlchemy create models in the classical (non-declarative) way.
>
> To make this a bit more convenient, TurboGears creates a scoped  
> session
> and maps the model classes with this session's mapper (i.e. with a
> contextual, session-aware mapper that is made available to the
> TurboGears application). This worked very well for us, but now with SA
> 0.5, the declarative usage becomes more popular, which uses a normal
> (not contextual) mapper. The existence of contextual mappers is not  
> even
> mentioned any more in the SA 0.5 docs. Is this an omission or is my
> impression right that you want to phase out this kind of usage?
>
> Another point is that our default scoped_session(create_session) in
> TurboGears creates sessions with autoflush=False and autocommit=True,
> while defaults sessionmaker() sessions in SQLAlchemy now have the
> opposite, autoflush=True and autocommit=False. So maybe our usage is
> outdated in that regard, too?
>
> What kind of usage do you suggest to provide as default in our
> TurboGears app templates that will be as convenient for the average  
> user
> and as future-safe as possible?

your current approach of using classical mappings with Session.mapper  
is entirely supported.   sessionmaker() and create_session retain the  
same defaults as they did in 0.4 as well.   The name of the  
"transactional" flag has been renamed to "autocommit" with a flip in  
its boolean status, but the "transactional" flag works throughout 0.5  
with a deprecation warning.

So as far as "future safe", you're entirely fine.

Now as far as where its going, we are pushing the declarative syntax,  
particularly for people in the "up and running" mindset, because it  
suits a large number of applications and removes the common SQLA  
criticism that our configuration is "too verbose".   Declarative is in  
fact just a very thin configurational layer on top of the standard  
mapper() and Table constructs, so it works with all current mapper  
configurations, including Session.mapper - just pass Session.mapper as  
the "mapper" keyword argument in declarative_base().  The declarative  
system is sparse and open ended, works in conjunction with explicit  
Table objects as well as explict mapper() setups, can be customized at  
the metaclass or base class level, and can be used *without* a  
metaclass too which is how Grok is doing it.   So if your users seem  
to prefer that syntax, you probably want to push TG towards that  
approach.

As far as why Session.mapper itself isn't talked about much, the  
existence of that feature is to me, a historical one dating back to  
the 0.1 series.   It provides three pieces of functionality - a  
default __init__() method which populates an instance from keyword  
arguments, a "query" attribute which is shorthand for  
Session.query(cls), and it automatically "saves" the instance to the  
Session upon init (now called add()).   The most controversial  
function is the auto-save.  Back when the feature was more popular, we  
regularly would get users that were confused when they tried to work  
with explicit sessions and add objects to them, since they were  
magically saved on construction.  When the autoflush option was  
introduced, we had users who couldn't use it because it would flush()  
the object before __init__ had completed, for __init__ methods that  
used the Query to locate dependent data.  It saves before __init__  
proceeds, and we couldn't even change that because it would break  
other people's code.

Because SQLA really doesn't want to be in the "framework" business,  
we've pulled way back on Session.mapper.  The __init__() method it  
provides is trivial to implement in a base class, and is also provided  
when using the declarative extension.  The "query" attribute is also  
trivial to implement, but we've added a helper onto Session called  
query_property() which provides this.  If an application wishes to  
have a certain set of behaviors for all of its mapped classes, we  
really want developers to create their own base classes which provide  
whatever functionality they want.  This idea has been prevalent since  
we introduced 0.4.

So without reading the thread, I think declarative would probably be  
good, you can use it with Session.mapper if you want, though I view  
Session.mapper as somewhat legacy.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to