there are around 2500 On Oct 24, 2010, at 2:48 PM, Alexandre Conrad wrote:
> This is amazing work! Thanks Mike. I am truly flabbergasted (heh, I > always wanted to use that word somehow). > > How many tests are there? > > > 2010/10/24 Michael Bayer <mike...@zzzcomputing.com>: >> Greetings - >> >> SQLAlchemy 0.6.5 is released. As we approach towards the start of 0.7, >> where a good stack of branches are accumulating, the 0.6 series starts to >> come in for a landing. 0.6 has been tremendously successful, with 0.6.4 >> logging 28,143 downloads from Pypi alone over a period of 7 weeks. I've >> rolled out the 0.6 series on two different very different projects - one a >> sprawling, rapidly developed social media platform, the other a formal and >> constrained financial analysis application. Both exercise the ORM and Core >> to a very deep degree in a broad range of situations - within web >> applications which make heavy usage of the Beaker caching system and various >> forms of eager loading, within backend services that run many concurrent >> operations and transactions via multiprocessing, in bulk loader scripts >> which efficiently flush through tens of thousands of interconnected objects, >> in expressions that make great usage of dates, intervals, decimals, custom >> types, generic transformations and subqueries, in models constructed around >> joined and single table inheritance, update and delete cascades, lots of >> transparent versioning. So I'm pretty happy with it, and I hope most people >> out there are as well. >> >> 0.6.5 has the usual longer than expected list of changes, a bunch of new >> features, fixes for many mostly relatively minor bugs. >> >> Download SQLAlchemy 0.6.5 at : >> >> http://www.sqlalchemy.org/download.html >> >> 0.6.5 >> ===== >> - orm >> - Added a new "lazyload" option "immediateload". >> Issues the usual "lazy" load operation automatically >> as the object is populated. The use case >> here is when loading objects to be placed in >> an offline cache, or otherwise used after >> the session isn't available, and straight 'select' >> loading, not 'joined' or 'subquery', is desired. >> [ticket:1914] >> >> - New Query methods: query.label(name), query.as_scalar(), >> return the query's statement as a scalar subquery >> with /without label [ticket:1920]; >> query.with_entities(*ent), replaces the SELECT list of >> the query with new entities. >> Roughly equivalent to a generative form of query.values() >> which accepts mapped entities as well as column >> expressions. >> >> - Fixed recursion bug which could occur when moving >> an object from one reference to another, with >> backrefs involved, where the initiating parent >> was a subclass (with its own mapper) of the >> previous parent. >> >> - Fixed a regression in 0.6.4 which occurred if you >> passed an empty list to "include_properties" on >> mapper() [ticket:1918] >> >> - Fixed labeling bug in Query whereby the NamedTuple >> would mis-apply labels if any of the column >> expressions were un-labeled. >> >> - Patched a case where query.join() would adapt the >> right side to the right side of the left's join >> inappropriately [ticket:1925] >> >> - Query.select_from() has been beefed up to help >> ensure that a subsequent call to query.join() >> will use the select_from() entity, assuming it's >> a mapped entity and not a plain selectable, >> as the default "left" side, not the first entity >> in the Query object's list of entities. >> >> - The exception raised by Session when it is used >> subsequent to a subtransaction rollback (which is what >> happens when a flush fails in autocommit=False mode) has >> now been reworded (this is the "inactive due to a >> rollback in a subtransaction" message). In particular, >> if the rollback was due to an exception during flush(), >> the message states this is the case, and reiterates the >> string form of the original exception that occurred >> during flush. If the session is closed due to explicit >> usage of subtransactions (not very common), the message >> just states this is the case. >> >> - The exception raised by Mapper when repeated requests to >> its initialization are made after initialization already >> failed no longer assumes the "hasattr" case, since >> there's other scenarios in which this message gets >> emitted, and the message also does not compound onto >> itself multiple times - you get the same message for >> each attempt at usage. The misnomer "compiles" is being >> traded out for "initialize". >> >> - Fixed bug in query.update() where 'evaluate' or 'fetch' >> expiration would fail if the column expression key was >> a class attribute with a different keyname as the >> actual column name. [ticket:1935] >> >> - Added an assertion during flush which ensures >> that no NULL-holding identity keys were generated >> on "newly persistent" objects. >> This can occur when user defined code inadvertently >> triggers flushes on not-fully-loaded objects. >> >> - lazy loads for relationship attributes now use >> the current state, not the "committed" state, >> of foreign and primary key attributes >> when issuing SQL, if a flush is not in process. >> Previously, only the database-committed state would >> be used. In particular, this would cause a many-to-one >> get()-on-lazyload operation to fail, as autoflush >> is not triggered on these loads when the attributes are >> determined and the "committed" state may not be >> available. [ticket:1910] >> >> - A new flag on relationship(), load_on_pending, allows >> the lazy loader to fire off on pending objects without a >> flush taking place, as well as a transient object that's >> been manually "attached" to the session. Note that this >> flag blocks attribute events from taking place when an >> object is loaded, so backrefs aren't available until >> after a flush. The flag is only intended for very >> specific use cases. >> >> - Another new flag on relationship(), cascade_backrefs, >> disables the "save-update" cascade when the event was >> initiated on the "reverse" side of a bidirectional >> relationship. This is a cleaner behavior so that >> many-to-ones can be set on a transient object without >> it getting sucked into the child object's session, >> while still allowing the forward collection to >> cascade. We *might* default this to False in 0.7. >> >> - Slight improvement to the behavior of >> "passive_updates=False" when placed only on the >> many-to-one side of a relationship; documentation has >> been clarified that passive_updates=False should really >> be on the one-to-many side. >> >> - Placing passive_deletes=True on a many-to-one emits >> a warning, since you probably intended to put it on >> the one-to-many side. >> >> - Fixed bug that would prevent "subqueryload" from >> working correctly with single table inheritance >> for a relationship from a subclass - the "where >> type in (x, y, z)" only gets placed on the inside, >> instead of repeatedly. >> >> - When using from_self() with single table inheritance, >> the "where type in (x, y, z)" is placed on the outside >> of the query only, instead of repeatedly. May make >> some more adjustments to this. >> >> - scoped_session emits a warning when configure() is >> called if a Session is already present (checks only the >> current thread) [ticket:1924] >> >> - reworked the internals of mapper.cascade_iterator() to >> cut down method calls by about 9% in some circumstances. >> [ticket:1932] >> >> - sql >> - Fixed bug in TypeDecorator whereby the dialect-specific >> type was getting pulled in to generate the DDL for a >> given type, which didn't always return the correct result. >> >> - TypeDecorator can now have a fully constructed type >> specified as its "impl", in addition to a type class. >> >> - TypeDecorator will now place itself as the resulting >> type for a binary expression where the type coercion >> rules would normally return its impl type - previously, >> a copy of the impl type would be returned which would >> have the TypeDecorator embedded into it as the "dialect" >> impl, this was probably an unintentional way of achieving >> the desired effect. >> >> - TypeDecorator.load_dialect_impl() returns "self.impl" by >> default, i.e. not the dialect implementation type of >> "self.impl". This to support compilation correctly. >> Behavior can be user-overridden in exactly the same way >> as before to the same effect. >> >> - Added type_coerce(expr, type_) expression element. >> Treats the given expression as the given type when evaluating >> expressions and processing result rows, but does not >> affect the generation of SQL, other than an anonymous >> label. >> >> - Table.tometadata() now copies Index objects associated >> with the Table as well. >> >> - Table.tometadata() issues a warning if the given Table >> is already present in the target MetaData - the existing >> Table object is returned. >> >> - An informative error message is raised if a Column >> which has not yet been assigned a name, i.e. as in >> declarative, is used in a context where it is >> exported to the columns collection of an enclosing >> select() construct, or if any construct involving >> that column is compiled before its name is >> assigned. >> >> - as_scalar(), label() can be called on a selectable >> which contains a Column that is not yet named. >> [ticket:1862] >> >> - Fixed recursion overflow which could occur when operating >> with two expressions both of type "NullType", but >> not the singleton NULLTYPE instance. [ticket:1907] >> >> - declarative >> - @classproperty (soon/now @declared_attr) takes effect for >> __mapper_args__, __table_args__, __tablename__ on >> a base class that is not a mixin, as well as mixins. >> [ticket:1922] >> >> - @classproperty 's official name/location for usage >> with declarative is sqlalchemy.ext.declarative.declared_attr. >> Same thing, but moving there since it is more of a >> "marker" that's specific to declararative, >> not just an attribute technique. [ticket:1915] >> >> - Fixed bug whereby columns on a mixin wouldn't propagate >> correctly to a single-table, or joined-table, >> inheritance scheme where the attribute name is >> different than that of the column. [ticket:1930], >> [ticket:1931]. >> >> - A mixin can now specify a column that overrides >> a column of the same name associated with a superclass. >> Thanks to Oystein Haaland. >> >> - engine >> >> - Fixed a regression in 0.6.4 whereby the change that >> allowed cursor errors to be raised consistently broke >> the result.lastrowid accessor. Test coverage has >> been added for result.lastrowid. Note that lastrowid >> is only supported by Pysqlite and some MySQL drivers, >> so isn't super-useful in the general case. >> >> - the logging message emitted by the engine when >> a connection is first used is now "BEGIN (implicit)" >> to emphasize that DBAPI has no explicit begin(). >> >> - added "views=True" option to metadata.reflect(), >> will add the list of available views to those >> being reflected. [ticket:1936] >> >> - engine_from_config() now accepts 'debug' for >> 'echo', 'echo_pool', 'force' for 'convert_unicode', >> boolean values for 'use_native_unicode'. >> [ticket:1899] >> >> - postgresql >> - Added "as_tuple" flag to ARRAY type, returns results >> as tuples instead of lists to allow hashing. >> >> - Fixed bug which prevented "domain" built from a >> custom type such as "enum" from being reflected. >> [ticket:1933] >> >> - mysql >> - Fixed bug involving reflection of CURRENT_TIMESTAMP >> default used with ON UPDATE clause, thanks to >> Taavi Burns [ticket:1940] >> >> - oracle >> - The implicit_retunring argument to create_engine() >> is now honored regardless of detected version of >> Oracle. Previously, the flag would be forced >> to False if server version info was < 10. >> [ticket:1878] >> >> - mssql >> - Fixed reflection bug which did not properly handle >> reflection of unknown types. [ticket:1946] >> >> - Fixed bug where aliasing of tables with "schema" would >> fail to compile properly. [ticket:1943] >> >> - Rewrote the reflection of indexes to use sys. >> catalogs, so that column names of any configuration >> (spaces, embedded commas, etc.) can be reflected. >> Note that reflection of indexes requires SQL >> Server 2005 or greater. [ticket:1770] >> >> - mssql+pymssql dialect now honors the "port" portion >> of the URL instead of discarding it. [ticket:1952] >> >> - informix >> - *Major* cleanup / modernization of the Informix >> dialect for 0.6, courtesy Florian Apolloner. >> [ticket:1906] >> >> - tests >> - the NoseSQLAlchemyPlugin has been moved to a >> new package "sqlalchemy_nose" which installs >> along with "sqlalchemy". This so that the "nosetests" >> script works as always but also allows the >> --with-coverage option to turn on coverage before >> SQLAlchemy modules are imported, allowing coverage >> to work correctly. >> >> - misc >> - CircularDependencyError now has .cycles and .edges >> members, which are the set of elements involved in >> one or more cycles, and the set of edges as 2-tuples. >> [ticket:1890] >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To post to this group, send email to sqlalch...@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. >> >> > > > > -- > Alex | twitter.com/alexconrad > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@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. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@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.