:released: Fri May 20 2011
.. change::
:tags:
:tickets:
This section documents those changes from 0.7b4
to 0.7.0. For an overview of what's new in
SQLAlchemy 0.7, see
https://docs.sqlalchemy.org/en/latest/changelog/migration_07.html
.. change::
:tags: orm
:tickets: 2069
Fixed regression introduced in 0.7b4 (!) whereby
query.options(someoption("nonexistent name")) would
fail to raise an error. Also added additional
error catching for cases where the option would
try to build off a column-based element, further
fixed up some of the error messages tailored
in
.. change::
:tags: orm
:tickets: 2162
query.count() emits "count(*)" instead of
"count(1)".
.. change::
:tags: orm
:tickets: 2155
Fine tuning of Query clause adaptation when
from_self(), union(), or other "select from
myself" operation, such that plain SQL expression
elements added to filter(), order_by() etc.
which are present in the nested "from myself"
query *will* be adapted in the same way an ORM
expression element will, since these
elements are otherwise not easily accessible.
.. change::
:tags: orm
:tickets: 2149
Fixed bug where determination of "self referential"
relationship would fail with no workaround
for joined-inh subclass related to itself,
or joined-inh subclass related to a subclass
of that with no cols in the sub-sub class
in the join condition.
Also in 0.6.8.
.. change::
:tags: orm
:tickets: 2153
mapper() will ignore non-configured foreign keys
to unrelated tables when determining inherit
condition between parent and child class,
but will raise as usual for unresolved
columns and table names regarding the inherited
table. This is an enhanced generalization of
behavior that was already applied to declarative
previously. 0.6.8 has a more
conservative version of this which doesn't
fundamentally alter how join conditions
are determined.
.. change::
:tags: orm
:tickets: 2144
It is an error to call query.get() when the
given entity is not a single, full class
entity or mapper (i.e. a column). This is
a deprecation warning in 0.6.8.
.. change::
:tags: orm
:tickets: 2148
Fixed a potential KeyError which under some
circumstances could occur with the identity
map, part of
.. change::
:tags: orm
:tickets:
added Query.with_session() method, switches
Query to use a different session.
.. change::
:tags: orm
:tickets: 2131
horizontal shard query should use execution
options per connection as per
.. change::
:tags: orm
:tickets: 2151
a non_primary mapper will inherit the _identity_class
of the primary mapper. This so that a non_primary
established against a class that's normally in an
inheritance mapping will produce results that are
identity-map compatible with that of the primary
mapper (also in 0.6.8)
.. change::
:tags: orm
:tickets: 2163
Fixed the error message emitted for "can't
execute syncrule for destination column 'q';
mapper 'X' does not map this column" to
reference the correct mapper. .
Also in 0.6.8.
.. change::
:tags: orm
:tickets: 1502
polymorphic_union() gets a "cast_nulls" option,
disables the usage of CAST when it renders
the labeled NULL columns.
.. change::
:tags: orm
:tickets:
polymorphic_union() renders the columns in their
original table order, as according to the first
table/selectable in the list of polymorphic
unions in which they appear. (which is itself
an unordered mapping unless you pass an OrderedDict).
.. change::
:tags: orm
:tickets: 2171
Fixed bug whereby mapper mapped to an anonymous
alias would fail if logging were used, due to
unescaped % sign in the alias name.
Also in 0.6.8.
.. change::
:tags: sql
:tickets: 2167
Fixed bug whereby nesting a label of a select()
with another label in it would produce incorrect
exported columns. Among other things this would
break an ORM column_property() mapping against
another column_property(). .
Also in 0.6.8
.. change::
:tags: sql
:tickets:
Changed the handling in determination of join
conditions such that foreign key errors are
only considered between the two given tables.
That is, t1.join(t2) will report FK errors
that involve 't1' or 't2', but anything
involving 't3' will be skipped. This affects
join(), as well as ORM relationship and
inherit condition logic.
.. change::
:tags: sql
:tickets:
Some improvements to error handling inside
of the execute procedure to ensure auto-close
connections are really closed when very
unusual DBAPI errors occur.
.. change::
:tags: sql
:tickets:
metadata.reflect() and reflection.Inspector()
had some reliance on GC to close connections
which were internally procured, fixed this.
.. change::
:tags: sql
:tickets: 2140
Added explicit check for when Column .name
is assigned as blank string
.. change::
:tags: sql
:tickets: 2147
Fixed bug whereby if FetchedValue was passed
to column server_onupdate, it would not
have its parent "column" assigned, added
test coverage for all column default assignment
patterns. also in 0.6.8
.. change::
:tags: postgresql
:tickets:
Fixed the psycopg2_version parsing in the
psycopg2 dialect.
.. change::
:tags: postgresql
:tickets: 2141
Fixed bug affecting PG 9 whereby index reflection
would fail if against a column whose name
had changed. . Also in 0.6.8.
.. change::
:tags: mssql
:tickets: 2169
Fixed bug in MSSQL dialect whereby the aliasing
applied to a schema-qualified table would leak
into enclosing select statements.
Also in 0.6.8.
.. change::
:tags: documentation
:tickets: 2152
Removed the usage of the "collections.MutableMapping"
abc from the ext.mutable docs as it was being used
incorrectly and makes the example more difficult
to understand in any case.
.. change::
:tags: examples
:tickets:
removed the ancient "polymorphic association"
examples and replaced with an updated set of
examples that use declarative mixins,
"generic_associations". Each presents an alternative
table layout.
.. change::
:tags: ext
:tickets: 2143
Fixed bugs in sqlalchemy.ext.mutable extension where
`None` was not appropriately handled, replacement
events were not appropriately handled.
.. changelog::
:version: 0.7.0b4
:released: Sun Apr 17 2011
.. change::
:tags: general
:tickets:
Changes to the format of CHANGES, this file.
The format changes have been applied to
the 0.7 releases.
.. change::
:tags: general
:tickets:
The "-declarative" changes will now be listed
directly under the "-orm" section, as these
are closely related.
.. change::
:tags: general
:tickets:
The 0.5 series changes have been moved to
the file CHANGES_PRE_06 which replaces
CHANGES_PRE_05.
.. change::
:tags: general
:tickets:
The changelog for 0.6.7 and subsequent within
the 0.6 series is now listed only in the
CHANGES file within the 0.6 branch.
In the 0.7 CHANGES file (i.e. this file), all the
0.6 changes are listed inline within the 0.7
section in which they were also applied
(since all 0.6 changes are in 0.7 as well).
Changes that apply to an 0.6 version here
are noted as are if any differences in
implementation/behavior are present.
.. change::
:tags: orm
:tickets: 2122
Some fixes to "evaluate" and "fetch" evaluation
when query.update(), query.delete() are called.
The retrieval of records is done after autoflush
in all cases, and before update/delete is
emitted, guarding against unflushed data present
as well as expired objects failing during
the evaluation.
.. change::
:tags: orm
:tickets: 2063
Reworded the exception raised when a flush
is attempted of a subclass that is not polymorphic
against the supertype.
.. change::
:tags: orm
:tickets:
Still more wording adjustments when a query option
can't find the target entity. Explain that the
path must be from one of the root entities.
.. change::
:tags: orm
:tickets: 2123
Some fixes to the state handling regarding
backrefs, typically when autoflush=False, where
the back-referenced collection wouldn't
properly handle add/removes with no net
change. Thanks to Richard Murri for the
test case + patch.
(also in 0.6.7).
.. change::
:tags: orm
:tickets: 2127
Added checks inside the UOW to detect the unusual
condition of being asked to UPDATE or DELETE
on a primary key value that contains NULL
in it.
.. change::
:tags: orm
:tickets: 2127
Some refinements to attribute history. More
changes are pending possibly in 0.8, but
for now history has been modified such that
scalar history doesn't have a "side effect"
of populating None for a non-present value.
This allows a slightly better ability to
distinguish between a None set and no actual
change, affects as well.
.. change::
:tags: orm
:tickets: 2130
a "having" clause would be copied from the
inside to the outside query if from_self()
were used; in particular this would break
an 0.7 style count() query.
(also in 0.6.7)
.. change::
:tags: orm
:tickets: 2131
the Query.execution_options() method now passes
those options to the Connection rather than
the SELECT statement, so that all available
options including isolation level and
compiled cache may be used.
.. change::
:tags: sql
:tickets: 2131
The "compiled_cache" execution option now raises
an error when passed to a SELECT statement
rather than a Connection. Previously it was
being ignored entirely. We may look into
having this option work on a per-statement
level at some point.
.. change::
:tags: sql
:tickets:
Restored the "catchall" constructor on the base
TypeEngine class, with a deprecation warning.
This so that code which does something like
Integer(11) still succeeds.
.. change::
:tags: sql
:tickets: 2104
Fixed regression whereby MetaData() coming
back from unpickling did not keep track of
new things it keeps track of now, i.e.
collection of Sequence objects, list
of schema names.
.. change::
:tags: sql
:tickets: 2116
The limit/offset keywords to select() as well
as the value passed to select.limit()/offset()
will be coerced to integer.
(also in 0.6.7)
.. change::
:tags: sql
:tickets:
fixed bug where "from" clause gathering from an
over() clause would be an itertools.chain() and
not a list, causing "can only concatenate list"
TypeError when combined with other clauses.
.. change::
:tags: sql
:tickets: 2134
Fixed incorrect usage of "," in over() clause
being placed between the "partition" and "order by"
clauses.
.. change::
:tags: sql
:tickets: 2105
Before/after attach events for PrimaryKeyConstraint
now function, tests added for before/after events
on all constraint types.
.. change::
:tags: sql
:tickets: 2117
Added explicit true()/false() constructs to expression
lib - coercion rules will intercept "False"/"True"
into these constructs. In 0.6, the constructs were
typically converted straight to string, which was
no longer accepted in 0.7.
.. change::
:tags: engine
:tickets: 2129
The C extension is now enabled by default on CPython
2.x with a fallback to pure python if it fails to
compile.
.. change::
:tags: schema
:tickets: 2109
The 'useexisting' flag on Table has been superseded
by a new pair of flags 'keep_existing' and
'extend_existing'. 'extend_existing' is equivalent
to 'useexisting' - the existing Table is returned,
and additional constructor elements are added.
With 'keep_existing', the existing Table is returned,
but additional constructor elements are not added -
these elements are only applied when the Table
is newly created.
.. change::
:tags: types
:tickets: 2081
REAL has been added to the core types. Supported
by PostgreSQL, SQL Server, MySQL, SQLite. Note
that the SQL Server and MySQL versions, which
add extra arguments, are also still available
from those dialects.
.. change::
:tags: types
:tickets: 2106
Added event.listens_for() decorator, given
target + event name, applies the decorated
function as a listener.
.. change::
:tags: pool
:tickets: 2103
AssertionPool now stores the traceback indicating
where the currently checked out connection was
acquired; this traceback is reported within
the assertion raised upon a second concurrent
checkout; courtesy Gunnlaugur Briem
.. change::
:tags: pool
:tickets:
The "pool.manage" feature doesn't use pickle
anymore to hash the arguments for each pool.
.. change::
:tags: sqlite
:tickets: 2115
Fixed bug where reflection of foreign key
created as "REFERENCES <tablename>" without
col name would fail.
(also in 0.6.7)
.. change::
:tags: postgresql
:tickets:
Psycopg2 for Python 3 is now supported.
.. change::
:tags: postgresql
:tickets: 2132
Fixed support for precision numerics when using
pg8000.
.. change::
:tags: oracle
:tickets: 2100
Using column names that would require quotes
for the column itself or for a name-generated
bind parameter, such as names with special
characters, underscores, non-ascii characters,
now properly translate bind parameter keys when
talking to cx_oracle. (Also
in 0.6.7)
.. change::
:tags: oracle
:tickets: 2116
Oracle dialect adds use_binds_for_limits=False
create_engine() flag, will render the LIMIT/OFFSET
values inline instead of as binds, reported to
modify the execution plan used by Oracle. (Also in 0.6.7)
.. change::
:tags: documentation
:tickets: 2029
Documented SQLite DATE/TIME/DATETIME types. (also in 0.6.7)
.. change::
:tags: documentation
:tickets: 2118
Fixed mutable extension docs to show the
correct type-association methods.
.. changelog::
:version: 0.7.0b3
:released: Sun Mar 20 2011
.. change::
:tags: general
:tickets:
Lots of fixes to unit tests when run under PyPy
(courtesy Alex Gaynor).
.. change::
:tags: orm
:tickets: 2093
Changed the underlying approach to query.count().
query.count() is now in all cases exactly:
query.
from_self(func.count(literal_column('1'))).
scalar()
That is, "select count(1) from (<full query>)".
This produces a subquery in all cases, but
vastly simplifies all the guessing count()
tried to do previously, which would still
fail in many scenarios particularly when
joined table inheritance and other joins
were involved. If the subquery produced
for an otherwise very simple count is really
an issue, use query(func.count()) as an
optimization.
.. change::
:tags: orm
:tickets: 2087
some changes to the identity map regarding
rare weakref callbacks during iterations.
The mutex has been removed as it apparently
can cause a reentrant (i.e. in one thread) deadlock,
perhaps when gc collects objects at the point of
iteration in order to gain more memory. It is hoped
that "dictionary changed during iteration" will
be exceedingly rare as iteration methods internally
acquire the full list of objects in a single values()
call. Note 0.6.7 has a more conservative fix here
which still keeps the mutex in place.
.. change::
:tags: orm
:tickets: 2082
A tweak to the unit of work causes it to order
the flush along relationship() dependencies even if
the given objects don't have any inter-attribute
references in memory, which was the behavior in
0.5 and earlier, so a flush of Parent/Child with
only foreign key/primary key set will succeed.
This while still maintaining 0.6 and above's not
generating a ton of useless internal dependency
structures within the flush that don't correspond
to state actually within the current flush.
.. change::
:tags: orm
:tickets: 2069
Improvements to the error messages emitted when
querying against column-only entities in conjunction
with (typically incorrectly) using loader options,
where the parent entity is not fully present.
.. change::
:tags: orm
:tickets: 2098
Fixed bug in query.options() whereby a path
applied to a lazyload using string keys could
overlap a same named attribute on the wrong
entity. Note 0.6.7 has a more conservative fix
to this.
.. change::
:tags: declarative
:tickets: 2091
Arguments in __mapper_args__ that aren't "hashable"
aren't mistaken for always-hashable, possibly-column
arguments. (also in 0.6.7)
.. change::
:tags: sql
:tickets:
Added a fully descriptive error message for the
case where Column is subclassed and _make_proxy()
fails to make a copy due to TypeError on the
constructor. The method _constructor should
be implemented in this case.
.. change::
:tags: sql
:tickets: 2095
Added new event "column_reflect" for Table objects.
Receives the info dictionary about a Column before
the object is generated within reflection, and allows
modification to the dictionary for control over
most aspects of the resulting Column including
key, name, type, info dictionary.
.. change::
:tags: sql
:tickets:
To help with the "column_reflect" event being used
with specific Table objects instead of all instances
of Table, listeners can be added to a Table object
inline with its construction using a new argument
"listeners", a list of tuples of the form
(<eventname>, <fn>), which are applied to the Table
before the reflection process begins.
.. change::
:tags: sql
:tickets: 2085
Added new generic function "next_value()", accepts
a Sequence object as its argument and renders the
appropriate "next value" generation string on the
target platform, if supported. Also provides
".next_value()" method on Sequence itself.
.. change::
:tags: sql
:tickets: 2084
func.next_value() or other SQL expression can
be embedded directly into an insert() construct,
and if implicit or explicit "returning" is used
in conjunction with a primary key column,
the newly generated value will be present in
result.inserted_primary_key.
.. change::
:tags: sql
:tickets: 2089
Added accessors to ResultProxy "returns_rows",
"is_insert" (also in 0.6.7)
.. change::
:tags: engine
:tickets: 2097
Fixed AssertionPool regression bug.
.. change::
:tags: engine
:tickets: 2060
Changed exception raised to ArgumentError when an
invalid dialect is specified.
.. change::
:tags: postgresql
:tickets: 2092
Added RESERVED_WORDS for postgresql dialect.
(also in 0.6.7)
.. change::
:tags: postgresql
:tickets: 2073
Fixed the BIT type to allow a "length" parameter, "varying"
parameter. Reflection also fixed.
(also in 0.6.7)
.. change::
:tags: mssql
:tickets: 2071
Rewrote the query used to get the definition of a view,
typically when using the Inspector interface, to
use sys.sql_modules instead of the information schema,
thereby allowing views definitions longer than 4000
characters to be fully returned.
(also in 0.6.7)
.. change::
:tags: firebird
:tickets: 2083
The "implicit_returning" flag on create_engine() is
honored if set to False. (also in 0.6.7)
.. change::
:tags: informix
:tickets: 2092
Added RESERVED_WORDS informix dialect.
(also in 0.6.7)
.. change::
:tags: ext
:tickets: 2090
The horizontal_shard ShardedSession class accepts the common
Session argument "query_cls" as a constructor argument,
to enable further subclassing of ShardedQuery. (also in 0.6.7)
.. change::
:tags: examples
:tickets:
Updated the association, association proxy examples
to use declarative, added a new example
dict_of_sets_with_default.py, a "pushing the envelope"
example of association proxy.
.. change::
:tags: examples
:tickets: 2090
The Beaker caching example allows a "query_cls" argument
to the query_callable() function.
(also in 0.6.7)
.. changelog::
:version: 0.7.0b2
:released: Sat Feb 19 2011
.. change::
:tags: orm
:tickets: 2053
Fixed bug whereby Session.merge() would call the
load() event with one too few arguments.
.. change::
:tags: orm
:tickets: 2052
Added logic which prevents the generation of
events from a MapperExtension or SessionExtension
from generating do-nothing events for all the methods
not overridden.
.. change::
:tags: declarative
:tickets: 2058
Fixed regression whereby composite() with
Column objects placed inline would fail
to initialize. The Column objects can now
be inline with the composite() or external
and pulled in via name or object ref.
.. change::
:tags: declarative
:tickets: 2061
Fix error message referencing old classproperty
name to reference declared_attr
(also in 0.6.7)
.. change::
:tags: declarative
:tickets: 1468
the dictionary at the end of the __table_args__
tuple is now optional.
.. change::
:tags: sql
:tickets: 2059
Renamed the EngineEvents event class to
ConnectionEvents. As these classes are never
accessed directly by end-user code, this strictly
is a documentation change for end users. Also
simplified how events get linked to engines
and connections internally.
.. change::
:tags: sql
:tickets: 2055
The Sequence() construct, when passed a MetaData()
object via its 'metadata' argument, will be
included in CREATE/DROP statements within
metadata.create_all() and metadata.drop_all(),
including "checkfirst" logic.
.. change::
:tags: sql
:tickets: 2064
The Column.references() method now returns True
if it has a foreign key referencing the
given column exactly, not just its parent
table.
.. change::
:tags: postgresql
:tickets: 2065
Fixed regression from 0.6 where SMALLINT and
BIGINT types would both generate SERIAL
on an integer PK column, instead of
SMALLINT and BIGSERIAL
.. change::
:tags: ext
:tickets: 2054
Association proxy now has correct behavior for
any(), has(), and contains() when proxying
a many-to-one scalar attribute to a one-to-many
collection (i.e. the reverse of the 'typical'
association proxy use case)
.. change::
:tags: examples
:tickets:
Beaker example now takes into account 'limit'
and 'offset', bind params within embedded
FROM clauses (like when you use union() or
from_self()) when generating a cache key.
.. changelog::
:version: 0.7.0b1
:released: Sat Feb 12 2011
.. change::
:tags:
:tickets:
Detailed descriptions of each change below are
described at:
https://docs.sqlalchemy.org/en/latest/changelog/migration_07.html
.. change::
:tags: general
:tickets: 1902
New event system, supersedes all extensions, listeners,
etc.
.. change::
:tags: general
:tickets: 1926
Logging enhancements
.. change::
:tags: general
:tickets: 1949
Setup no longer installs a Nose plugin
.. change::
:tags: general
:tickets:
The "sqlalchemy.exceptions" alias in sys.modules
has been removed. Base SQLA exceptions are
available via "from sqlalchemy import exc".
The "exceptions" alias for "exc" remains in
"sqlalchemy" for now, it's just not patched into
sys.modules.
.. change::
:tags: orm
:tickets: 1923
More succinct form of query.join(target, onclause)
.. change::
:tags: orm
:tickets: 1903
Hybrid Attributes, implements/supersedes synonym()
.. change::
:tags: orm
:tickets: 2008
Rewrite of composites
.. change::
:tags: orm
:tickets:
Mutation Event Extension, supersedes "mutable=True"
.. seealso::
:ref:`07_migration_mutation_extension`
.. change::
:tags: orm
:tickets: 1980
PickleType and ARRAY mutability turned off by default
.. change::
:tags: orm
:tickets: 1895
Simplified polymorphic_on assignment
.. change::
:tags: orm
:tickets: 1912
Flushing of Orphans that have no parent is allowed
.. change::
:tags: orm
:tickets: 2041
Adjusted flush accounting step to occur before
the commit in the case of autocommit=True. This allows
autocommit=True to work appropriately with
expire_on_commit=True, and also allows post-flush session
hooks to operate in the same transactional context
as when autocommit=False.
.. change::
:tags: orm
:tickets: 1973
Warnings generated when collection members, scalar referents
not part of the flush
.. change::
:tags: orm
:tickets: 1876
Non-`Table`-derived constructs can be mapped
.. change::
:tags: orm
:tickets: 1942
Tuple label names in Query Improved
.. change::
:tags: orm
:tickets: 1892
Mapped column attributes reference the most specific
column first
.. change::
:tags: orm
:tickets: 1896
Mapping to joins with two or more same-named columns
requires explicit declaration
.. change::
:tags: orm
:tickets: 1875
Mapper requires that polymorphic_on column be present
in the mapped selectable
.. change::
:tags: orm
:tickets: 1966
compile_mappers() renamed configure_mappers(), simplified
configuration internals
.. change::
:tags: orm
:tickets: 2018
the aliased() function, if passed a SQL FromClause element
(i.e. not a mapped class), will return element.alias()
instead of raising an error on AliasedClass.
.. change::
:tags: orm
:tickets: 2027
Session.merge() will check the version id of the incoming
state against that of the database, assuming the mapping
uses version ids and incoming state has a version_id
assigned, and raise StaleDataError if they don't
match.
.. change::
:tags: orm
:tickets: 1996
Session.connection(), Session.execute() accept 'bind',
to allow execute/connection operations to participate
in the open transaction of an engine explicitly.
.. change::
:tags: orm
:tickets:
Query.join(), Query.outerjoin(), eagerload(),
eagerload_all(), others no longer allow lists
of attributes as arguments (i.e. option([x, y, z])
form, deprecated since 0.5)
.. change::
:tags: orm
:tickets:
ScopedSession.mapper is removed (deprecated since 0.5).
.. change::
:tags: orm
:tickets: 2031
Horizontal shard query places 'shard_id' in
context.attributes where it's accessible by the
"load()" event.
.. change::
:tags: orm
:tickets: 2032
A single contains_eager() call across
multiple entities will indicate all collections
along that path should load, instead of requiring
distinct contains_eager() calls for each endpoint
(which was never correctly documented).
.. change::
:tags: orm
:tickets:
The "name" field used in orm.aliased() now renders
in the resulting SQL statement.
.. change::
:tags: orm
:tickets: 1473
Session weak_instance_dict=False is deprecated.
.. change::
:tags: orm
:tickets: 2046
An exception is raised in the unusual case that an
append or similar event on a collection occurs after
the parent object has been dereferenced, which
prevents the parent from being marked as "dirty"
in the session. Was a warning in 0.6.6.
.. change::
:tags: orm
:tickets: 1069
Query.distinct() now accepts column expressions
as \*args, interpreted by the PostgreSQL dialect
as DISTINCT ON (<expr>).
.. change::
:tags: orm
:tickets: 2049
Additional tuning to "many-to-one" relationship
loads during a flush(). A change in version 0.6.6
([ticket:2002]) required that more "unnecessary" m2o
loads during a flush could occur. Extra loading modes have
been added so that the SQL emitted in this
specific use case is trimmed back, while still
retrieving the information the flush needs in order
to not miss anything.
.. change::
:tags: orm
:tickets:
the value of "passive" as passed to
attributes.get_history() should be one of the
constants defined in the attributes package. Sending
True or False is deprecated.
.. change::
:tags: orm
:tickets: 2030
Added a `name` argument to `Query.subquery()`, to allow
a fixed name to be assigned to the alias object. (also in 0.6.7)
.. change::
:tags: orm
:tickets: 2019
A warning is emitted when a joined-table inheriting mapper
has no primary keys on the locally mapped table
(but has pks on the superclass table).
(also in 0.6.7)
.. change::
:tags: orm
:tickets: 2038
Fixed bug where "middle" class in a polymorphic hierarchy
would have no 'polymorphic_on' column if it didn't also
specify a 'polymorphic_identity', leading to strange
errors upon refresh, wrong class loaded when querying
from that target. Also emits the correct WHERE criterion
when using single table inheritance.
(also in 0.6.7)
.. change::
:tags: orm
:tickets: 1995
Fixed bug where a column with a SQL or server side default
that was excluded from a mapping with include_properties
or exclude_properties would result in UnmappedColumnError. (also in 0.6.7)
.. change::
:tags: orm
:tickets: 2046
A warning is emitted in the unusual case that an
append or similar event on a collection occurs after
the parent object has been dereferenced, which
prevents the parent from being marked as "dirty"
in the session. This will be an exception in 0.7. (also in 0.6.7)
.. change::
:tags: declarative
:tickets: 2050
Added an explicit check for the case that the name
'metadata' is used for a column attribute on a
declarative class. (also in 0.6.7)
.. change::
:tags: sql
:tickets: 1844
Added over() function, method to FunctionElement
classes, produces the _Over() construct which
in turn generates "window functions", i.e.
"<window function> OVER (PARTITION BY <partition by>,
ORDER BY <order by>)".
.. change::
:tags: sql
:tickets: 805
LIMIT/OFFSET clauses now use bind parameters
.. change::
:tags: sql
:tickets: 1069
select.distinct() now accepts column expressions
as \*args, interpreted by the PostgreSQL dialect
as DISTINCT ON (<expr>). Note this was already
available via passing a list to the `distinct`
keyword argument to select().
.. change::
:tags: sql
:tickets:
select.prefix_with() accepts multiple expressions
(i.e. \*expr), 'prefix' keyword argument to select()
accepts a list or tuple.
.. change::
:tags: sql
:tickets:
Passing a string to the `distinct` keyword argument
of `select()` for the purpose of emitting special
MySQL keywords (DISTINCTROW etc.) is deprecated -
use `prefix_with()` for this.
.. change::
:tags: sql
:tickets: 2006, 2005
TypeDecorator works with primary key columns
.. change::
:tags: sql
:tickets: 1897
DDL() constructs now escape percent signs
.. change::
:tags: sql
:tickets: 1917, 1893
Table.c / MetaData.tables refined a bit, don't allow direct
mutation
.. change::
:tags: sql
:tickets: 1950
Callables passed to `bindparam()` don't get evaluated
.. change::
:tags: sql
:tickets: 1870
types.type_map is now private, types._type_map
.. change::
:tags: sql
:tickets: 1982
Non-public Pool methods underscored
.. change::
:tags: sql
:tickets: 723
Added NULLS FIRST and NULLS LAST support. It's implemented
as an extension to the asc() and desc() operators, called
nullsfirst() and nullslast().
.. change::
:tags: sql
:tickets:
The Index() construct can be created inline with a Table
definition, using strings as column names, as an alternative
to the creation of the index outside of the Table.
.. change::
:tags: sql
:tickets: 2001
execution_options() on Connection accepts
"isolation_level" argument, sets transaction isolation
level for that connection only until returned to the
connection pool, for those backends which support it
(SQLite, PostgreSQL)
.. change::
:tags: sql
:tickets: 2005
A TypeDecorator of Integer can be used with a primary key
column, and the "autoincrement" feature of various dialects
as well as the "sqlite_autoincrement" flag will honor
the underlying database type as being Integer-based.
.. change::
:tags: sql
:tickets: 2020, 2021
Established consistency when server_default is present
on an Integer PK column. SQLA doesn't pre-fetch these,
nor do they come back in cursor.lastrowid (DBAPI).
Ensured all backends consistently return None
in result.inserted_primary_key for these. Regarding
reflection for this case, reflection of an int PK col
with a server_default sets the "autoincrement" flag to False,
except in the case of a PG SERIAL col where we detected a
sequence default.
.. change::
:tags: sql
:tickets: 2006
Result-row processors are applied to pre-executed SQL
defaults, as well as cursor.lastrowid, when determining
the contents of result.inserted_primary_key.
.. change::
:tags: sql
:tickets:
Bind parameters present in the "columns clause" of a select
are now auto-labeled like other "anonymous" clauses,
which among other things allows their "type" to be meaningful
when the row is fetched, as in result row processors.
.. change::
:tags: sql
:tickets:
TypeDecorator is present in the "sqlalchemy" import space.
.. change::
:tags: sql
:tickets: 2015
Non-DBAPI errors which occur in the scope of an `execute()`
call are now wrapped in sqlalchemy.exc.StatementError,
and the text of the SQL statement and repr() of params
is included. This makes it easier to identify statement
executions which fail before the DBAPI becomes
involved.
.. change::
:tags: sql
:tickets: 2048
The concept of associating a ".bind" directly with a
ClauseElement has been explicitly moved to Executable,
i.e. the mixin that describes ClauseElements which represent
engine-executable constructs. This change is an improvement
to internal organization and is unlikely to affect any
real-world usage.
.. change::
:tags: sql
:tickets: 2028
Column.copy(), as used in table.tometadata(), copies the
'doc' attribute. (also in 0.6.7)
.. change::
:tags: sql
:tickets: 2023
Added some defs to the resultproxy.c extension so that
the extension compiles and runs on Python 2.4. (also in 0.6.7)
.. change::
:tags: sql
:tickets: 2042
The compiler extension now supports overriding the default
compilation of expression._BindParamClause including that
the auto-generated binds within the VALUES/SET clause
of an insert()/update() statement will also use the new
compilation rules. (also in 0.6.7)
.. change::
:tags: sql
:tickets: 1921
SQLite dialect now uses `NullPool` for file-based databases
.. change::
:tags: sql
:tickets: 2036
The path given as the location of a sqlite database is now
normalized via os.path.abspath(), so that directory changes
within the process don't affect the ultimate location
of a relative file path.
.. change::
:tags: postgresql
:tickets: 1083
When explicit sequence execution derives the name
of the auto-generated sequence of a SERIAL column,
which currently only occurs if implicit_returning=False,
now accommodates if the table + column name is greater
than 63 characters using the same logic PostgreSQL uses. (also in 0.6.7)
.. change::
:tags: postgresql
:tickets: 2044
Added an additional libpq message to the list of "disconnect"
exceptions, "could not receive data from server" (also in 0.6.7)
.. change::
:tags: mssql
:tickets: 1833
the String/Unicode types, and their counterparts VARCHAR/
NVARCHAR, emit "max" as the length when no length is
specified, so that the default length, normally '1'
as per SQL server documentation, is instead
'unbounded'. This also occurs for the VARBINARY type..
This behavior makes these types more closely compatible
with PostgreSQL's VARCHAR type which is similarly unbounded
when no length is specified.
.. change::
:tags: mysql
:tickets: 1991
New DBAPI support for pymysql, a pure Python port
of MySQL-python.
.. change::
:tags: mysql
:tickets: 2047
oursql dialect accepts the same "ssl" arguments in
create_engine() as that of MySQLdb.
(also in 0.6.7)
.. change::
:tags: firebird
:tickets: 1885
Some adjustments so that Interbase is supported as well.
FB/Interbase version idents are parsed into a structure
such as (8, 1, 1, 'interbase') or (2, 1, 588, 'firebird')
so they can be distinguished.
=============
0.8 Changelog
=============
.. changelog_imports::
.. include:: changelog_07.rst
:start-line: 5
.. changelog::