I noticed a significant performance increase between 0.5.2 and 0.5.3. While tracking down an unrelated issue I had written a dummy test that ran some SA code inside of a "for i in range(1000):" and going from 0.5.2 and 0.5.3 execution went from 14minutes to 12minutes.
Keep in mind this was a very unscientific measurement, but still awesome. Michael Bayer wrote: > I've been a little busy lately so we're a month off on this one, but > there's a trove of bugfixes in this one, largely related to new > features that are specific to the 0.5 series, as well as some > behavioral enhancements to Query and declarative - read the changelog > for details. I'm hammering on this release quite fiercely for a real > project right now (which has driven a good chunk of the fixes) so it > has my seal of approval. > > Download SQLAlchemy 0.5.3 at: http://www.sqlalchemy.org/download.html . > > 0.5.3 > ===== > - orm > - The "objects" argument to session.flush() is deprecated. > State which represents the linkage between a parent and > child object does not support "flushed" status on > one side of the link and not the other, so supporting > this operation leads to misleading results. > [ticket:1315] > > - Query now implements __clause_element__() which produces > its selectable, which means a Query instance can be accepted > in many SQL expressions, including col.in_(query), > union(query1, query2), select([foo]).select_from(query), > etc. > > - Query.join() can now construct multiple FROM clauses, if > needed. Such as, query(A, B).join(A.x).join(B.y) > might say SELECT A.*, B.* FROM A JOIN X, B JOIN Y. > Eager loading can also tack its joins onto those > multiple FROM clauses. [ticket:1337] > > - Fixed bug in dynamic_loader() where append/remove events > after construction time were not being propagated to the > UOW to pick up on flush(). [ticket:1347] > > - Fixed bug where column_prefix wasn't being checked before > not mapping an attribute that already had class-level > name present. > > - a session.expire() on a particular collection attribute > will clear any pending backref additions as well, so that > the next access correctly returns only what was present > in the database. Presents some degree of a workaround for > [ticket:1315], although we are considering removing the > flush([objects]) feature altogether. > > - Session.scalar() now converts raw SQL strings to text() > the same way Session.execute() does and accepts same > alternative **kw args. > > - improvements to the "determine direction" logic of > relation() such that the direction of tricky situations > like mapper(A.join(B)) -> relation-> mapper(B) can be > determined. > > - When flushing partial sets of objects using > session.flush([somelist]), > pending objects which remain pending after the operation won't > inadvertently be added as persistent. [ticket:1306] > > - Added "post_configure_attribute" method to > InstrumentationManager, > so that the "listen_for_events.py" example works again. > [ticket:1314] > > - a forward and complementing backwards reference which are both > of the same direction, i.e. ONETOMANY or MANYTOONE, > is now detected, and an error message is raised. > Saves crazy CircularDependencyErrors later on. > > - Fixed bugs in Query regarding simultaneous selection of > multiple joined-table inheritance entities with common base > classes: > > - previously the adaption applied to "B" on > "A JOIN B" would be erroneously partially applied > to "A". > > - comparisons on relations (i.e. A.related==someb) > were not getting adapted when they should. > > - Other filterings, like > query(A).join(A.bs).filter(B.foo=='bar'), were erroneously > adapting "B.foo" as though it were an "A". > > - Fixed adaptation of EXISTS clauses via any(), has(), etc. > in conjunction with an aliased object on the left and > of_type() on the right. [ticket:1325] > > - Added an attribute helper method ``set_committed_value`` in > sqlalchemy.orm.attributes. Given an object, attribute name, > and value, will set the value on the object as part of its > "committed" state, i.e. state that is understood to have > been loaded from the database. Helps with the creation of > homegrown collection loaders and such. > > - Query won't fail with weakref error when a non-mapper/class > instrumented descriptor is passed, raises > "Invalid column expession". > > - Query.group_by() properly takes into account aliasing applied > to the FROM clause, such as with select_from(), using > with_polymorphic(), or using from_self(). > > - sql > - An alias() of a select() will convert to a "scalar subquery" > when used in an unambiguously scalar context, i.e. it's used > in a comparison operation. This applies to > the ORM when using query.subquery() as well. > > - Fixed missing _label attribute on Function object, others > when used in a select() with use_labels (such as when used > in an ORM column_property()). [ticket:1302] > > - anonymous alias names now truncate down to the max length > allowed by the dialect. More significant on DBs like > Oracle with very small character limits. [ticket:1309] > > - the __selectable__() interface has been replaced entirely > by __clause_element__(). > > - The per-dialect cache used by TypeEngine to cache > dialect-specific types is now a WeakKeyDictionary. > This to prevent dialect objects from > being referenced forever for an application that > creates an arbitrarily large number of engines > or dialects. There is a small performance penalty > which will be resolved in 0.6. [ticket:1299] > > - sqlite > - Fixed SQLite reflection methods so that non-present > cursor.description, which triggers an auto-cursor > close, will be detected so that no results doesn't > fail on recent versions of pysqlite which raise > an error when fetchone() called with no rows present. > > - postgres > - Index reflection won't fail when an index with > multiple expressions is encountered. > > - Added PGUuid and PGBit types to > sqlalchemy.databases.postgres. [ticket:1327] > > - Refection of unknown PG types won't crash when those > types are specified within a domain. [ticket:1327] > > - mssql > - Preliminary support for pymssql 1.0.1 > > - Corrected issue on mssql where max_identifier_length was > not being respected. > > - extensions > > - Fixed a recursive pickling issue in serializer, triggered > by an EXISTS or other embedded FROM construct. > > - Declarative locates the "inherits" class using a search > through __bases__, to skip over mixins that are local > to subclasses. > > - Declarative figures out joined-table inheritance primary join > condition even if "inherits" mapper argument is given > explicitly. > > - Declarative will properly interpret the "foreign_keys" argument > on a backref() if it's a string. > > - Declarative will accept a table-bound column as a property > when used in conjunction with __table__, if the column is already > present in __table__. The column will be remapped to the given > key the same way as when added to the mapper() properties dict. > > > > > > -- David Gardner Pipeline Tools Programmer, "Sid the Science Kid" Jim Henson Creature Shop dgard...@creatureshop.com --~--~---------~--~----~------------~-------~--~----~ 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 sqlalchemy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---