0.5 Changelog¶
0.5.9¶
no release datesql¶
Fixed erroneous self_group() call in expression package.
References: #1661
0.5.8¶
Released: Sat Jan 16 2010sql¶
The copy() method on Column now supports uninitialized, unnamed Column objects. This allows easy creation of declarative helpers which place common columns on multiple subclasses.
Default generators like Sequence() translate correctly across a copy() operation.
Sequence() and other DefaultGenerator objects are accepted as the value for the «default» and «onupdate» keyword arguments of Column, in addition to being accepted positionally.
Fixed a column arithmetic bug that affected column correspondence for cloned selectables which contain free-standing column expressions. This bug is generally only noticeable when exercising newer ORM behavior only available in 0.6 via, but is more correct at the SQL expression level as well.
postgresql¶
The extract() function, which was slightly improved in 0.5.7, needed a lot more work to generate the correct typecast (the typecasts appear to be necessary in PG’s EXTRACT quite a lot of the time). The typecast is now generated using a rule dictionary based on PG’s documentation for date/time/interval arithmetic. It also accepts text() constructs again, which was broken in 0.5.7.
References: #1647
firebird¶
Recognize more errors as disconnections.
References: #1646
0.5.7¶
Released: Sat Dec 26 2009orm¶
contains_eager() now works with the automatically generated subquery that results when you say «query(Parent).join(Parent.somejoinedsubclass)», i.e. when Parent joins to a joined-table-inheritance subclass. Previously contains_eager() would erroneously add the subclass table to the query separately producing a cartesian product. An example is in the ticket description.
References: #1543
query.options() now only propagate to loaded objects for potential further sub-loads only for options where such behavior is relevant, keeping various unserializable options like those generated by contains_eager() out of individual instance states.
References: #1553
Session.execute() now locates table- and mapper-specific binds based on a passed in expression which is an insert()/update()/delete() construct.
References: #1054
Session.merge() now properly overwrites a many-to-one or uselist=False attribute to None if the attribute is also None in the given object to be merged.
Fixed a needless select which would occur when merging transient objects that contained a null primary key identifier.
References: #1618
Mutable collection passed to the «extension» attribute of relation(), column_property() etc. will not be mutated or shared among multiple instrumentation calls, preventing duplicate extensions, such as backref populators, from being inserted into the list.
References: #1585
Fixed the call to get_committed_value() on CompositeProperty.
References: #1504
Fixed bug where Query would crash if a join() with no clear «left» side were called when a non-mapped column entity appeared in the columns list.
References: #1602
Fixed bug whereby composite columns wouldn’t load properly when configured on a joined-table subclass, introduced in version 0.5.6 as a result of the fix for. thx to Scott Torborg.
The «use get» behavior of many-to-one relations, i.e. that a lazy load will fallback to the possibly cached query.get() value, now works across join conditions where the two compared types are not exactly the same class, but share the same «affinity» - i.e. Integer and SmallInteger. Also allows combinations of reflected and non-reflected types to work with 0.5 style type reflection, such as PGText/Text (note 0.6 reflects types as their generic versions).
References: #1556
Fixed bug in query.update() when passing Cls.attribute as keys in the value dict and using synchronize_session=“expire“ („fetch“ in 0.6).
References: #1436
sql¶
Fixed bug in two-phase transaction whereby commit() method didn’t set the full state which allows subsequent close() call to succeed.
References: #1603
Fixed the «numeric» paramstyle, which apparently is the default paramstyle used by Informixdb.
Repeat expressions in the columns clause of a select are deduped based on the identity of each clause element, not the actual string. This allows positional elements to render correctly even if they all render identically, such as «qmark» style bind parameters.
References: #1574
The cursor associated with connection pool connections (i.e. _CursorFairy) now proxies __iter__() to the underlying cursor correctly.
References: #1632
types now support an «affinity comparison» operation, i.e. that an Integer/SmallInteger are «compatible», or a Text/String, PickleType/Binary, etc. Part of.
References: #1556
Fixed bug preventing alias() of an alias() from being cloned or adapted (occurs frequently in ORM operations).
References: #1641
postgresql¶
Added support for reflecting the DOUBLE PRECISION type, via a new postgres.PGDoublePrecision object. This is postgresql.DOUBLE_PRECISION in 0.6.
References: #1085
Added support for reflecting the INTERVAL YEAR TO MONTH and INTERVAL DAY TO SECOND syntaxes of the INTERVAL type.
References: #460
Corrected the «has_sequence» query to take current schema, or explicit sequence-stated schema, into account.
References: #1576
Fixed the behavior of extract() to apply operator precedence rules to the «::» operator when applying the «timestamp» cast - ensures proper parenthesization.
References: #1611
sqlite¶
sqlite dialect properly generates CREATE INDEX for a table that is in an alternate schema.
References: #1439
mssql¶
Changed the name of TrustedConnection to Trusted_Connection when constructing pyodbc connect arguments
References: #1561
oracle¶
The «table_names» dialect function, used by MetaData .reflect(), omits «index overflow tables», a system table generated by Oracle when «index only tables» with overflow are used. These tables aren’t accessible via SQL and can’t be reflected.
References: #1637
misc¶
A column can be added to a joined-table declarative superclass after the class has been constructed (i.e. via class-level attribute assignment), and the column will be propagated down to subclasses. This is the reverse situation as that of, fixed in 0.5.6.
Fixed a slight inaccuracy in the sharding example. Comparing equivalence of columns in the ORM is best accomplished using col1.shares_lineage(col2).
References: #1491
Removed unused load() method from ShardedQuery.
References: #1606
0.5.6¶
Released: Sat Sep 12 2009orm¶
Fixed bug whereby inheritance discriminator part of a composite primary key would fail on updates. Continuation of.
References: #1300
Fixed bug which disallowed one side of a many-to-many bidirectional reference to declare itself as «viewonly»
References: #1507
Added an assertion that prevents a @validates function or other AttributeExtension from loading an unloaded collection such that internal state may be corrupted.
References: #1526
Fixed bug which prevented two entities from mutually replacing each other’s primary key values within a single flush() for some orderings of operations.
References: #1519
Fixed an obscure issue whereby a joined-table subclass with a self-referential eager load on the base class would populate the related object’s «subclass» table with data from the «subclass» table of the parent.
References: #1485
relations() now have greater ability to be «overridden», meaning a subclass that explicitly specifies a relation() overriding that of the parent class will be honored during a flush. This is currently to support many-to-many relations from concrete inheritance setups. Outside of that use case, YMMV.
References: #1477
Squeezed a few more unnecessary «lazy loads» out of relation(). When a collection is mutated, many-to-one backrefs on the other side will not fire off to load the «old» value, unless «single_parent=True» is set. A direct assignment of a many-to-one still loads the «old» value in order to update backref collections on that value, which may be present in the session already, thus maintaining the 0.5 behavioral contract.
References: #1483
Fixed bug whereby a load/refresh of joined table inheritance attributes which were based on column_property() or similar would fail to evaluate.
References: #1480
Improved support for MapperProperty objects overriding that of an inherited mapper for non-concrete inheritance setups - attribute extensions won’t randomly collide with each other.
References: #1488
UPDATE and DELETE do not support ORDER BY, LIMIT, OFFSET, etc. in standard SQL. Query.update() and Query.delete() now raise an exception if any of limit(), offset(), order_by(), group_by(), or distinct() have been called.
References: #1487
Added AttributeExtension to sqlalchemy.orm.__all__
Improved error message when query() is called with a non-SQL /entity expression.
References: #1476
Using False or 0 as a polymorphic discriminator now works on the base class as well as a subclass.
References: #1440
Added enable_assertions(False) to Query which disables the usual assertions for expected state - used by Query subclasses to engineer custom state.. See https://www.sqlalchemy.org/trac/wiki/UsageRecipes/PreFilteredQuery for an example.
References: #1424
Fixed recursion issue which occurred if a mapped object’s __len__() or __nonzero__() method resulted in state changes.
References: #1501
Fixed incorrect exception raise in Weak/StrongIdentityMap.add()
References: #1506
Fixed the error message for «could not find a FROM clause» in query.join() which would fail to issue correctly if the query was against a pure SQL construct.
References: #1522
Fixed a somewhat hypothetical issue which would result in the wrong primary key being calculated for a mapper using the old polymorphic_union function - but this is old stuff.
References: #1486
sql¶
Fixed column.copy() to copy defaults and onupdates.
References: #1373
Fixed a bug in extract() introduced in 0.5.4 whereby the string «field» argument was getting treated as a ClauseElement, causing various errors within more complex SQL transformations.
Unary expressions such as DISTINCT propagate their type handling to result sets, allowing conversions like unicode and such to take place.
References: #1420
Fixed bug in Table and Column whereby passing empty dict for «info» argument would raise an exception.
References: #1482
oracle¶
Backported 0.6 fix for Oracle alias names not getting truncated.
References: #1309
misc¶
The collection proxies produced by associationproxy are now pickleable. A user-defined proxy_factory however is still not pickleable unless it defines __getstate__ and __setstate__.
References: #1446
Declarative will raise an informative exception if __table_args__ is passed as a tuple with no dict argument. Improved documentation.
References: #1468
Table objects declared in the MetaData can now be used in string expressions sent to primaryjoin/secondaryjoin/ secondary - the name is pulled from the MetaData of the declarative base.
References: #1527
A column can be added to a joined-table subclass after the class has been constructed (i.e. via class-level attribute assignment). The column is added to the underlying Table as always, but now the mapper will rebuild its «join» to include the new column, instead of raising an error about «no such column, use column_property() instead».
References: #1523
Added examples into the test suite so they get exercised regularly and cleaned up a couple deprecation warnings.
0.5.5¶
Released: Mon Jul 13 2009general¶
unit tests have been migrated from unittest to nose. See README.unittests for information on how to run the tests.
References: #970
orm¶
The «foreign_keys» argument of relation() will now propagate automatically to the backref in the same way that primaryjoin and secondaryjoin do. For the extremely rare use case where the backref of a relation() has intentionally different «foreign_keys» configured, both sides now need to be configured explicitly (if they do in fact require this setting, see the next note…).
…the only known (and really, really rare) use case where a different foreign_keys setting was used on the forwards/backwards side, a composite foreign key that partially points to its own columns, has been enhanced such that the fk->itself aspect of the relation won’t be used to determine relation direction.
Session.mapper is now deprecated.
Call session.add() if you’d like a free-standing object to be part of your session. Otherwise, a DIY version of Session.mapper is now documented at https://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper The method will remain deprecated throughout 0.6.
Fixed Query being able to join() from individual columns of a joined-table subclass entity, i.e. query(SubClass.foo, SubClass.bar).join(<anything>). In most cases, an error «Could not find a FROM clause to join from» would be raised. In a few others, the result would be returned in terms of the base class rather than the subclass - so applications which relied on this erroneous result need to be adjusted.
References: #1431
Fixed a bug involving contains_eager(), which would apply itself to a secondary (i.e. lazy) load in a particular rare case, producing cartesian products. improved the targeting of query.options() on secondary loads overall.
References: #1461
Fixed bug introduced in 0.5.4 whereby Composite types fail when default-holding columns are flushed.
Fixed another 0.5.4 bug whereby mutable attributes (i.e. PickleType) wouldn’t be deserialized correctly when the whole object was serialized.
References: #1426
Fixed bug whereby session.is_modified() would raise an exception if any synonyms were in use.
Fixed potential memory leak whereby previously pickled objects placed back in a session would not be fully garbage collected unless the Session were explicitly closed out.
Fixed bug whereby list-based attributes, like pickletype and PGArray, failed to be merged() properly.
Repaired non-working attributes.set_committed_value function.
Trimmed the pickle format for InstanceState which should further reduce the memory footprint of pickled instances. The format should be backwards compatible with that of 0.5.4 and previous.
sqlalchemy.orm.join and sqlalchemy.orm.outerjoin are now added to __all__ in sqlalchemy.orm.*.
References: #1463
Fixed bug where Query exception raise would fail when a too-short composite primary key value were passed to get().
References: #1458
sql¶
Removed an obscure feature of execute() (including connection, engine, Session) whereby a bindparam() construct can be sent as a key to the params dictionary. This usage is undocumented and is at the core of an issue whereby the bindparam() object created implicitly by a text() construct may have the same hash value as a string placed in the params dictionary and may result in an inappropriate match when computing the final bind parameters. Internal checks for this condition would add significant latency to the critical task of parameter rendering, so the behavior is removed. This is a backwards incompatible change for any application that may have been using this feature, however the feature has never been documented.
misc¶
Implemented recreate() for StaticPool.
0.5.4p2¶
Released: Tue May 26 2009sql¶
Repaired the printing of SQL exceptions which are not based on parameters or are not executemany() style.
postgresql¶
Deprecated the hardcoded TIMESTAMP function, which when used as func.TIMESTAMP(value) would render «TIMESTAMP value». This breaks on some platforms as PostgreSQL doesn’t allow bind parameters to be used in this context. The hard-coded uppercase is also inappropriate and there’s lots of other PG casts that we’d need to support. So instead, use text constructs i.e. select([«timestamp „12/05/09“»]).
0.5.4p1¶
Released: Mon May 18 2009orm¶
Fixed an attribute error introduced in 0.5.4 which would occur when merge() was used with an incomplete object.
0.5.4¶
Released: Sun May 17 2009orm¶
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.
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 publicly documented attribute functions.
The unit of work no longer generates 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 occurred multiple times per flush, also removing significant method call count from flush().
Other redundant behaviors have been simplified in mapper._save_obj().
References: #1398
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.
References: #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.
References: #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.
References: #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.
References: #1391
Fixed another location where autoflush was interfering with session.merge(). autoflush is disabled completely for the duration of merge() now.
References: #1360
Fixed bug which prevented «mutable primary key» dependency logic from functioning properly on a one-to-one relation().
References: #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.
References: #1376
Fixed Query.update() and Query.delete() failures with eagerloaded relations.
References: #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.
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.
References: #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).
References: #1353
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“.
extensions¶
Fixed adding of deferred or other column properties to a declarative class.
References: #1379
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.
References: #1405
sqlite¶
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.
References: #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.
References: #1343
0.5.3¶
Released: Tue Mar 24 2009orm¶
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.
References: #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.
References: #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().
References: #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, although we are considering removing the flush([objects]) feature altogether.
References: #1315
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.
References: #1306
Added «post_configure_attribute» method to InstrumentationManager, so that the «listen_for_events.py» example works again.
References: #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.
References: #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 expression».
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()).
References: #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.
References: #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.
References: #1299
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.
postgresql¶
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.
mssql¶
Preliminary support for pymssql 1.0.1
Corrected issue on mssql where max_identifier_length was not being respected.
0.5.2¶
Released: Sat Jan 24 2009orm¶
Further refined 0.5.1’s warning about delete-orphan cascade placed on a many-to-many relation. First, the bad news: the warning will apply to both many-to-many as well as many-to-one relations. This is necessary since in both cases, SQLA does not scan the full set of potential parents when determining «orphan» status - for a persistent object it only detects an in-python de-association event to establish the object as an «orphan». Next, the good news: to support one-to-one via a foreign key or association table, or to support one-to-many via an association table, a new flag single_parent=True may be set which indicates objects linked to the relation are only meant to have a single parent. The relation will raise an error if multiple parent-association events occur within Python.
Adjusted the attribute instrumentation change from 0.5.1 to fully establish instrumentation for subclasses where the mapper was created after the superclass had already been fully instrumented.
References: #1292
Fixed bug in delete-orphan cascade whereby two one-to-one relations from two different parent classes to the same target class would prematurely expunge the instance.
Fixed an eager loading bug whereby self-referential eager loading would prevent other eager loads, self referential or not, from joining to the parent JOIN properly. Thanks to Alex K for creating a great test case.
session.expire() and related methods will not expire() unloaded deferred attributes. This prevents them from being needlessly loaded when the instance is refreshed.
query.join()/outerjoin() will now properly join an aliased() construct to the existing left side, even if query.from_self() or query.select_from(someselectable) has been called.
References: #1293
sql¶
- Further fixes to the «percent signs and spaces in column/table
names» functionality.
References: #1284
mssql¶
0.5.1¶
Released: Sat Jan 17 2009orm¶
Удален внутренний кэш join, который потенциально мог утекать в память при многократном выполнении query.join() для ad-hoc selectables.
Методы сессий «clear()», «save()», «update()», «save_or_update()» были устаревшими и заменены на «expunge_all()» и «add()». «expunge_all()» также был добавлен в ScopedSession.
Модернизировано исключение «нет сопоставленной таблицы» и добавлено более явное исключение __table__/__tablename__ в декларативный метод.
Наследующие конкретные отобразители теперь инструментируют атрибуты, которые наследуются от суперкласса, но не определены для самого конкретного отобразителя, с помощью InstrumentedAttribute, который выдает описательную ошибку при обращении к нему.
References: #1237
Добавлено новое ключевое слово relation() back_populates. Это позволяет конфигурировать обратные ссылки, используя явные отношения. Это необходимо при создании двунаправленных отношений между иерархией конкретных отобразителей и другим классом.
Добавлено тестовое покрытие для объектов relation(), заданных на конкретных картографах.
References: #1237
Query.from_self(), а также query.subquery() отключают отображение нетерпеливых соединений внутри создаваемого подзапроса. Функция «отключения всех нетерпеливых соединений» доступна публично через новый генератив query.enable_eagerloads().
References: #1276
В Query добавлена рудиментарная серия операций над множествами, которые получают объекты Query в качестве аргументов, включая union(), union_all(), intersect(), except_(), intersect_all(), except_all(). Примеры смотрите в документации API для Query.union().
Исправлена ошибка, из-за которой Query.join() и eagerloads не могли присоединиться к запросу, выбранному из объединения или aliased union.
Добавлен краткий пример документации для двунаправленных отношений, заданных на конкретных картографах.
References: #1237
Теперь картографы инструментируют атрибуты класса при построении с помощью конечного объекта InstrumentedAttribute, который остается постоянным. Методология _CompileOnAttr/__getattribute__() была удалена. Чистый эффект заключается в том, что атрибуты класса, сопоставленные на основе столбцов, теперь могут быть полностью использованы на уровне класса без вызова операции компиляции маппера, что значительно упрощает типичные схемы использования в декларативном языке.
References: #1269
ColumnProperty (и внешние помощники, такие как
deferred
) больше не игнорируют неизвестные аргументы **keyword.Исправлена ошибка механизма «переключения строк» Unitofwork, т.е. преобразования INSERT/DELETE в UPDATE, в сочетании с наследованием объединенных таблиц и объектом, который не содержит определенных значений для дочерней таблицы, где будет отображаться UPDATE без условия SET.
Использование delete-orphan в отношении «многие-ко-многим» устарело. Это приводит к недостоверным или ошибочным результатам, поскольку SQLA не получает полный список «родителей» для m2m. Чтобы добиться поведения delete-orphan в таблице m2m, используйте явный класс ассоциации, чтобы отдельная строка ассоциации рассматривалась как родитель.
References: #1281
delete-orphan cascade всегда требует delete cascade. Указание delete-orphan без delete теперь вызывает предупреждение об устаревании.
References: #1281
sql¶
Улучшена методика обработки знаков процента в именах столбцов from. Добавлены дополнительные тесты. Диалекты MySQL и PostgreSQL по-прежнему не выдают корректные запросы CREATE TABLE для идентификаторов со знаками процента.
References: #1256
schema¶
Index теперь принимает ориентированные на столбцы InstrumentedAttributes (т.е. атрибуты сопоставленных классов на основе столбцов) в качестве аргументов столбцов.
References: #1214
Колонка без имени (как в декларативном) не вызовет ошибку NoneType, когда будет запрошен ее строковый вывод (например, в трассировке стека).
Исправлена ошибка при переопределении Column с ForeignKey в отраженной таблице, когда производные столбцы (т.е. «виртуальные» столбцы select и т.д.) непреднамеренно вызывали логику очистки на уровне схемы, предназначенную только для исходного столбца.
References: #1278
mysql¶
Добавлены недостающие ключевые слова из MySQL 4.1, чтобы они правильно экранировались.
mssql¶
Исправлена обработка больших десятичных значений с помощью более надежных тестов. Удалены манипуляции со строками в плавающих числах.
References: #1280
Изменена обработка do_begin в mssql, чтобы использовать курсор, а не соединение, для совместимости с DBAPI.
Исправлена поддержка SAVEPOINT в adodbapi путем изменения обработки savepoint_release, которая не поддерживается в mssql.
misc¶
Теперь можно указывать объекты Column в подклассах, которые не имеют собственной таблицы (т.е. используют наследование одной таблицы). Колонки будут добавлены к базовой таблице, но только отображены подклассом.
Для объединенных и одиночно наследуемых подклассов, подкласс будет отображать только те столбцы, которые уже отображены в суперклассе, и те, которые явно отображены в подклассе. Другие столбцы, которые присутствуют в Table will be excluded from the mapping by default, which can be disabled by passing a blank exclude_properties collection to the __mapper_args__`. Это сделано для того, чтобы классы с одним наследованием, которые определяют свои собственные столбцы, были единственными классами, которые будут отображать эти столбцы. В результате получается более организованное отображение, чем обычно получается при явном вызове mapper(), если только вы не зададите аргументы exclude_properties явно.
Ошибкой является добавление новых объектов Column в декларативный класс, который указал существующую таблицу с помощью __table__.
0.5.0¶
Released: Tue Jan 06 2009general¶
Документация была переведена на Sphinx. В частности, сгенерированная документация API была построена в полноценный раздел «API Reference», который организует редакционную документацию в сочетании со сгенерированными докстрингами. Перекрестные ссылки между разделами и документами API значительно улучшены, обеспечена функция поиска на javascript, а также полный индекс всех классов, функций и членов.
setup.py теперь импортирует setuptools только опционально. Если он отсутствует, то используется distutils. Новая программа установки «pip» рекомендуется вместо easy_install, поскольку она устанавливает более упрощенным способом.
добавили в папку примеров чрезвычайно базовую иллюстрацию интеграции PostGIS.
orm¶
Query.with_polymorphic() теперь принимает третий аргумент «discriminator», который заменит значение mapper.polymorphic_on для данного запроса. Сами отобразители больше не требуют установки polymorphic_on, даже если у отобразителя есть polymorphic_identity. Если значение не установлено, то по умолчанию отображатель будет загружаться неполиморфно. Вместе эти две особенности позволяют неполиморфным конкретным настройкам наследования использовать полиморфную загрузку на основе отдельных запросов, так как конкретные настройки подвержены многим проблемам при использовании полиморфного наследования во всех случаях.
dynamic_loader принимает параметр query_class= для настройки классов запросов, используемых как для динамической коллекции, так и для запросов, построенных на ее основе.
query.order_by() принимает значение None, которое удалит из запроса любое ожидающее состояние order_by, а также отменит любое упорядочивание, настроенное маппером/отношением. Это в первую очередь полезно для переопределения упорядочивания, заданного в dynamic_loader().
References: #1079
Исключения, возникающие во время compile_mappers(), теперь сохраняются для обеспечения «липкого поведения» - если вызов hasattr() для предварительно скомпилированного маппированного атрибута вызывает неудачную компиляцию и подавляет исключение, последующая компиляция блокируется, и исключение будет повторено при следующем вызове compile(). Эта проблема часто возникает при использовании декларативного подхода.
property.of_type() теперь распознается на однотабличной наследуемой цели, когда используется в контексте prop.of_type(…).any()/has(), а также query.join(prop.of_type(…)).
query.join() вызывает ошибку, если цель соединения не соответствует атрибуту, основанному на свойстве - хотя маловероятно, что кто-то делает это, автор SQLAlchemy был виновен в этом конкретном вольном поведении.
Исправлена ошибка при использовании weak_instance_map=False, когда измененные события не перехватывались для flush().
References: #1272
Исправлены некоторые глубокие проблемы «соответствия столбцов», которые могли повлиять на запрос, сделанный против селекта, содержащего несколько версий одной и той же таблицы, а также на союзы и подобные им, которые содержали столбцы одной и той же таблицы в разных позициях столбцов на разных уровнях.
References: #1268
Пользовательские классы компараторов, используемые в сочетании с column_property(), relation() и т.д., могут определять новые методы сравнения на компараторе, которые станут доступны через __getattr__() на InstrumentedAttribute. В случае synonym() или comparable_property(), атрибуты разрешаются сначала на определенном пользователем дескрипторе, а затем на определенном пользователем компараторе.
Добавлен аксессуар ScopedSession.is_active.
References: #976
Можно передавать отображенные атрибуты и объекты столбцов в качестве ключей в query.update({}).
References: #1262
Сопоставленные атрибуты, переданные в values() выражения уровня insert() или update(), будут использовать ключи сопоставленных столбцов, а не сопоставленный атрибут.
Исправлена проблема с некорректной работой Query.delete() и Query.update() с параметрами привязки.
References: #1242
Query.select_from(), from_statement() гарантируют, что данный аргумент является FromClause или Text/Select/Union, соответственно.
Query() можно передать «составной» атрибут в качестве выражения столбца, и он будет расширен. В некоторой степени связано с.
References: #1253
Query() немного более надежен при передаче различных выражений столбцов, таких как строки, clauselists, конструкции text() (что может означать, что он просто более красиво выдает ошибку).
first() работает, как и ожидалось, с Query.from_statement().
Исправлена ошибка, появившаяся в 0.5rc4, которая приводила к тому, что eager loading не работал для свойств, которые были добавлены в маппер после компиляции с помощью add_property() или эквивалента.
Исправлена ошибка, при которой связь многие-ко-многим() с viewonly=True неправильно ссылалась на связь secondary->remote.
Дубликаты элементов в коллекции на основе списка будут сохраняться при выполнении INSERT’ов во «вторичную» таблицу в отношении «многие-ко-многим». Если предположить, что таблица m2m имеет уникальное ограничение или ограничение первичного ключа, это приведет к ожидаемому нарушению ограничения, а не к молчаливому удалению дублирующихся записей. Обратите внимание, что старое поведение сохраняется для отношения «один ко многим», поскольку записи коллекции в этом случае не приводят к INSERT-запросам, и SQLA не контролирует коллекции вручную.
References: #1232
Query.add_column() может принимать объекты FromClause таким же образом, как и session.query().
Сравнение отношения «многие-к-одному» с NULL правильно преобразуется в IS NOT NULL на основе not_().
Добавлены дополнительные проверки, чтобы убедиться, что явные primaryjoin/secondaryjoin являются экземплярами ClauseElement, для предотвращения более запутанных ошибок в дальнейшем.
References: #1087
Улучшена проверка mapper() для неклассовых классов.
References: #1236
Аргумент comparator_factory теперь документирован и поддерживается всеми типами MapperProperty, включая column_property(), relation(), backref() и synonym().
References: #5051
Изменил название PropertyLoader на RelationProperty, чтобы соответствовать всем остальным названиям. PropertyLoader по-прежнему присутствует в качестве синонима.
исправлен вызов «double iter()», вызывавший ошибки шины в API шарда, удалена ошибка result.close(), оставшаяся от версии 0.4.
каскады Session.merge не вызывали автозаполнение. Исправление преждевременной вставки объединенных экземпляров с отсутствующими значениями.
Два исправления, помогающие предотвратить отображение колонок вне диапазона в сценариях наследования polymorphic_union (что приводит к отображению дополнительных таблиц в предложении FROM, вызывая появление картезианских продуктов):
улучшения в «адаптации столбцов» для ситуаций наследования a->b->c для лучшего расположения столбцов, связанных друг с другом через несколько уровней косвенности, вместо отображения неадаптированного столбца.
столбец «полиморфный дискриминатор» отображается только для фактического отобразителя, к которому выполняется запрос. Колонка не будет «подтягиваться» из картографа подклассов или суперклассов, так как она не нужна.
Исправлен аргумент shard_id в ShardedSession.execute().
References: #1072
sql¶
Объекты RowProxy можно использовать вместо аргументов словаря, передаваемых в connection.execute() и друзьям.
References: #935
Столбцы снова могут содержать знаки процентов в своих именах.
References: #1256
sqlalchemy.sql.expression.Function теперь является публичным классом. Его можно подклассифицировать, чтобы предоставлять пользовательские SQL-функции в императивном стиле, в том числе с заранее установленным поведением. Пример postgis.py иллюстрирует одно из таких применений.
PickleType теперь по умолчанию предпочитает сравнение ==, если входящий объект (например, dict) реализует __eq__(). Если объект не реализует __eq__() и mutable=True, выдается предупреждение об устаревании.
Исправлена странность импорта в sqlalchemy.sql, чтобы не экспортировать __names__.
References: #1215
Многократное использование одного и того же объекта ForeignKey приводит к ошибке, вместо того чтобы впоследствии молча завершить работу.
References: #1238
Добавлена ошибка NotImplementedError для метода params() в конструкциях Insert/Update/Delete. В настоящее время эти элементы не поддерживают данную функциональность, что также будет немного вводить в заблуждение по сравнению с values().
Отраженные внешние ключи будут правильно определять местоположение своего ссылающегося столбца, даже если столбцу был присвоен атрибут «ключ», отличный от отраженного имени. Это достигается с помощью нового флага в ForeignKey/ForeignKeyConstraint под названием «link_to_name», если True означает, что данное имя является именем столбца, на который ссылаются, а не его назначенным ключом.
References: #650
select() может принимать ClauseList в качестве столбца так же, как таблицу или другой selectable, и внутренние выражения будут использоваться в качестве элементов столбца.
References: #1253
флаг «пассивный» в session.is_modified() корректно передается менеджеру атрибутов.
union() и union_all() не уничтожат order_by(), который был применен к select()ам внутри. Если вы объединяете() select() с order_by() (предположительно для поддержки LIMIT/OFFSET), вы также должны вызвать self_group(), чтобы применить скобки.
mysql¶
Знаки «%» в конструкциях text() автоматически экранируются до «%%». Из-за обратной несовместимости этого изменения выдается предупреждение, если в строке обнаружено „%%“.
Исправлена ошибка в возникновении исключения при отсутствии столбцов FK во время отражения.
References: #1241
Исправлена ошибка, связанная с отражением таблицы удаленной схемы с внешним ключом, ссылающимся на другую таблицу в этой схеме.
sqlite¶
Отражение таблицы теперь хранит фактическое значение DefaultClause для столбца.
References: #1266
исправления ошибок, изменения в поведении
mssql¶
Добавлен новый тип MSGenericBinary. Он сопоставляется с типом Binary, поэтому может реализовать специализированное поведение обработки типов, заданных длиной, как типов Binary фиксированной ширины, а типов без длины - как типов Binary переменной длины без привязки.
Добавлены новые типы: MSVarBinary и MSImage.
References: #1249
Добавлено в типы MSReal, MSNText, MSSmallDateTime, MSTime, MSDateTimeOffset и MSDateTime2
Переработаны типы Дата/Время. Тип данных
smalldatetime
больше не усекается только до даты и теперь будет отображаться на тип MSSmallDateTime.References: #1254
Исправлена проблема, связанная с тем, что Numerics принимает значение int.
Сопоставил
char_length
с функциейLEN()
.Если
INSERT
включает подвыборку, тоINSERT
преобразуется из конструкцииINSERT INTO VALUES
в конструкциюINSERT INTO SELECT
.Если столбец является частью
primary_key
, он будетNOT NULL
, поскольку MSSQL не допускаетNULL
в столбцах primary_key.MSBinary
теперь возвращаетBINARY
вместоIMAGE
. Это изменение обратно несовместимо, посколькуBINARY
является типом данных фиксированной длины, тогда какIMAGE
является типом данных переменной длины.References: #1249
get_default_schema_name
теперь отражается из базы данных на основе схемы пользователя по умолчанию. Это работает только с MSSQL 2005 и более поздними версиями.References: #1258
Добавлена поддержка collation с помощью нового аргумента collation. Это поддерживается для следующих типов: char, nchar, varchar, nvarchar, text, ntext.
References: #1248
Изменения параметров строки соединения благоприятствуют использованию DSN в качестве спецификации по умолчанию для pyodbc. Подробные инструкции по использованию см. в docstring mssql.py.
Добавлена экспериментальная поддержка точек сохранения. В настоящее время она не полностью работает с сессиями.
Поддержка трех уровней недействительности столбцов: NULL, NOT NULL и конфигурация базы данных по умолчанию. Конфигурация Column по умолчанию (nullable=True) теперь будет генерировать NULL в DDL. Ранее спецификация не выдавалась, и в силу вступало значение по умолчанию базы данных (обычно NULL, но не всегда). Чтобы явно запросить значение по умолчанию базы данных, настройте столбцы с nullable=None, и в DDL не будет выдаваться спецификация. Это несовместимое с предыдущими версиями поведение.
References: #1243
oracle¶
Скорректирован формат функции create_xid() для исправления двухфазной фиксации. Теперь у нас есть полевые отчеты о том, что двухфазная фиксация Oracle работает правильно с этим изменением.
Добавлен тип OracleNVarchar, который производит NVARCHAR2, а также подклассы Unicode, так что convert_unicode=True по умолчанию. NVARCHAR2 отражается в этот тип автоматически, поэтому эти столбцы передают юникод в отраженной таблице без явных флагов convert_unicode=True.
References: #1233
Исправлена ошибка, которая не позволяла получать out params определенных типов; большое спасибо huddlej на wwu.edu !
References: #1265
misc¶
Добавлен новый атрибут description_encoding для диалекта, который используется для кодировки имени колонки при обработке метаданных. Обычно по умолчанию это utf-8.
Connection.invalidate() проверяет закрытый статус, чтобы избежать ошибок атрибутов.
References: #1246
NullPool поддерживает поведение повторного подключения при сбое.
References: #1094
Добавлен мьютекс для начального создания пула при использовании pool.manage(dbapi). Это предотвращает незначительный случай поведения «dogpile», которое могло бы произойти при запуске с большой нагрузкой.
References: #799
_execute_clauseelement() снова становится приватным методом. Подкласс Connection не нужен теперь, когда есть ConnectionProxy.
Билеты.
Добавлено примечание о настройках create_session() по умолчанию.
Добавлен раздел о metadata.reflect().
Обновлен раздел TypeDecorator.
Переписали раздел документации по стратегии «threadlocal» из-за недавней путаницы с этой функцией.
Удалены сильно устаревшие документы „polymorphic_fetch“ и „select_table“ из наследования, переработана вторая половина статьи «Наследование объединенных таблиц».
Документирован кварг comparator_factory, добавлен новый раздел документации «Пользовательские компараторы».
Знаки «%» в конструкциях text() автоматически экранируются до «%%». Из-за обратной несовместимости этого изменения выдается предупреждение, если в строке обнаружено „%%“.
References: #1267
Вызов alias.execute() в сочетании с server_side_cursors не вызовет ошибку AttributeError.
Добавлена поддержка отражения индексов в PostgreSQL, используя замечательный патч, которым мы долго пренебрегали, представленный Ken Kuhlman.
References: #714
Свойства ассоциативного прокси становятся доступными на уровне класса, например, MyClass.aproxy. Ранее это значение равнялось None.
Полный список аргументов, принимаемых как строка функцией backref(), включает „primaryjoin“, „secondaryjoin“, „secondary“, „foreign_keys“, „remote_side“, „order_by“.
0.5.0rc4¶
Released: Fri Nov 14 2008general¶
глобальное изменение «propigate»->»propagate».
orm¶
Query.count() был усовершенствован, чтобы делать «правильные вещи» в более широком спектре случаев. Теперь он может подсчитывать запросы с несколькими элементами, а также запросы на основе столбцов. Обратите внимание, что это означает, что если вы скажете query(A, B).count() без какого-либо критерия объединения, то будет подсчитано картезианское произведение A*B. Любой запрос к сущностям на основе столбцов автоматически выдает «SELECT count(1) FROM (SELECT…)», так что возвращается реальное количество строк, то есть запрос типа query(func.count(A.name)).count() вернет значение один, поскольку этот запрос вернет одну строку.
Много настроек производительности. По приблизительным подсчетам для различных операций ORM он на 10% быстрее, чем 0.5.0rc3, на 25-30% быстрее, чем 0.4.8.
исправления ошибок и изменения поведения
Корректировки в улучшенной сборке мусора для InstanceState для лучшей защиты от ошибок из-за потери состояния.
Query.get() возвращает более информативное сообщение об ошибке при выполнении для нескольких сущностей.
References: #1220
Восстановлена ошибка NotImplementedError на Cls.relation.in_()
Исправлено предупреждение PendingDeprecationWarning, связанное с параметром order_by в relation().
References: #1226
sql¶
Удален атрибут „properties“ объекта Connection, следует использовать Connection.info.
Восстановлена выборка «активного количества рядов» перед тем, как ResultProxy автозакрывает курсор. Это было удалено в версии 0.5rc3.
Перестроили метод load_dialect_impl() в TypeDecorator таким образом, что он будет действовать, даже если пользовательский TypeDecorator использует другой TypeDecorator в качестве своего impl.
mssql¶
Много чистки и исправлений для устранения проблем с лимитом и смещением.
Исправление ситуации, когда подзапросы как часть бинарного выражения должны быть переведены для использования синтаксиса IN и NOT IN.
Исправлена проблема с нотацией E, которая не позволяла вставлять десятичные значения меньше 1E-6.
References: #1216
Исправлены проблемы с отражением при работе со схемами, особенно когда эти схемы являются схемами по умолчанию.
References: #1217
Исправлена проблема с преобразованием элемента нулевой длины в varchar. Теперь он правильно корректирует CAST.
misc¶
Добавлена поддержка типа валюты.
Функции не возвращают свой результат.
References: #1017
Исправлена проблема с соединениями. Access поддерживает только LEFT OUTER или INNER, а не только JOIN сам по себе.
References: #1017
Теперь можно использовать пользовательское «inherit_condition» в __mapper_args__ при использовании декларативности.
исправлено некорректное распространение строк «remote_side», «order_by» и других при использовании в функции backref().
0.5.0rc3¶
Released: Fri Nov 07 2008orm¶
В SessionExtension добавлены два новых хука: after_bulk_delete() и after_bulk_update(). after_bulk_delete() вызывается после операции массового удаления() запроса. after_bulk_update() вызывается после операции массового обновления() запроса.
Сравнение «не равно» простого отношения «многие-к-одному» к экземпляру не будет попадать в предложение EXISTS и вместо этого будет сравнивать столбцы внешнего ключа.
Удалены не совсем рабочие случаи использования сравнения коллекции с итерабельной. Используйте contains() для проверки принадлежности к коллекции.
Улучшено поведение объектов aliased() таким образом, что они более точно адаптируют генерируемые выражения, что особенно помогает при самореферентных сравнениях.
References: #1171
Исправлена ошибка, связанная с условиями primaryjoin/secondaryjoin, построенными из связанных с классом атрибутов (как часто происходит при использовании декларативных), которые впоследствии неправильно алиасировались Query, особенно с различными компараторами на основе EXISTS.
Исправлена ошибка при использовании нескольких query.join() с дескриптором, связанным по алиасу, в результате которой терялся левый алиас.
Улучшено управление памятью weakref identity map, теперь не требуется мьютексирование, воскрешение собранного в мусор экземпляра на ленивой основе для InstanceState с ожидающими изменениями.
Объект InstanceState теперь удаляет циклические ссылки на себя при удалении, чтобы сохранить его вне циклической сборки мусора.
relation() не будет скрывать несвязанные ошибки ForeignKey внутри сообщения «please specify primaryjoin» при определении условия присоединения.
Исправлена ошибка в Query с использованием order_by() в сочетании с несколькими псевдонимами одного класса (будут добавлены тесты)
References: #1218
При использовании Query.join() с явным условием для условия ON, условие будет алиасировано в терминах левой части объединения, что позволяет сценариям типа query(Source).from_self().join((Dest, Source.id==Dest.source_id)) работать правильно.
Функция polymorphic_union() учитывает «ключ» каждого столбца, если они отличаются от имени столбца.
Исправлена поддержка «пассивных удалений» для отношения многие-к-одному() с каскадом «удаления».
References: #1183
Исправлена ошибка в составных типах, из-за которой составной тип с первичным ключом не мог быть изменен.
References: #1213
Добавлена большая детализация доступа к внутренним атрибутам, так что операции cascade и flush не инициализируют выгруженные атрибуты и коллекции, оставляя их нетронутыми для последующей ленивой загрузки. События Backref по-прежнему инициализируют атрибуты и коллекции для ожидающих экземпляров.
References: #1202
sql¶
Оптимизация и снижение сложности компилятора SQL. Количество вызовов для компиляции типичной конструкции select() на 20% меньше по сравнению с 0.5.0rc2.
Диалекты теперь могут генерировать имена меток регулируемой длины. Передайте аргумент «label_length=<значение>» в create_engine(), чтобы настроить максимальное количество символов в динамически генерируемых метках колонок, т.е. «somecolumn AS somelabel». Любое значение меньше 6 приведет к созданию метки минимального размера, состоящей из символа подчеркивания и числового счетчика. Компилятор использует значение dialect.max_identifier_length по умолчанию.
References: #1211
Упрощена проверка ResultProxy на «автозакрытие без результатов», основанная только на наличии cursor.description. Убрано все предположение на основе regexp об операторах, возвращающих строки.
References: #1212
Прямое выполнение конструкции union() правильно настроит обработку результирующей строки.
References: #1194
Внутреннее понятие колонки «OID» или «ROWID» было удалено. Он практически не используется ни в одном диалекте, а возможность его использования с cursor.lastrowid в psycopg2 практически исчезла теперь, когда доступен INSERT…RETURNING.
Удален метод «default_order_by()» для всех объектов FromClause.
Исправлен метод table.tometadata() таким образом, чтобы переданный аргумент схемы распространялся на конструкции ForeignKey.
Немного изменено поведение оператора IN для сравнения с пустыми коллекциями. Теперь он приводит к неравенству при сравнении с самим собой. Более переносимо, но нарушает работу с хранимыми процедурами, которые не являются чистыми функциями.
mysql¶
Исправлено отражение внешнего ключа в случае, когда явная схема таблицы совпадает со схемой (базы данных), к которой подключено соединение.
Больше не ожидается, что include_columns в отражении таблицы будет в нижнем регистре.
oracle¶
Написал docstring для диалекта Oracle. Видимо, ярлык Ohloh «мало комментариев к исходному коду» начинает жалить :).
Удален флаг оптимизации FIRST_ROWS() при использовании LIMIT/OFFSET, может быть снова включен с помощью флага optimize_limits=True create_engine().
References: #536
исправления ошибок и изменения поведения
Установка параметра auto_convert_lobs в False в create_engine() также даст указание типу OracleBinary возвращать объект cx_oracle LOB без изменений.
misc¶
Добавлено новое расширение sqlalchemy.ext.serializer. Предоставляет «классы» сериализатора/десериализатора, которые отражают Pickle/Unpickle, а также dumps() и loads(). Этот сериализатор реализует «внешний объект» pickler, который сохраняет ключевые контекстно-зависимые объекты, включая движки, сессии, метаданные, таблицы/колонки и мапперы, вне потока pickle, и может позже восстановить pickle с помощью любого движка/провайдера метаданных/сеанса. Это используется не для травления экземпляров регулярных объектов, которые можно травить без какой-либо специальной логики, а для травления объектов выражений и полных объектов Query, так что все зависимости маппера/движка/сеанса могут быть восстановлены во время распикировки.
Исправлена ошибка, не позволяющая использовать декларативно-связанные объекты «колонки» в column_mapped_collection().
References: #1174
Функция util.flatten_iterator() не интерпретирует строки с методами __iter__() как итераторы, как в pypy.
References: #1077
0.5.0rc2¶
Released: Sun Oct 12 2008orm¶
Исправлена ошибка, связанная с отношениями чтения/записи, которые содержат литеральные или другие нестолбцовые выражения в условии primaryjoin, приравненные к столбцу внешнего ключа.
»Непакетный» режим в mapper(), функция, позволяющая вызывать методы расширения mapper по мере обновления/вставки каждого экземпляра, теперь учитывает порядок вставки заданных объектов.
Исправлена ошибка, связанная с RLock в маппере, которая могла привести к тупиковой ситуации при вызове reentrant mapper compile(), что происходит при использовании декларативных конструкций внутри объектов ForeignKey.
ScopedSession.query_property теперь принимает фабрику query_cls, переопределяя настроенный query_cls сессии.
Исправлена ошибка с общим состоянием, мешавшая способности ScopedSession.mapper применять реализацию __init__ по умолчанию к подклассам объектов.
Исправлены срезы в Query (т.е. query[x:y]) для корректной работы для срезов нулевой длины, срезов с None на обоих концах.
References: #1177
Добавлен пример, иллюстрирующий «вложенные множества» Селко в качестве отображения SQLA.
contains_eager() с аргументом alias работает, даже если псевдоним встроен в SELECT, как при отправке в Query через query.select_from().
Использование contains_eager() теперь совместимо с запросом, который также содержит обычную eager-загрузку и limit/offset, так как столбцы добавляются в подзапрос, создаваемый запросом.
References: #1180
session.execute() будет выполнять переданный ему объект Sequence (регрессия с 0.4).
Удален аргумент ключевого слова «raiseerror» из object_mapper() и class_mapper(). Эти функции во всех случаях выдают ошибку, если заданный класс/экземпляр не сопоставлен.
Исправлено, что сессия session.transaction.commit() при autocommit=False не начинала новую транзакцию.
Некоторые изменения в поведении слабых ссылок Session.identity_map для уменьшения побочных эффектов асинхронного GC.
Корректировка учета новых «чистых» объектов после очистки Session для лучшей защиты от работы с объектами во время их асинхронного gc’ed.
References: #1182
sql¶
column.in_(someselect) теперь можно использовать как выражение columns-clause без подзапроса, проникающего в предложение FROM
References: #1074
mysql¶
Временные таблицы теперь можно отражать.
sqlite¶
Переработана обработка привязки/результатов SQLite даты/времени для использования регулярных выражений и форматных строк, а не strptime/strftime, для общей поддержки дат до 1900 года, дат с микросекундами.
References: #968
В диалекте sqlite отключена логика convert_unicode для строк (и Unicode, UnicodeText и т.д.), чтобы адаптироваться к новому требованию pysqlite 2.5.0 о том, что принимаются только объекты Python unicode; https://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html.
oracle¶
Oracle будет распознавать строковые операторы, содержащие комментарии перед SELECT, как операторы SELECT.
References: #1187
0.5.0rc1¶
Released: Thu Sep 11 2008orm¶
Query теперь имеет методы delete() и update(values). Это позволяет выполнять массовые удаления/обновления с помощью объекта Query.
Объект RowTuple, возвращаемый Query(*cols), теперь имеет ключевые имена, которые предпочитают сопоставленные имена атрибутов ключам колонок, а ключи колонок именам колонок, т.е. Query(Class.foo, Class.bar) будет иметь имена «foo» и «bar», даже если это не имена базовых объектов Column. Прямые объекты Column, такие как Query(table.c.col), вернут атрибут «ключ» Column.
В Query добавлены методы scalar() и value(), каждый из которых возвращает одно скалярное значение. scalar() не принимает никаких аргументов и примерно эквивалентен first()[0], value() принимает выражение из одного столбца и примерно эквивалентен values(expr).next()[0].
Улучшено определение условия FROM при помещении SQL-выражений в список сущностей запроса query(). В частности, скалярные подзапросы не должны «сливать» свои внутренние объекты FROM во вложенный запрос.
Присоединения по relation() от сопоставленного класса к сопоставленному подклассу, где сопоставленный подкласс настроен с наследованием одной таблицы, будут включать предложение IN, которое ограничивает подтипы присоединенного класса теми, которые запрашиваются в предложении ON присоединения. Это действует для соединений с нетерпеливой загрузкой, а также для query.join(). Обратите внимание, что в некоторых сценариях предложение IN будет появляться и в предложении WHERE запроса, поскольку эта дискриминация имеет несколько точек срабатывания.
AttributeExtension было усовершенствовано таким образом, что событие запускается до того, как произойдет мутация. Кроме того, методы append() и set() теперь должны возвращать заданное значение, которое используется в качестве значения, применяемого в операции мутации. Это позволяет создавать проверяющие AttributeListeners, которые срабатывают до того, как действие фактически произошло, и которые могут изменить заданное значение на что-то другое до его использования.
column_property(), composite_property() и relation() теперь принимают одно или список расширений AttributeExtensions, используя аргумент ключевого слова «extension».
query.order_by().get() молча удаляет «ORDER BY» из запроса, выданного GET, но не вызывает исключения.
Добавлено расширение Validator AttributeExtension, а также декоратор @validates, который используется аналогично @reconstructor и отмечает метод как проверяющий один или несколько сопоставленных атрибутов.
class.someprop.in_() вызывает NotImplementedError, ожидая реализации «in_» для отношения
References: #1140
Исправлено обновление первичного ключа для коллекций «многие ко многим», когда коллекция еще не была загружена
References: #1127
Исправлена ошибка, из-за которой столбцы deferred() с группой в сочетании с не связанным с ними синонимом() при отложенной загрузке выдавали ошибку AttributeError.
Хук before_flush() на SessionExtension происходит до того, как список new/dirty/deleted будет вычислен в последний раз, что позволяет процедурам внутри before_flush() дополнительно изменить состояние сессии до того, как произойдет смыв.
References: #1128
Аргумент «расширение» для Session и других теперь может опционально быть списком, поддерживая события, отправленные нескольким экземплярам SessionExtension. Session помещает SessionExtensions в Session.extensions.
Повторяющиеся вызовы flush() вызывают ошибку. Это также служит элементарной, но не надежной проверкой против одновременных вызовов Session.flush().
Улучшено поведение query.join() при присоединении к подклассам наследования объединенных таблиц, используя явные критерии присоединения (т.е. не по отношению).
@orm.attributes.reconstitute и MapperExtension.reconstitute были переименованы в @orm.reconstructor и MapperExtension.reconstruct_instance
Исправлен хук @reconstructor для подклассов, которые наследуются от базового класса.
References: #1129
Тип свойства composite() теперь поддерживает метод __set_composite_values__() на классе composite, который необходим, если класс представляет состояние, используя имена атрибутов, отличные от ключевых имен колонок; значения, сгенерированные по умолчанию, теперь правильно заполняются при промывке. Кроме того, композиты с атрибутами, установленными на None, корректно сравниваются.
References: #1132
Кортеж итераций, возвращаемый attributes.get_history(), теперь может быть смесью списков и кортежей. (Ранее члены всегда были списками).
Исправлена ошибка, при которой изменение атрибута первичного ключа в сущности, где предыдущее значение атрибута было просрочено, приводило к ошибке при flush().
References: #1151
Исправлена ошибка пользовательского инструментария, из-за которой функция get_instance_dict() не вызывалась для вновь созданных экземпляров, не загруженных ORM.
Session.delete() добавляет данный объект в сессию, если его еще нет. Это была ошибка регрессии из версии 0.4.
References: #1150
Флаг echo_uow для Session устарел, и протоколирование единиц работы теперь ведется только на уровне приложения, а не на уровне каждой сессии.
Удален конфликтующий оператор contains() из InstrumentedAttribute, который не принимал кваарг escape.
References: #1153
sql¶
Временно свернута работа над усовершенствованием «ORDER BY». Эта функция приостановлена в ожидании дальнейшей разработки.
References: #1068
Конструкция exists() не будет «экспортировать» содержащийся в ней список элементов в предложение FROM, что позволяет более эффективно использовать их в предложении columns в SELECT.
and_() и or_() теперь генерируют ColumnElement, позволяя использовать булевы выражения в качестве столбцов результатов, т.е. select([and_(1, 0)]).
References: #798
Bind params теперь подкласс ColumnElement, что позволяет им быть выбираемыми с помощью orm.query (они уже имели большинство семантик ColumnElement).
В конструкцию exists() добавлен метод select_from(), который становится все более совместимым с обычным select().
Добавлены func.min(), func.max(), func.sum() как «общие функции», что позволяет автоматически определять тип их возврата. Помогает при работе с датами на SQLite, десятичными типами и др.
References: #1160
добавлен decimal.Decimal в качестве типа «автоматического определения»; параметры привязки и общие функции будут устанавливать свой тип на Numeric, если используется Decimal.
schema¶
Добавлен аксессор «sorted_tables» к MetaData, который возвращает объекты Table, отсортированные в порядке зависимости в виде списка. Это устаревает метод MetaData.table_iterator(). Аргумент с ключевым словом «reverse=False» также был удален из util.sort_tables(); используйте функцию Python „reversed“, чтобы обратить результаты.
References: #1033
Аргумент „length“ для всех типов Numeric был переименован в „scale“. „length“ является устаревшим и по-прежнему принимается с предупреждением.
Устранена совместимость с 0.3 для типов, определяемых пользователем (convert_result_value, convert_bind_param).
mysql¶
Аргумент „length“ для MSInteger, MSBigInteger, MSTinyInteger, MSSmallInteger и MSYear был переименован в „display_width“.
Добавлен тип MSMediumInteger.
References: #1146
функция func.utc_timestamp() компилируется в UTC_TIMESTAMP, без скобок, которые мешают при использовании в сочетании с executemany().
oracle¶
limit/offset больше не использует ROW NUMBER OVER для ограничения строк, а вместо этого использует подзапросы в сочетании со специальным комментарием оптимизации Oracle. Позволяет LIMIT/OFFSET работать в сочетании с DISTINCT.
References: #536
has_sequence() теперь учитывает текущий аргумент «схема»
References: #1155
добавление BFILE в имена отраженных типов
References: #1121
misc¶
Исправлена ошибка, при которой mapper не мог инициализироваться, если составной первичный ключ ссылался на другую таблицу, которая еще не была определена.
References: #1161
Исправлено исключение, возникавшее при использовании строкового условия primaryjoin в сочетании с backref.
0.5.0beta3¶
Released: Mon Aug 04 2008orm¶
Функция «имя_сущности» в мапперах SQLAlchemy была удалена. Обоснование см. на сайте https://tinyurl.com/6nm2ne.
флаг «autoexpire» для Session, sessionmaker() и scoped_session() был переименован в «expire_on_commit». Это не влияет на поведение истечения срока действия функции rollback().
исправлена ошибка бесконечного цикла, которая могла возникнуть в отложенной загрузке унаследованных атрибутов в маппере.
в Session добавлен поддерживающий наследие флаг «_enable_transaction_accounting», который при значении False отключает весь учет объектов на уровне транзакций, включая expire on rollback, expire on commit, new/deleted list maintenance, и autoflush on begin.
Параметр „cascade“ в relation() принимает значение None, что эквивалентно отсутствию каскадов.
Критическое исправление динамических отношений позволяет правильно очищать «измененную» историю после выполнения функции flush().
Определенные пользователем @свойства класса обнаруживаются и оставляются на месте во время инициализации маппера. Это означает, что связанный с таблицей столбец с тем же именем не будет отображен, если на пути стоит @свойство (и столбец не переименован в другое имя), также не будет применен инструментальный атрибут из унаследованного класса. Те же правила применяются для имен, исключенных с помощью коллекций include_properties/exclude_properties.
Добавлен новый хук SessionExtension под названием after_attach(). Он вызывается в точке присоединения для объектов через add(), add_all(), delete() и merge().
Картограф, который наследуется от другого, при наследовании столбцов наследуемого картографа будет использовать любые переназначенные имена свойств, указанные в наследуемом картографе. Ранее, если «Base» переназначал «base_id» на имя «id», то «SubBase(Base)» все равно получал атрибут с именем «base_id». Это можно было бы обойти, явно указывая колонку в каждом подмаппере, но это довольно непрактично, а также невозможно при использовании декларативности.
References: #1111
Исправлена серия потенциальных условий гонки в Session, при которых асинхронный GC мог удалить немодифицированные, больше не ссылающиеся элементы из сессии, если они присутствовали в списке обрабатываемых элементов, обычно во время session.expunge_all() и зависимых методов.
Некоторые улучшения в механизме _CompileOnAttr, которые должны уменьшить вероятность появления предупреждений «Атрибут x не был заменен во время компиляции». (это, как правило, относится к хакерам SQLA, например, разработчикам Elixir).
Исправлена ошибка, при которой FlushError «несохраненный, ожидающий экземпляр», возникающая для ожидающего сироты, не учитывала отображающие суперклассы при генерации списка отношений, ответственных за ошибку.
sql¶
func.count() без аргументов отображается как COUNT(*), что эквивалентно func.count(text(„*“)).
простые имена меток в выражениях ORDER BY отображаются сами по себе, а не как повторное выражение соответствующего выражения. В настоящее время эта возможность включена только для SQLite, MySQL и PostgreSQL. Она может быть включена для других диалектов, если будет показано, что каждый из них поддерживает такое поведение.
References: #1068
mysql¶
Цитирование значений MSEnum для использования в CREATE TABLE теперь необязательно и будет котироваться по требованию. (Котирование всегда было необязательным для использования с существующими таблицами).
References: #1110
misc¶
Атрибуты, связанные с классом, отправленные в качестве аргументов для параметров remote_side и foreign_keys в relation(), теперь принимаются, что позволяет использовать их в декларативном режиме. Дополнительно исправлены ошибки, связанные с указанием order_by в качестве связанного с классом атрибута в сочетании с ускоренной загрузкой.
декларативная инициализация колонок скорректирована таким образом, что непереименованные колонки инициализируются так же, как и не декларативный картограф. Это позволяет наследующему отобразителю настраивать свои одноименные колонки «id», в частности, таким образом, что родительская колонка «id» будет предпочтительнее дочерней колонки, уменьшая количество обращений к базе данных при запросе этого значения.
0.5.0beta2¶
Released: Mon Jul 14 2008orm¶
В дополнение к атрибутам с истекшим сроком действия, отложенные атрибуты также загружаются, если их данные присутствуют в наборе результатов.
References: #870
session.refresh() выдает информативное сообщение об ошибке, если в списке атрибутов нет атрибутов на основе столбцов.
query() выдает информативное сообщение об ошибке, если не указаны столбцы или мапперы.
Ленивые загрузчики теперь запускают autoflush перед продолжением работы. Это позволяет функции expire() коллекции или скалярного отношения правильно функционировать в контексте autoflush.
Атрибуты column_property(), которые представляют SQL-выражения или столбцы, не присутствующие в сопоставленных таблицах (например, столбцы представлений), автоматически истекают после INSERT или UPDATE, предполагая, что они не были локально изменены, так что они обновляются самыми последними данными при доступе.
References: #887
Исправлены явные самореферентные соединения между двумя отображателями наследования объединенных таблиц при использовании query.join(cls, aliased=True).
References: #1082
Исправлена функция query.join() при использовании в соединении с предложением «только столбцы» и предложением SQL-выражения ON в соединении.
Флаг «allow_column_override» из mapper() был удален. Этот флаг практически всегда понимается неправильно. Его специфическая функциональность доступна через аргументы include_properties/exclude_properties mapper.
Исправлен метод __str__() в Query.
References: #1066
Session.bind используется по умолчанию, даже если определены привязки для конкретных таблиц/мапперов.
sql¶
Добавлен новый оператор match(), выполняющий полнотекстовый поиск. Поддерживаются бэкенды PostgreSQL, SQLite, MySQL, MS-SQL и Oracle.
schema¶
Добавлена опция prefixes в Table, которая принимает список строк для вставки после CREATE в операторе CREATE TABLE.
References: #1075
Типы Unicode, UnicodeText теперь устанавливают «assert_unicode» и «convert_unicode» по умолчанию, но допускают переопределение **kwargs для этих значений.
extensions¶
Declarative поддерживает переменную класса __table_args__, которая представляет собой либо словарь, либо кортеж вида (arg1, arg2, …, {kwarg1:value, …}), содержащий позиционные + kw аргументы для передачи конструктору Table.
References: #1096
sqlite¶
Изменили представление «микросекунд» в SQLite, чтобы оно соответствовало выводу str(somedatetime), т.е. чтобы микросекунды были представлены как дробные секунды в формате строки. Это делает тип даты SQLA SQLite совместимым с датами, которые были сохранены непосредственно с помощью Pysqlite (который просто вызывает str()). Обратите внимание, что это несовместимо с существующими значениями микросекунд в файле базы данных SQLA 0.4, сгенерированном SQLite.
Чтобы вернуть старое поведение глобально:
from sqlalchemy.databases.sqlite import DateTimeMixin DateTimeMixin.__legacy_microseconds__ = True
Чтобы получить поведение для отдельных типов DateTime:
t = sqlite.SLDateTime() t.__legacy_microseconds__ = True
Затем используйте «t» в качестве типа на колонке.
References: #1090
Типы SQLite Date, DateTime и Time сейчас принимают только объекты Python datetime, а не строки. Если вы хотите самостоятельно форматировать даты как строки в SQLite, используйте тип String. Если вы хотите, чтобы они все равно возвращали объекты datetime, несмотря на то, что принимают строки в качестве входных данных, сделайте TypeDecorator вокруг String - SQLA не поощряет такой шаблон.
0.5.0beta1¶
Released: Thu Jun 12 2008general¶
глобальное изменение «propigate»->»propagate».
orm¶
Функция polymorphic_union() учитывает «ключ» каждого столбца, если они отличаются от имени столбца.
Исправлена ошибка только в версии 0.4, из-за которой составные колонки не работали должным образом с наследуемыми отображателями
References: #1199
Исправлена связанная с RLock ошибка в маппере, которая могла привести к тупику при вызове reentrant mapper compile(), что происходит при использовании декларативных конструкций внутри объектов ForeignKey. Перенесено из 0.5.
Исправлена ошибка в составных типах, из-за которой составной тип с первичным ключом не мог быть изменен.
References: #1213
Добавлен аксессуар ScopedSession.is_active.
References: #976
Связанный с классом аксессор можно использовать в качестве аргумента relation() order_by.
References: #939
Исправлен аргумент shard_id в ShardedSession.execute().
References: #1072
sql¶
Connection.invalidate() проверяет закрытый статус, чтобы избежать ошибок атрибутов.
References: #1246
NullPool поддерживает поведение повторного подключения при сбое.
References: #1094
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.
References: #1299
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.
mysql¶
Исправлена ошибка в возникновении исключения при отсутствии столбцов FK во время отражения.
References: #1241
oracle¶
Исправлена ошибка, которая не позволяла получать out params определенных типов; большое спасибо huddlej на wwu.edu !
References: #1265
firebird¶
Добавлена поддержка возврата значений при вставках (только 2.0+), обновлениях и удалениях (только 2.1+).
misc¶
Триггер/декоратор «__init__», добавленный mapper, теперь пытается точно повторять сигнатуру аргументов оригинального __init__. Передача для „_sa_session“ больше не является неявной - вы должны разрешить этот аргумент ключевого слова в вашем конструкторе.
ClassState переименован в ClassManager.
Классы могут предоставить свой собственный InstrumentationManager, указав свойство __sa_instrumentation_manager__.
Пользовательская инструментация может использовать любой механизм для ассоциации ClassManager с классом и InstanceState с экземпляром. Атрибуты этих объектов по-прежнему являются механизмом ассоциации по умолчанию, используемым встроенными инструментами SQLAlchemy.
Переместил entity_name, _sa_session_id и _instance_key из объекта экземпляра в состояние экземпляра. Эти значения все еще доступны старым способом, который теперь устарел, с помощью дескрипторов, прикрепленных к классу. При обращении к ним будет выдано предупреждение об устаревании.
Псевдоним _prepare_instrumentation для prepare_instrumentation был удален.
sqlalchemy.exceptions был переименован в sqlalchemy.exc. Модуль может быть импортирован под любым именем.
Исключения, связанные с ORM, теперь определяются в sqlalchemy.orm.exc. Псевдонимы совместимости ConcurrentModificationError, FlushError и UnmappedColumnError устанавливаются в sqlalchemy.exc во время импорта sqlalchemy.orm.
sqlalchemy.logging был переименован в sqlalchemy.log.
Переходный псевдоним sqlalchemy.log.SADeprecationWarning для определения предупреждения в sqlalchemy.exc был удален.
exc.AssertionError был удален и заменен встроенным в Python AssertionError.
Поведение MapperExtensions, прикрепленных к нескольким, entity_name= первичным отобразителям для одного класса, было изменено. Первый mapper(), определенный для класса, является единственным mapper, имеющим право на получение событий MapperExtension „instrument_class“, „init_instance“ и „init_failed“. Это обратная несовместимость; ранее расширения последнего определенного отображателя получали эти события.
Добавлена поддержка отражения индексов в Postgres с использованием замечательного патча, которым мы долго пренебрегали, представленного Кеном Кулманом.
References: #714