BTW, just wanted to take a moment to say "Thanks!" to all who contribute to SA,
and especially to Mike, who is simply amazing! I just upgraded to 0.3 without a
hitch. This is by far the most painless upgrade I've had so far. Keep up the
good work.
~ Daniel
P.S. Sorry for my apparent absence lately. I've been lurking, but haven't had
the time to contribute very much. I'm in the middle of a huge project
deployment and don't have much time for anything else.
Michael Bayer wrote:
> After a marathon of doc edits and fixes this weekend (and still so
> much on the docs is inaccurate...geez..) I've put out the first
> release of the 0.3.0 series. Our last release was over 6 weeks ago
> which is way too long to be holding back the tons of little bugfixes
> that have piled up. At the same time, a lot of internal re-
> architecting has gone on, particularly in the ORM, with an emphasis
> on clarifcation of concepts, removal of hacky/crufty ways of doing
> things, cutting down the tall weeds of things that were written a
> year ago, etc. If you've ever wanted to tackle the ORM source code,
> this is the best time to do so, as a whole lot of stuff that nobody
> could ever understand, including me, has been ripped out and
> simplified, made more explicit, had logging added, etc. The
> rearchitecting is the main reason i wanted to push onto a new major
> version number, since it pushes SA's "maturity" factor one notch up
> (i.e. a 3 on a scale of 1 to 10).
>
> Some cool things that were impossible in the last release:
>
> ------------------------------------------
>
> Define two tables with a circular foreign key dependency on each
> other ! (yes, it uses ALTER TABLE):
>
> t1 = Table('table1', meta,
> Column('id', Integer, primary_key=True),
> Column('t2_id', Integer, ForeignKey('t2.id'))
> )
>
> t2 = Table('table2', meta,
> Column('id', Integer, primary_key=True),
> Column('t1_id', Integer, ForeignKey('t1.id', use_alter=True,
> name='t2id_fk'))
> )
>
> meta.create_all()
>
> Notice the "use_alter" flag, which also requires explicitly naming
> the foreign key.
>
> ------------------------------------------
>
> UniqueConstraint :
>
> t1 = Table('sometable', meta, Column(...), UniqueConstraint('id',
> 'version'))
>
> ------------------------------------------
>
> CheckConstraint:
>
> t1 = Table('sometable', meta, Column('x', Integer), Column('y',
> Integer), CheckConstraint('x+y>10'))
>
> ------------------------------------------
>
> Fancy Query operations - per-query MapperExtensions, SelectResults
> can build joins on the fly:
>
> result = session.query(SomeClass).\
> options(extension(SelectResultsExt())).select().\
> outerjoin_to('orders').outerjoin_to('items').\
> select(or_(Order.c.order_id==None,Item.c.item_id==2)).list()
>
> ------------------------------------------
>
> Pessimistic Locking (still needs documentation, spec is in ticket 292):
>
> q = session.query(SomeClass).with_lockmode('update').get(5)
>
> ------------------------------------------
>
> Multi-column stored procedures as selectables (with supporting
> databases, i.e. postgres and oracle):
>
> myproc = select([
> column('x', type=Integer),
> column('y', type=Integer),
> column('status', type=String),
> ], from_obj=[func.my_stored_procedure(bindparam('x'),
> bindparam('y'), bindparam('z'))],
> engine=myengine
> )
>
> for row in myproc.execute(x=5,y=7,z=10):
> print row['x'], row['y'], row['status']
>
> ------------------------------------------
>
> Individual TypeEngines now define the method used by the ORM to
> detect changes on an attribute (i.e. like Hibernate does), which
> supports "mutable" types such as PickleType:
>
> graphs = Table('graphs', meta, Column('id', Integer,
> primary_key=True),
> Column('data', PickleType)
> )
>
> class Graph(object):pass
> class Point(object):
> def __init__(self, x, y):
> self.x = x
> self.y = y
>
> mapper(Graph, graphs)
>
> g = Graph()
> g.data = [Point(1,2), Point(3,5), Point(10,15)]
> session.save(g)
> session.flush()
> session.clear()
>
> # changes within the contents of "data" are detected, even though no
> # "setter" operation occured on "g"
> g = session.query(Graph).get_by(id=g.id)
> g.data[2] = Point(19,12)
> session.flush()
>
> PickleType can be set up with "mutable=False" if you want to prevent
> the comparison operation (or make your own PickleType with your own
> comparison operation).
>
> ------------------------------------------
>
> full CHANGES list, which includes every enhancement and most bugfixes
> (minor bugfixes can be viewed on the timeline), can be viewed on the
> site:
>
> http://www.sqlalchemy.org/CHANGES
>
>
> - mike
>
>
>
>
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sqlalchemy
-~----------~----~----~----~------~----~------~--~---