Hi Michael
I just downloaded version 0.5.4 of SqlAlchemy.
I would like to signal just a small detail that seems to make my tests fail:
[...]
File
"C:\Python25\lib\site-packages\sqlalchemy-0.5.4-py2.5.egg\sqlalchemy\orm\attributes.py",
line 379, in get
return self.get(state, passive=passive)
TypeError: get() takes at least 3 non-keyword arguments (2 given)
Thank you for all your great work!
Francesca
Michael Bayer wrote:
> Hello list -
>
> SQLAlchemy 0.5.4 is released, and this release is *highly* recommended
> for all users. For an indication of how high, lets just say, higher
> than 0.5.3, 0.5.2, and 0.5.1combined.
>
> Not to worry, there are no security holes or memory leaks in previous
> versions. But we have neutralized some major, major speed bumps in
> the flush() process, as well as made significant improvements to
> memory usage. Due to the removal of these bugs, large dataset
> scenarios that were more or less impossible to work with for any
> version of SQLAlchemy now run at top speed with the same rate
> performance regardless of how large the Session grows. Other
> performance issues that were proportional to the number of
> interconnected mapped classes, memory/speed issues related to the
> number of relation()s set up on mappers during a load, or just
> wasteful overhead during the flush have been mitigated. The
> improvements are of a magnitude such that some applications that had
> abaondoned the ORM due to latency related to large sets of objects may
> be able to come back to it and regain all its advantages.
>
> The key to all these improvements is, that i finally have a job using
> SQLAlchemy full time where I've gotten the opportunity to use the ORM
> with somewhat large amounts of data. None of these issues were very
> deep and just required that I spend some more time with the profiler
> and bigger datasets. My own use case here is a 6500 row spreadsheet
> of interconnected objects, representing about 25K rows - the process
> of ingesting that data, which requires that all of the objects need to
> stay present in the session, has gone from 33 minutes to 8. The
> key is that the number of method calls to flush X number of objects is
> now the same for a session regardless of how many other non-dirty
> items are present. Similarly, a mapping setup that has 30 mappers
> configured will not be slowed down by unnecessary traversal of all the
> mapper relations.
>
> The Session itself, which has for some time now has been "weak
> referencing" with regards to its contents, has been repaired such that
> the weak referencing behavior is now fully operational. Previously,
> objects which were related via mutual backrefs would not get cleared
> from the session when all external references were lost until you
> expunged them. That is no longer necessary - the Session now has
> no strong references whatsoever to its contents, as long as no changes
> are pending on those objects. Pending changes as always are strongly
> referenced until flushed. So now you can iterate through as many
> tens of thousands of objects as you like (keeping in mind an
> individual Query still loads each individual result fully in unless
> yield_per is enabled) and there's no need to expunge the session in
> between chunks.
>
> The loading of objects has also been sped up and reduced in memory
> overhead by killing a wasteful structure of callables that was
> generated on a per-relation()/per-object basis whenever
> query.options() was used.
>
> In other news I've backported a convenient extension from the 0.6
> series which allows you to create custom SQL expression elements with
> compiler functions. This is the "compiler" extension and is
> described in the documentation.
>
> Download SQLAlchemy 0.5.4 (right now !! get rid of whatever buggy old
> version you're using) at:
>
> http://www.sqlalchemy.org/download.html
>
>
> 0.5.4
> =====
>
> - orm
> - Significant performance enhancements regarding Sessions/flush()
> in conjunction with large mapper graphs, large numbers of
> objects:
>
> - Removed all* O(N) scanning behavior from the flush() process,
> i.e. operations that were scanning the full session,
> including an extremely expensive one that was erroneously
> assuming primary key values were changing when this
> was not the case.
>
> * one edge case remains which may invoke a full scan,
> if an existing primary key attribute is modified
> to a new value.
>
> - The Session's "weak referencing" behavior is now *full* -
> no strong references whatsoever are made to a mapped object
> or related items/collections in its __dict__. Backrefs and
> other cycles in objects no longer affect the Session's ability
> to lose all references to unmodified objects. Objects with
> pending changes still are maintained strongly until flush.
> [ticket:1398]
>
> The implementation also improves performance by moving
> the "resurrection" process of garbage collected items
> to only be relevant for mappings that map "mutable"
> attributes (i.e. PickleType, composite attrs). This removes
> overhead from the gc process and simplifies internal
> behavior.
>
> If a "mutable" attribute change is the sole change on an object
> which is then dereferenced, the mapper will not have access to
> other attribute state when the UPDATE is issued. This may
> present
> itself differently to some MapperExtensions.
>
> The change also affects the internal attribute API, but not
> the AttributeExtension interface nor any of the publically
> documented attribute functions.
>
> - The unit of work no longer genererates a graph of "dependency"
> processors for the full graph of mappers during flush(),
> instead
> creating such processors only for those mappers which represent
> objects with pending changes. This saves a tremendous number
> of method calls in the context of a large interconnected
> graph of mappers.
>
> - Cached a wasteful "table sort" operation that previously
> occured multiple times per flush, also removing significant
> method call count from flush().
>
> - Other redundant behaviors have been simplified in
> mapper._save_obj().
>
> - Modified query_cls on DynamicAttributeImpl to accept a full
> mixin version of the AppenderQuery, which allows subclassing
> the AppenderMixin.
>
> - The "polymorphic discriminator" column may be part of a
> primary key, and it will be populated with the correct
> discriminator value. [ticket:1300]
>
> - Fixed the evaluator not being able to evaluate IS NULL clauses.
>
> - Fixed the "set collection" function on "dynamic" relations to
> initiate events correctly. Previously a collection could only
> be assigned to a pending parent instance, otherwise modified
> events would not be fired correctly. Set collection is now
> compatible with merge(), fixes [ticket:1352].
>
> - Allowed pickling of PropertyOption objects constructed with
> instrumented descriptors; previously, pickle errors would occur
> when pickling an object which was loaded with a descriptor-based
> option, such as query.options(eagerload(MyClass.foo)).
>
> - Lazy loader will not use get() if the "lazy load" SQL clause
> matches the clause used by get(), but contains some parameters
> hardcoded. Previously the lazy strategy would fail with the
> get(). Ideally get() would be used with the hardcoded
> parameters but this would require further development.
> [ticket:1357]
>
> - MapperOptions and other state associated with query.options()
> is no longer bundled within callables associated with each
> lazy/deferred-loading attribute during a load.
> The options are now associated with the instance's
> state object just once when it's populated. This removes
> the need in most cases for per-instance/attribute loader
> objects, improving load speed and memory overhead for
> individual instances. [ticket:1391]
>
> - Fixed another location where autoflush was interfering
> with session.merge(). autoflush is disabled completely
> for the duration of merge() now. [ticket:1360]
>
> - Fixed bug which prevented "mutable primary key" dependency
> logic from functioning properly on a one-to-one
> relation(). [ticket:1406]
>
> - Fixed bug in relation(), introduced in 0.5.3,
> whereby a self referential relation
> from a base class to a joined-table subclass would
> not configure correctly.
>
> - Fixed obscure mapper compilation issue when inheriting
> mappers are used which would result in un-initialized
> attributes.
>
> - Fixed documentation for session weak_identity_map -
> the default value is True, indicating a weak
> referencing map in use.
>
> - Fixed a unit of work issue whereby the foreign
> key attribute on an item contained within a collection
> owned by an object being deleted would not be set to
> None if the relation() was self-referential. [ticket:1376]
>
> - Fixed Query.update() and Query.delete() failures with eagerloaded
> relations. [ticket:1378]
>
> - It is now an error to specify both columns of a binary
> primaryjoin
> condition in the foreign_keys or remote_side collection. Whereas
> previously it was just nonsensical, but would succeed in a
> non-deterministic way.
>
> - schema
> - Added a quote_schema() method to the IdentifierPreparer class
> so that dialects can override how schemas get handled. This
> enables the MSSQL dialect to treat schemas as multipart
> identifiers, such as 'database.owner'. [ticket: 594, 1341]
>
> - sql
> - Back-ported the "compiler" extension from SQLA 0.6. This
> is a standardized interface which allows the creation of custom
> ClauseElement subclasses and compilers. In particular it's
> handy as an alternative to text() when you'd like to
> build a construct that has database-specific compilations.
> See the extension docs for details.
>
> - Exception messages are truncated when the list of bound
> parameters is larger than 10, preventing enormous
> multi-page exceptions from filling up screens and logfiles
> for large executemany() statements. [ticket:1413]
>
> - ``sqlalchemy.extract()`` is now dialect sensitive and can
> extract components of timestamps idiomatically across the
> supported databases, including SQLite.
>
> - Fixed __repr__() and other _get_colspec() methods on
> ForeignKey constructed from __clause_element__() style
> construct (i.e. declarative columns). [ticket:1353]
>
> - mysql
> - Reflecting a FOREIGN KEY construct will take into account
> a dotted schema.tablename combination, if the foreign key
> references a table in a remote schema. [ticket:1405]
>
> - mssql
> - Modified how savepoint logic works to prevent it from
> stepping on non-savepoint oriented routines. Savepoint
> support is still very experimental.
>
> - Added in reserved words for MSSQL that covers version 2008
> and all prior versions. [ticket:1310]
>
> - Corrected problem with information schema not working with a
> binary collation based database. Cleaned up information schema
> since it is only used by mssql now. [ticket:1343]
>
> - sqlite
> - Corrected the SLBoolean type so that it properly treats only 1
> as True. [ticket:1402]
>
> - Corrected the float type so that it correctly maps to a
> SLFloat type when being reflected. [ticket:1273]
>
> - extensions
>
> - Fixed adding of deferred or other column properties to a
> declarative class. [ticket:1379]
>
> - Added "compiler" extension from 0.6
>
> >
>
>
--~--~---------~--~----~------------~-------~--~----~
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?hl=en
-~----------~----~----~----~------~----~------~--~---