SQLAlchemy 1.1 Documentation
Changes and Migration
- What’s New in SQLAlchemy 1.1?
- 1.1 Changelog¶
- 1.0 Changelog
- 0.9 Changelog
- 0.8 Changelog
- 0.7 Changelog
- 0.6 Changelog
- 0.5 Changelog
- 0.4 Changelog
- 0.3 Changelog
- 0.2 Changelog
- 0.1 Changelog
- What’s New in SQLAlchemy 1.0?
- What’s New in SQLAlchemy 0.9?
- What’s New in SQLAlchemy 0.8?
- What’s New in SQLAlchemy 0.7?
- What’s New in SQLAlchemy 0.6?
- What’s new in SQLAlchemy 0.5?
- What’s new in SQLAlchemy 0.4?
Project Versions
1.1 Changelog¶
1.1.0b1¶
no release dateorm¶
[orm] [feature] Added new parameter
¶orm.mapper.passive_deletes
to available mapper options. This allows a DELETE to proceed for a joined-table inheritance mapping against the base table only, while allowing for ON DELETE CASCADE to handle deleting the row from the subclass tables.References: #2349
[orm] [feature] Calling str() on a core SQL construct has been made more “friendly”, when the construct contains non-standard SQL elements such as RETURNING, array index operations, or dialect-specific or custom datatypes. A string is now returned in these cases rendering an approximation of the construct (typically the Postgresql-style version of it) rather than raising an error.
¶References: #3631
[orm] [feature] The
¶str()
call forQuery
will now take into account theEngine
to which theSession
is bound, when generating the string form of the SQL, so that the actual SQL that would be emitted to the database is shown, if possible. Previously, only the engine associated with theMetaData
to which the mappings are associated would be used, if present. If no bind can be located either on theSession
or on theMetaData
to which the mappings are associated, then the “default” dialect is used to render the SQL, as was the case previously.References: #3081
[orm] [feature] The
¶SessionEvents
suite now includes events to allow unambiguous tracking of all object lifecycle state transitions in terms of theSession
itself, e.g. pending, transient, persistent, detached. The state of the object within each event is also defined.References: #2677
[orm] [feature] Added a new session lifecycle state deleted. This new state represents an object that has been deleted from the persistent state and will move to the detached state once the transaction is committed. This resolves the long-standing issue that objects which were deleted existed in a gray area between persistent and detached. The
¶InstanceState.persistent
accessor will no longer report on a deleted object as persistent; theInstanceState.deleted
accessor will instead be True for these objects, until they become detached.References: #2677
[orm] [feature] Added new checks for the common error case of passing mapped classes or mapped instances into contexts where they are interpreted as SQL bound parameters; a new exception is raised for this.
¶References: #3321
[orm] [bug] Fixed bug where deferred columns would inadvertently be set up for database load on the next object-wide unexpire, when the object were merged into the session with
session.merge(obj, load=False)
.¶References: #3488
[orm] [bug] [mysql] Further continuing on the common MySQL exception case of a savepoint being cancelled first covered in #2696, the failure mode in which the
¶Session
is placed when a SAVEPOINT vanishes before rollback has been improved to allow theSession
to still function outside of that savepoint. It is assumed that the savepoint operation failed and was cancelled.References: #3680
[orm] [bug] Fixed bug where a newly inserted instance that is rolled back would still potentially cause persistence conflicts on the next transaction, because the instance would not be checked that it was expired. This fix will resolve a large class of cases that erronously cause the “New instance with identity X conflicts with persistent instance Y” error.
¶References: #3677
[orm] [bug] An improvement to the workings of
¶Query.correlate()
such that when a “polymorphic” entity is used which represents a straight join of several tables, the statement will ensure that all the tables within the join are part of what’s correlating.References: #3662
[orm] [bug] Fixed bug which would cause an eagerly loaded many-to-one attribute to not be loaded, if the joined eager load were from a row where the same entity were present multiple times, some calling for the attribute to be eagerly loaded and others not. The logic here is revised to take in the attribute even though a different loader path has handled the parent entity already.
¶References: #3431
[orm] [bug] A refinement to the logic which adds columns to the resulting SQL when
¶Query.distinct()
is combined withQuery.order_by()
such that columns which are already present will not be added a second time, even if they are labeled with a different name. Regardless of this change, the extra columns added to the SQL have never been returned in the final result, so this change only impacts the string form of the statement as well as its behavior when used in a Core execution context. Additionally, columns are no longer added when the DISTINCT ON format is used, provided the query is not wrapped inside a subquery due to joined eager loading.References: #3641
[orm] [bug] Fixed issue where two same-named relationships that refer to a base class and a concrete-inherited subclass would raise an error if those relationships were set up using “backref”, while setting up the identical configuration using relationship() instead with the conflicting names would succeed, as is allowed in the case of a concrete mapping.
¶References: #3630
[orm] [bug] The
¶Session.merge()
method now tracks pending objects by primary key before emitting an INSERT, and merges distinct objects with duplicate primary keys together as they are encountered, which is essentially semi-deterministic at best. This behavior matches what happens already with persistent objects.References: #3601
[orm] [bug] Fixed bug where the “single table inheritance” criteria would be added onto the end of a query in some inappropriate situations, such as when querying from an exists() of a single-inheritance subclass.
¶References: #3582
[orm] [bug] Added a new type-level modifier
¶TypeEngine.evaluates_none()
which indicates to the ORM that a positive set of None should be persisted as the value NULL, instead of omitting the column from the INSERT statement. This feature is used both as part of the implementation for #3514 as well as a standalone feature available on any type.References: #3250
[orm] [bug] Internal calls to “bookkeeping” functions within
Session.bulk_save_objects()
and related bulk methods have been scaled back to the extent that this functionality is not currently used, e.g. checks for column default values to be fetched after an INSERT or UPDATE statement.¶References: #3526
[orm] [bug] [postgresql] Additional fixes have been made regarding the value of
None
in conjunction with the Postgresqlpostgresql.JSON
type. When theJSON.none_as_null
flag is left at its default value ofFalse
, the ORM will now correctly insert the Json “‘null’” string into the column whenever the value on the ORM object is set to the valueNone
or when the valueNone
is used withSession.bulk_insert_mappings()
, including if the column has a default or server default on it.더 보기
JSON “null” is inserted as expected with ORM operations, regardless of column default present
New options allowing explicit persistence of NULL over a default
References: #3514
[orm] [change] The
¶Session.weak_identity_map
parameter is deprecated. See the new recipe at Session Referencing Behavior for an event-based approach to maintaining strong identity map behavior.References: #2677
engine¶
[engine] [feature] Added connection pool events
ConnectionEvents.close()
,ConnectionEvents.detach()
,ConnectionEvents.close_detached()
.¶[engine] [feature] All string formatting of bound parameter sets and result rows for logging, exception, and
¶repr()
purposes now truncate very large scalar values within each collection, including an “N characters truncated” notation, similar to how the display for large multiple-parameter sets are themselves truncated.References: #2837
[engine] [feature] Multi-tenancy schema translation for
¶Table
objects is added. This supports the use case of an application that uses the same set ofTable
objects in many schemas, such as schema-per-user. A new execution optionConnection.execution_options.schema_translate_map
is added.References: #2685
[engine] [feature] Added a new entrypoint system to the engine to allow “plugins” to be stated in the query string for a URL. Custom plugins can be written which will be given the chance up front to alter and/or consume the engine’s URL and keyword arguments, and then at engine create time will be given the engine itself to allow additional modifications or event registration. Plugins are written as a subclass of
CreateEnginePlugin
; see that class for details.¶References: #3536
sql¶
[sql] [feature] Negative integer indexes are now accommodated by rows returned from a
¶ResultProxy
. Pull request courtesy Emanuele Gaifas.References: pull request github:231
[sql] [feature] Added
¶Select.lateral()
and related constructs to allow for the SQL standard LATERAL keyword, currently only supported by Postgresql.References: #2857
[sql] [feature] Added support for rendering “FULL OUTER JOIN” to both Core and ORM. Pull request courtesy Stefan Urbanek.
¶References: #1957, pull request github:209
[sql] [feature] CTE functionality has been expanded to support all DML, allowing INSERT, UPDATE, and DELETE statements to both specify their own WITH clause, as well as for these statements themselves to be CTE expressions when they include a RETURNING clause.
¶References: #2551
[sql] [feature] Added support for PEP-435-style enumerated classes, namely Python 3’s
¶enum.Enum
class but also including compatible enumeration libraries, to thetypes.Enum
datatype. Thetypes.Enum
datatype now also performs in-Python validation of incoming values, and adds an option to forego creating the CHECK constraintEnum.create_constraint
. Pull request courtesy Alex Grönholm.[sql] [feature] A deep improvement to the recently added
TextClause.columns()
method, and its interaction with result-row processing, now allows the columns passed to the method to be positionally matched with the result columns in the statement, rather than matching on name alone. The advantage to this includes that when linking a textual SQL statement to an ORM or Core table model, no system of labeling or de-duping of common column names needs to occur, which also means there’s no need to worry about how label names match to ORM columns and so-forth. In addition, theResultProxy
has been further enhanced to map column and string keys to a row with greater precision in some cases.더 보기
ResultSet column matching enhancements; positional column setup for textual SQL - feature overview
TextClause.columns() will match columns positionally, not by name, when passed positionally - backwards compatibility remarks
References: #3501
[sql] [feature] Added a new type to core
¶types.JSON
. This is the base of the PostgreSQLpostgresql.JSON
type as well as that of the newmysql.JSON
type, so that a PG/MySQL-agnostic JSON column may be used. The type features basic index and path searching support.References: #3619
[sql] [feature] Added support for “set-aggregate” functions of the form
¶<function> WITHIN GROUP (ORDER BY <criteria>)
, using the methodFunctionElement.within_group()
. A series of common set-aggregate functions with return types derived from the set have been added. This includes functions likepercentile_cont
,dense_rank
and others.References: #1370
[sql] [feature] [postgresql] Added support for the SQL-standard function
¶array_agg
, which automatically returns anpostgresql.ARRAY
of the correct type and supports index / slice operations, as well aspostgresql.array_agg()
, which returns apostgresql.ARRAY
with additional comparison features. As arrays are only supported on Postgresql at the moment, only actually works on Postgresql. Also added a new constructpostgresql.aggregate_order_by
in support of PG’s “ORDER BY” extension.References: #3132
[sql] [feature] Added a new type to core
¶types.ARRAY
. This is the base of the PostgreSQLpostgresql.ARRAY
type, and is now part of Core to begin supporting various SQL-standard array-supporting features including some functions and eventual support for native arrays on other databases that have an “array” concept, such as DB2 or Oracle. Additionally, new operatorsexpression.any_()
andexpression.all_()
have been added. These support not just array constructs on Postgresql, but also subqueries that are usable on MySQL (but sadly not on Postgresql).References: #3516
[sql] [bug] Fixed an assertion that would raise somewhat inappropriately if a
Index
were associated with aColumn
that is associated with a lower-case-tTableClause
; the association should be ignored for the purposes of associating the index with aTable
.¶References: #3616
[sql] [bug] The
¶type_coerce()
construct is now a fully fledged Core expression element which is late-evaluated at compile time. Previously, the function was only a conversion function which would handle different expression inputs by returning either aLabel
of a column-oriented expression or a copy of a givenBindParameter
object, which in particular prevented the operation from being logically maintained when an ORM-level expression transformation would convert a column to a bound parameter (e.g. for lazy loading).References: #3531
[sql] [bug] The
¶TypeDecorator
type extender will now work in conjunction with aSchemaType
implementation, typicallyEnum
orBoolean
with regards to ensuring that the per-table events are propagated from the implementation type to the outer type. These events are used to ensure that the constraints or Postgresql types (e.g. ENUM) are correctly created (and possibly dropped) along with the parent table.References: #2919
[sql] [bug] The behavior of the
union()
construct and related constructs such asQuery.union()
now handle the case where the embedded SELECT statements need to be parenthesized due to the fact that they include LIMIT, OFFSET and/or ORDER BY. These queries do not work on SQLite, and will fail on that backend as they did before, but should now work on all other backends.더 보기
A UNION or similar of SELECTs with LIMIT/OFFSET/ORDER BY now parenthesizes the embedded selects
References: #2528
[sql] [mysql] [change] The system by which a
Column
considers itself to be an “auto increment” column has been changed, such that autoincrement is no longer implicitly enabled for aTable
that has a composite primary key. In order to accommodate being able to enable autoincrement for a composite PK member column while at the same time maintaining SQLAlchemy’s long standing behavior of enabling implicit autoincrement for a single integer primary key, a third state has been added to theColumn.autoincrement
parameter"auto"
, which is now the default.더 보기
The .autoincrement directive is no longer implicitly enabled for a composite primary key column
No more generation of an implicit KEY for composite primary key w/ AUTO_INCREMENT
References: #3216
schema¶
[schema] [enhancement] The default generation functions passed to
Column
objects are now run through “update_wrapper”, or an equivalent function if a callable non-function is passed, so that introspection tools preserve the name and docstring of the wrapped function. Pull request courtesy hsum.¶References: pull request github:204
postgresql¶
[postgresql] [feature] Added a new constant
¶postgresql.JSON.NULL
, indicating that the JSON NULL value should be used for a value regardless of other settings.References: #3514
[postgresql] [bug] Added support for reflecting the source of materialized views to the Postgresql version of the
Inspector.get_view_definition()
method.¶References: #3587
[postgresql] [bug] The use of a
¶postgresql.ARRAY
object that refers to atypes.Enum
orpostgresql.ENUM
subtype will now emit the expected “CREATE TYPE” and “DROP TYPE” DDL when the type is used within a “CREATE TABLE” or “DROP TABLE”.References: #2729
[postgresql] [bug] The “hashable” flag on special datatypes such as
¶postgresql.ARRAY
,postgresql.JSON
andpostgresql.HSTORE
is now set to False, which allows these types to be fetchable in ORM queries that include entities within the row.References: #3499
[postgresql] [bug] The Postgresql
¶postgresql.ARRAY
type now supports multidimensional indexed access, e.g. expressions such assomecol[5][6]
without any need for explicit casts or type coercions, provided that thepostgresql.ARRAY.dimensions
parameter is set to the desired number of dimensions.References: #3487
[postgresql] [bug] The return type for the
¶postgresql.JSON
andpostgresql.JSONB
when using indexed access has been fixed to work like Postgresql itself, and returns an expression that itself is of typepostgresql.JSON
orpostgresql.JSONB
. Previously, the accessor would returnNullType
which disallowed subsequent JSON-like operators to be used.References: #3503
[postgresql] [bug] The
¶postgresql.JSON
,postgresql.JSONB
andpostgresql.HSTORE
datatypes now allow full control over the return type from an indexed textual access operation, eithercolumn[someindex].astext
for a JSON type orcolumn[someindex]
for an HSTORE type, via thepostgresql.JSON.astext_type
andpostgresql.HSTORE.text_type
parameters.References: #3503
[postgresql] [bug] The
¶postgresql.JSON.Comparator.astext
modifier no longer calls uponColumnElement.cast()
implicitly, as PG’s JSON/JSONB types allow cross-casting between each other as well. Code that makes use ofColumnElement.cast()
on JSON indexed access, e.g.col[someindex].cast(Integer)
, will need to be changed to callpostgresql.JSON.Comparator.astext
explicitly.References: #3503
[postgresql] [change] The
sqlalchemy.dialects.postgres
module, long deprecated, is removed; this has emitted a warning for many years and projects should be calling uponsqlalchemy.dialects.postgresql
. Engine URLs of the formpostgres://
will still continue to function, however.¶
mysql¶
[mysql] [feature] Added support for “autocommit” on MySQL drivers, via the AUTOCOMMIT isolation level setting. Pull request courtesy Roman Podoliaka.
¶References: #3332
[mysql] [feature] Added
mysql.JSON
for MySQL 5.7. The JSON type provides persistence of JSON values in MySQL as well as basic operator support of “getitem” and “getpath”, making use of theJSON_EXTRACT
function in order to refer to individual paths in a JSON structure.더 보기
References: #3547
[mysql] [change] The MySQL dialect no longer generates an extra “KEY” directive when generating CREATE TABLE DDL for a table using InnoDB with a composite primary key with AUTO_INCREMENT on a column that isn’t the first column; to overcome InnoDB’s limitation here, the PRIMARY KEY constraint is now generated with the AUTO_INCREMENT column placed first in the list of columns.
더 보기
No more generation of an implicit KEY for composite primary key w/ AUTO_INCREMENT
The .autoincrement directive is no longer implicitly enabled for a composite primary key column
References: #3216
sqlite¶
[sqlite] [feature] The SQLite dialect now reflects the names of primary key constraints. Pull request courtesy Diana Clarke.
¶References: #3629
[sqlite] [bug] The workaround for right-nested joins on SQLite, where they are rewritten as subqueries in order to work around SQLite’s lack of support for this syntax, is lifted when SQLite version 3.7.16 or greater is detected.
¶References: #3634
[sqlite] [bug] The workaround for SQLite’s unexpected delivery of column names as
¶tablename.columnname
for some kinds of queries is now disabled when SQLite version 3.10.0 or greater is detected.References: #3633
[sqlite] [change] Added support to the SQLite dialect for the
¶Inspector.get_schema_names()
method to work with SQLite; pull request courtesy Brian Van Klaveren. Also repaired support for creation of indexes with schemas as well as reflection of foreign key constraints in schema-bound tables.References: pull request github:198
mssql¶
[mssql] [feature] Added basic isolation level support to the SQL Server dialects via
¶create_engine.isolation_level
andConnection.execution_options.isolation_level
parameters.References: #3534
[mssql] [bug] Fixed issue where the SQL Server dialect would reflect a string- or other variable-length column type with unbounded length by assigning the token
¶"max"
to the length attribute of the string. While using the"max"
token explicitly is supported by the SQL Server dialect, it isn’t part of the normal contract of the base string types, and instead the length should just be left as None. The dialect now assigns the length to None on reflection of the type so that the type behaves normally in other contexts.References: #3504
[mssql] [change] The
¶legacy_schema_aliasing
flag, introduced in version 1.0.5 as part of #3424 to allow disabling of the MSSQL dialect’s attempts to create aliases for schema-qualified tables, now defaults to False; the old behavior is now disabled unless explicitly turned on.References: #3434
misc¶
[feature] [ext] Added
MutableSet
andMutableList
helper classes to the Mutation Tracking extension. Pull request courtesy Jeong YunWon.¶References: #3297
[bug] [sybase] The unsupported Sybase dialect now raises
NotImplementedError
when attempting to compile a query that includes “offset”; Sybase has no straightforward “offset” feature.¶References: #2278