1.1 Changelog¶
1.1.18¶
Released: March 6, 2018postgresql¶
mysql¶
Диалекты MySQL теперь запрашивают версию сервера, используя явный запрос
SELECT @@version
к серверу, чтобы убедиться, что мы получаем в ответ правильную информацию о версии. Прокси-серверы, такие как MaxScale, вмешиваются в значение, передаваемое в значение connection.server_version в DBAPI, поэтому этот способ больше не является надежным.References: #4205
1.1.17¶
Released: February 22, 2018Исправлена регрессия, возникшая в 1.2.3 и 1.1.16 в отношении ассоциативных прокси-объектов: подход к #4185 при вычислении «принадлежащего класса» ассоциативного прокси по умолчанию выбирает текущий класс, если прокси-объект не связан напрямую с сопоставленным классом, например, с mixin’ом.
References: #4185
1.1.16¶
Released: February 16, 2018orm¶
Исправлена проблема в функции post_update, когда UPDATE выдавался, когда родительский объект был удален, а зависимый - нет. Эта проблема существовала уже давно, однако с тех пор, как в версии 1.2 для функции post_update стали утверждать, что строки совпадают, это приводило к ошибке.
References: #4187
Исправлена регрессия, вызванная исправлением проблемы #4116, затрагивавшей версии 1.2.2 и 1.1.15, в результате которой в некоторых ситуациях декларативного смешивания/наследования, а также при обращении к ассоциативному прокси из не отображенного класса, «класс-владелец»
AssociationProxy
неправильно вычислялся как классNoneType
. Логика «выяснения владельца» была заменена на более глубокую процедуру, которая выполняет поиск по всей иерархии отображения, назначенной классу или подклассу, чтобы определить правильное (как мы надеемся) соответствие; если соответствие не найдено, то владелец не назначается. Если прокси используется против не отображенного экземпляра, то возникает исключение.References: #4185
Исправлена ошибка, при которой объект, удаляемый при откате вложенной или субтранзакции, в которой также был изменен первичный ключ, некорректно удалялся из сессии, что приводило к последующим проблемам при использовании сессии.
References: #4151
sql¶
Добавлены
nullsfirst()
иnullslast()
в качестве импортов верхнего уровня в пространства именsqlalchemy.
иsqlalchemy.sql.
. Pull request любезно предоставлен Леле Гайфаксом.Исправлена ошибка в
Insert.values()
, при которой использование формата «многозначных значений» в сочетании с объектамиColumn
в качестве ключей, а не строк, приводило к ошибке. Pull request любезно предоставлен Обри Старк-Толером.References: #4162
postgresql¶
В список сообщений, запускающих сценарий «отключение», добавлено «Ошибка SSL SYSCALL: Operation timed out» в список сообщений, вызывающих сценарий «disconnect» для драйвера psycopg2. Pull request любезно предоставлен Андре Крузом (André Cruz).
В список ключевых слов, принимаемых диалектом PostgreSQL в качестве триггерного ключевого слова «autocommit», добавлено «TRUNCATE». Pull request любезно предоставлен Джейкобом Хейсом.
mysql¶
Исправлена ошибка, при которой операторы MySQL «concat» и «match» не распространяли kwargs на левое и правое выражение, что приводило к ошибке опций компилятора, таких как «literal_binds».
References: #4136
misc¶
Исправлена достаточно серьезная ошибка, связанная с тем, что соединение, полученное после обновления в результате выполнения пользовательской команды
DisconnectionError
или в результате использования функции «pre_ping» в версии 1.2, не сбрасывалось корректно при возврате соединения в пул в результате очистки weakref (например, при сборке мусора переднего объекта); weakref по-прежнему ссылался на ранее недействительное DBAPI-соединение, для которого ошибочно вызывалась операция сброса. Это приведет к появлению трассировки стека в журналах, а также к тому, что соединение будет занесено в пул без сброса, что может привести к проблемам с блокировкой.References: #4184
1.1.15¶
Released: November 3, 2017orm¶
Исправлена ошибка, при которой прокси ассоциации непреднамеренно связывался с объектом
AliasedClass
, если он вызывался первым сAliasedClass
в качестве родителя, что приводило к ошибкам при последующем использовании.References: #4116
Исправлена ошибка, при которой ORM-отношения предупреждали о конфликте целей синхронизации (например, два отношения записывали в один и тот же столбец) для классов-близнецов в иерархии наследования, в то время как на самом деле эти два отношения никогда не конфликтовали при записи.
References: #4078
Исправлена ошибка, при которой корреляционный select, используемый в отношении сущности с наследованием в одной таблице, не отображался корректно во внешнем запросе из-за того, что настройка критериев дискриминатора одиночного наследования неправомерно повторно применяла критерии к внешнему запросу.
References: #4103
orm declarative¶
Исправлена ошибка, при которой дескриптор, находящийся в другом месте отображаемого столбца или отношения в иерархии, основанной на
AbstractConcreteBase
, при обновлении вызывал ошибку, так как атрибут не отображался как свойство маппера. Аналогичная проблема может возникнуть и для других атрибутов, например, для столбца «type», добавляемогоAbstractConcreteBase
, если класс не включит в свой маппер значение «concrete=True», однако проверка, выполненная здесь, должна предотвратить и этот сценарий.References: #4124
sql¶
Исправлена ошибка, при которой
__repr__
изColumnDefault
приводило к ошибке, если аргумент был кортежем. Pull request любезно предоставлен Nicolas Caniart.References: #4126
Исправлена ошибка, из-за которой недавно добавленные методы
ColumnOperators.any_()
иColumnOperators.all_()
не работали, если их вызывать как методы, а не как самостоятельные функцииany_()
иall_()
. Также добавлены примеры документации по этим относительно неинтуитивным операторам SQL.References: #4093
postgresql¶
Внесены дополнительные исправления в класс
ARRAY
в сочетании с COLLATE, так как исправление, сделанное в #4006, не учитывало многомерный массив.References: #4006
Исправлена ошибка в функции
array_agg
, когда при передаче аргумента, уже имеющего типARRAY
, например, конструкции PostgreSQLarray
, возникала ошибкаValueError
, связанная с тем, что функция пыталась вложить массивы.References: #4107
Исправлена ошибка в PostgreSQL
Insert.on_conflict_do_update()
, из-за которой оператор insert не мог быть использован в качестве CTE, например, черезInsert.cte()
, внутри другого оператора.References: #4074
mysql¶
Предупреждение выдается при обнаружении MariaDB 10.2.8 или более ранних версий серии 10.2, поскольку в этих версиях имеются серьезные проблемы с ограничениями CHECK, которые были решены в версии 10.2.9.
Обратите внимание, что данное сообщение в журнале изменений НЕ было выпущено вместе с SQLAlchemy 1.2.0b3 и было добавлено задним числом.
References: #4097
MySQL 5.7.20 теперь предупреждает об использовании переменной @tx_isolation; для предотвращения этого предупреждения теперь выполняется проверка версии и вместо нее используется @transaction_isolation.
References: #4120
Исправлена проблема, при которой CURRENT_TIMESTAMP некорректно отражалась в серии MariaDB 10.2 из-за изменения синтаксиса, где функция теперь представлена в виде
current_timestamp()
.References: #4096
MariaDB 10.2 теперь поддерживает ограничения CHECK (предупреждение: используйте версию 10.2.9 или выше из-за проблем с восходящим потоком, отмеченных в #4097). Теперь Reflection учитывает эти CHECK-ограничения, если они присутствуют в выводе
SHOW CREATE TABLE
.References: #4098
sqlite¶
Исправлена ошибка, при которой отражение ограничений SQLite CHECK приводило к ошибке, если ссылающаяся таблица находилась в удаленной схеме, например, на SQLite удаленная база данных, на которую ссылался ATTACH.
References: #4099
mssql¶
В диалект PyODBC для SQL Server добавлен полный набор кодов исключений «соединение закрыто», включая „08S01“, „01002“, „08003“, „08007“, „08S02“, „08001“, „HYT00“, „HY010“. Ранее был охвачен только „08S01“.
References: #4095
1.1.14¶
Released: September 5, 2017orm¶
Исправлена ошибка в
Session.merge()
, аналогичная ошибке в #4030, когда внутренняя проверка наличия целевого объекта в карте идентификаторов могла привести к ошибке, если он был собран в мусор непосредственно перед тем, как процедура слияния действительно получит объект.References: #4069
Исправлена ошибка, при которой опция
undefer_group()
не распознавалась, если она распространялась на отношения, загружаемые с использованием объединенной ускоренной загрузки. Кроме того, поскольку ошибка приводила к избыточной работе, количество вызовов функций Python также улучшено на 20% при первоначальном вычислении столбцов результирующего набора, что дополняет улучшения в объединенной ускоренной загрузке #3915.References: #4048
Исправлено состояние гонки в ORM identity map, которое приводило к неправомерному удалению объектов во время операции загрузки, что приводило к дублированию идентификаторов объектов, особенно при загрузке с ускорением, включающей дедупликацию объектов. Проблема связана со сборкой мусора для слабых ссылок и наблюдается только в интерпретаторе PyPy.
References: #4068
Исправлена ошибка в
Session.merge()
, когда объекты в коллекции, у которых атрибут первичного ключа был установлен в значениеNone
для ключа, который обычно является автоинкрементным, считались персистентным ключом базы данных для части внутреннего процесса дедупликации, в результате чего в базу данных реально вставлялся только один объект.References: #4056
При использовании атрибута
synonym()
против атрибута, который не используется против атрибутаMapperProperty
, например, ассоциативного прокси, возникает ошибкаInvalidRequestError
. Ранее при попытке найти несуществующие атрибуты происходило переполнение рекурсии.References: #4067
sql¶
Изменена спецификация диапазона для оконных функций, позволяющая использовать в диапазоне два одинаковых ключевых слова PRECEDING или FOLLOWING, причем левая часть диапазона может быть положительной, а правая - отрицательной, например, (1, 3) - это «1 FOLLOWING и 3 FOLLOWING».
References: #4053
1.1.13¶
Released: August 3, 2017oracle¶
Исправлена регрессия производительности, вызванная исправлением #3937, когда cx_Oracle начиная с версии 5.3 исключал из своего пространства имен символ
.UNICODE
, что интерпретировалось как безусловное включение режима cx_Oracle «WITH_UNICODE», вызывающего на стороне SQLAlchemy функции безусловного преобразования всех строк в юникод и приводящего к снижению производительности. На самом деле, по словам автора cx_Oracle, начиная с версии 5.1 режим «WITH_UNICODE» был полностью удален, поэтому дорогостоящие функции преобразования юникода больше не нужны и отключаются, если cx_Oracle 5.1 или выше обнаружен под Python 2. Также восстановлено предупреждение о недопустимости использования режима «WITH_UNICODE», которое было удалено при #3937.This change is also backported to: 1.0.19
References: #4035
1.1.12¶
Released: July 24, 2017orm¶
Исправлена ошибка из версии 1.1.11, при которой добавление дополнительных колонок, не относящихся к сущности, в запрос, включающий сущность с отношениями subqueryload, приводило к неудаче из-за проверки, добавленной в версии 1.1.11 в результате использования #4011.
References: #4033
Исправлена ошибка, связанная с логикой оценки JSON NULL, добавленной в 1.1 как часть #3514, когда логика не учитывала ORM-маппинг атрибутов, названных не так, как в
Column
, который был маппингом.References: #4031
Добавлены проверки
KeyError
во все методы внутриWeakInstanceDict
, где проверка наkey in dict
сопровождается индексированным доступом к этому ключу, для защиты от гонки со сборкой мусора, которая под нагрузкой может удалить ключ из диктанта после того, как код предположит его наличие, что приведет к очень редким появлениямKeyError
.References: #4030
oracle¶
В
Sequence
добавлены новые ключевые словаSequence.cache
иSequence.order
, позволяющие выводить параметр CACHE, понимаемый Oracle и PostgreSQL, и параметр ORDER, понимаемый Oracle. Pull request любезно предоставлен Дэвидом Муром.
tests¶
Исправлена проблема в тестировании фикстур, которая была несовместима с изменением, внесенным в Python 3.6.2 в отношении менеджеров контекста.
This change is also backported to: 1.0.18
References: #4034
1.1.11¶
Released: Monday, June 19, 2017orm¶
Исправлена проблема с ускоренной загрузкой подзапросов, которая продолжает серию проблем, исправленных в #2699, #3106, #3893, связанных с тем, что «подзапрос» содержит правильное предложение FROM, когда начинается с объединенного подкласса наследования и затем выполняется ускоренная загрузка подзапроса на отношение из базового класса, при этом запрос также включает критерии против подкласса. Исправление, описанное в предыдущих тикетах, не учитывало дополнительных операций загрузки подзапросов, загружающих более глубокие отношения с первого уровня, поэтому исправление было дополнительно обобщено.
References: #4011
sql¶
Исправлена ошибка AttributeError, возникавшая в конструкции
WithinGroup
при итерации структуры.References: #4012
postgresql¶
В продолжение исправления, корректно обрабатывающего строку версии PostgreSQL «10devel», выпущенного в 1.1.8, добавлена дополнительная ошибка regexp для обработки строк версий вида «10beta1». Хотя в настоящее время PostgreSQL предлагает более эффективные способы получения этой информации, мы придерживаемся regexp, по крайней мере, до версии 1.1.x для наименьшего риска совместимости со старыми или альтернативными базами данных PostgreSQL.
References: #4005
Исправлена ошибка, при которой использование
ARRAY
со строковым типом, имеющим collation, не приводило к корректному синтаксису в CREATE TABLE.References: #4006
mysql¶
В MySQL 5.7 введено ограничение прав доступа для команды «SHOW VARIABLES»; теперь диалект MySQL будет обрабатывать случаи, когда SHOW не возвращает ни одной строки, в частности, при начальном получении SQL_MODE, и выдавать предупреждение о необходимости изменения прав доступа пользователя для того, чтобы строка могла присутствовать.
References: #4007
mssql¶
Исправлена ошибка, когда при использовании хранилища данных Azure необходимо было получить данные об изолированности транзакций SQL Server из другого представления. Теперь запрос выполняется к обоим представлениям, а в случае неудачи безусловно выдается сообщение NotImplemented, что обеспечивает наилучшую устойчивость к будущим произвольным изменениям API в новых версиях SQL Server.
References: #3994
В диалект SQL Server добавлен тип-заполнитель
XML
, благодаря чему отраженная таблица, содержащая этот тип, может быть пересчитана как CREATE TABLE. Тип не имеет специального поведения при обходе и не поддерживает дополнительных уточняющих аргументов.References: #3973
oracle¶
Поддержка двухфазных транзакций полностью удалена из cx_Oracle при использовании DBAPI версии 6.0b1 или более поздней. Исторически сложилось так, что в cx_Oracle 5.x двухфазные транзакции никогда не использовались, а в cx_Oracle 6.x был удален флаг «twophase» на уровне соединения, от которого зависела эта возможность.
References: #3997
1.1.10¶
Released: Friday, May 19, 2017orm¶
Исправлена ошибка, при которой каскад типа «delete-orphan» (впрочем, как и другие) не находил объект, связанный с отношением, которое само является локальным для подкласса в отношениях наследования, в результате чего операция не выполнялась.
References: #3986
schema¶
Теперь при создании объекта
ForeignKeyConstraint
с несоответствующим количеством «локальных» и «удаленных» столбцов выдается сообщениеArgumentError
, что в противном случае приводит к некорректному внутреннему состоянию ограничения. Обратите внимание, что это также влияет на ситуацию, когда в процессе рефлексии диалекта создается несовпадающий набор столбцов для ограничения внешнего ключа.References: #3949
postgresql¶
Добавлена поддержка «autocommit» для ключевых слов GRANT, REVOKE. Pull request любезно предоставлен Джейкобом Хейсом.
mysql¶
Удален древний и ненужный перехват MySQL-функции UTC_TIMESTAMP, который мешал использовать ее с параметром.
References: #3966
Исправлена ошибка в диалекте MySQL, связанная с отображением параметров таблицы в сочетании с параметрами PARTITION при создании CREATE TABLE. Опции, связанные с PARTITION, должны следовать за опциями таблицы, тогда как ранее такой порядок не соблюдался.
References: #3961
oracle¶
Исправлена ошибка в диалекте cx_Oracle, при которой разбор строки версии для cx_Oracle версии 6.0b1 не выполнялся из-за наличия символа «b». Разбор строки версии теперь выполняется с помощью regexp, а не простого разбиения.
References: #3975
misc¶
Защита от проверки «None» в качестве класса в случае, когда происходит сборка мусора декларативных классов и параллельно выполняются новые операции automap prepare(), что очень редко приводит к попаданию в weakref, который не был полностью отработан после gc.
References: #3980
1.1.9¶
Released: April 4, 2017sql¶
Исправлена регрессия, появившаяся в 1.1.5 из-за #3859, когда корректировка оценки «правой стороны» выражения, основанного на
Variant
, с учетом правил «правой стороны» базового типа приводила к неуместной потере типаVariant
в тех случаях, когда мы хотим, чтобы тип левой стороны был передан непосредственно в правую часть, чтобы к аргументу выражения могли быть применены правила уровня связывания.References: #3952
Изменена механика работы
ResultProxy
для безусловной задержки шага «autoclose» до тех пор, покаConnection
не закончит работу с объектом; в случае, когда PostgreSQL ON CONFLICT с RETURNING возвращает отсутствие строк, autoclose происходил в этом ранее не существовавшем случае использования, что приводило к сбою обычного поведения autocommit, которое происходит безусловно при INSERT/UPDATE/DELETE.References: #3955
misc¶
Исправлена регрессия, появившаяся в версии 1.1.8 из-за #3950, когда углубленный поиск информации о типах столбцов в случае «типа схемы» или
TypeDecorator
приводил к ошибке атрибута, если отображение также содержалоcolumn_property
.References: #3956
1.1.8¶
Released: March 31, 2017postgresql¶
Добавлена поддержка разбора строки версии PostgreSQL для версии разработки типа «PostgreSQL 10devel». Pull request любезно предоставлен Шоном Маккалли.
misc¶
Исправлена ошибка в
sqlalchemy.ext.mutable
, когда методMutable.as_mutable()
не отслеживал тип, который был скопирован с помощьюTypeEngine.copy()
. В 1.1 по сравнению с 1.0 это стало более серьезной проблемой, поскольку классTypeDecorator
теперь является подклассомSchemaEventTarget
, что, помимо прочего, указывает родительскомуColumn
, что тип должен быть скопирован приColumn
. Такие копии часто встречаются при использовании декларативных с миксинами или абстрактными классами.References: #3950
В метод
Result.count()
добавлена поддержка связанных параметров, например, тех, которые обычно задаются черезQuery.params()
. Ранее поддержка параметров была опущена. Pull request любезно предоставлен Pat Deegan.
1.1.7¶
Released: March 27, 2017orm¶
Теперь методу
Query.select_entity_from()
можно передать конструкциюaliased()
. Сущности будут извлечены из выборки, представленной конструкциейaliased()
. Это позволяет использовать специальные опции дляaliased()
, такие какaliased.adapt_on_names
, в сочетании сQuery.select_entity_from()
.References: #3933
Исправлено состояние гонки, которое могло возникнуть в многопоточном окружении в результате добавления кэширования через #3915. Внутренняя коллекция объектов
Column
могла неадекватно регенерироваться на объекте-псевдониме, что приводило к ошибке атрибутов и запутывало подключенный загрузчик, когда он пытался вывести SQL и собрать результаты. Теперь коллекция генерируется заранее, до того как объект псевдонима кэшируется и разделяется между потоками.References: #3947
engine¶
Добавлен обработчик исключений, который будет предупреждать об исключении «cause» в Py2K, когда функция «autorollback» в
Connection
сама вызывает исключение. В Py3K эти два исключения естественно сообщаются интерпретатором как одно, возникшее во время обработки другого. Это продолжение серии изменений для обработки откатов, которые в последний раз были внесены в #2696 в версии 1.0.12.References: #3946
sql¶
Добавлена поддержка совместимости объектов
Variant
иSchemaType
. То есть, можно создать вариант с типомEnum
, и инструкции по созданию ограничений и/или объектов типа, специфичных для базы данных, будут корректно распространяться в соответствии с диалектным отображением варианта.References: #2892
Исправлена ошибка в компиляторе, когда строковый идентификатор точки сохранения кэшировался в словаре котировок идентификаторов; поскольку эти идентификаторы произвольны, то при использовании неограниченного числа точек сохранения в одном
Connection
, а также при непосредственном использовании конструкции savepoint clause с неограниченным числом имен точек сохранения могла происходить небольшая утечка памяти. Утечка памяти не влияет на подавляющее большинство случаев, так как обычноConnection
, который выводит имена точек сохранения с помощью простого счетчика, начинающегося с «1», используется для каждой транзакции или для фиксированного количества транзакций перед тем, как быть отброшенным.References: #3931
Исправлена ошибка в новой функции «перевод схемы», когда при выводе вместе с выражением столбца транслированное имя схемы обращалось к имени псевдонима; это происходило только в том случае, если исходное имя трансляции имело значение «None». Функция «перевод схемы» теперь действует только для подклассов
SchemaItem
иSchemaType
, то есть объектов, соответствующих DDL-создаваемой структуре в базе данных.References: #3924
oracle¶
Исправление режима WITH_UNICODE в cx_Oracle, которое было обнаружено в результате того, что cx_Oracle 5.3 теперь жестко кодирует этот флаг в сборке; внутренний метод, использующий этот режим, не использовал правильную сигнатуру.
This change is also backported to: 1.0.18
References: #3937
1.1.6¶
Released: February 28, 2017orm¶
Устранены некоторые давно не замечаемые проблемы с производительностью системы построения запросов объединенного eager loader, накопившиеся с предыдущих версий в результате повышения уровня абстракции. Использование специальных
AliasedClass
объектов для каждого запроса, которое каждый раз приводило к большим затратам на поиск столбцов, было заменено на кэшированный подход, использующий небольшой пулAliasedClass
объектов, который повторно используется между вызовами объединенной ускоренной загрузки. Также были оптимизированы некоторые механизмы, связанные с построением путей соединения. Количество вызовов для теста «сквозное построение запроса + выборка одной строки» при наихудшем сценарии работы объединенного загрузчика сократилось примерно на 60% по сравнению с версией 1.1.5 и на 42% по сравнению с версией 0.8.6.References: #3915
Исправлена серьезная неэффективность функции «eager_defaults», когда для значений столбцов, в которые ORM явно вставлял NULL, выдавался ненужный SELECT, соответствующий атрибутам, которые были не заданы в объекте, но не имели серверного значения по умолчанию, а также атрибутам с истекшим сроком обновления, для которых, тем не менее, не было задано серверное значение onupdate. Поскольку эти столбцы не являются частью RETURNING, который пытается использовать eager_defaults, они также не должны быть post-SELECTed.
References: #3909
Исправлены две тесно связанные ошибки, связанные с флагом mapper eager_defaults в сочетании с наследованием одной таблицы; в одной из них логика eager defaults непреднамеренно пыталась получить доступ к столбцу, входящему в список «exclude_properties» маппера (используемый Declarative при наследовании одной таблицы) во время eager defaults fetch, а в другой - при полной загрузке строки для получения defaults не использовался правильный наследующий маппер.
References: #3908
Исправлена ошибка, впервые появившаяся в 0.9.7 в результате применения #3106, которая приводила к некорректному запросу в некоторых формах многоуровневой загрузки подзапросов к aliased entities, при этом во внутреннем подзапросе появлялась ненужная дополнительная сущность FROM.
References: #3893
orm declarative¶
Исправлена ошибка, при которой функция «автоматического исключения» в declarative, гарантирующая, что столбец, локальный для одного подкласса наследования таблицы, не появится в качестве атрибута в других производных от базы, не действовала для нескольких уровней подклассификации от базы.
References: #3895
sql¶
Исправлена ошибка, из-за которой событие
DDLEvents.column_reflect()
не позволяло передавать нетекстовое выражение в качестве значения «по умолчанию» для нового столбца, например, объектFetchedValue
для указания общего срабатывания по умолчанию или конструкциюtext()
. В связи с этим также уточнена документация.References: #3905
postgresql¶
Добавлены регулярные выражения для операторов PostgreSQL «IMPORT FOREIGN SCHEMA», «REFRESH MATERIALIZED VIEW», чтобы они автокоммитировались при вызове через соединение или движок без явной транзакции. Pull requests любезно предоставлены Frazer McLean и Paweł Stiasny.
References: #3804
Исправлена ошибка в PostgreSQL
ExcludeConstraint
, когда параметры «whereclause» и «using» не копировались при выполнении операции типаTable.tometadata()
.References: #3900
mysql¶
Добавлены новые зарезервированные слова MySQL 8.0 в диалект MySQL для правильного цитирования. Pull request любезно предоставлен Ханно Шлихтингом (Hanno Schlichting).
mssql¶
В функцию «get_isolation_level», которая вызывается при первом подключении, добавлена проверка версии, чтобы она пропускала SQL Server версии 2000, так как до SQL Server 2005 необходимое системное представление недоступно.
References: #3898
misc¶
В систему «печеных» запросов добавлены
Result.scalar()
иResult.count()
.References: #3896
Исправлена ошибка в новом расширении
sqlalchemy.ext.indexable
, когда установка свойства, которое само ссылается на другое свойство, приводила к ошибке.References: #3901
1.1.5¶
Released: January 17, 2017orm¶
Исправлена ошибка, связанная с объединенной ускоренной загрузкой для нескольких сущностей при использовании полиморфного наследования, которая приводила к ошибке «„NoneType“ object has no attribute „isa“». Проблема была вызвана исправлением для #3611.
This change is also backported to: 1.0.17
References: #3884
Исправлена ошибка в загрузке подзапросов, когда объект, встреченный как «существующая» строка, например, уже загруженный из другого пути в том же запросе, не вызывал загрузчиков подзапросов для выгруженных атрибутов, которые указывали на эту загрузку. Эта проблема находится в той же области, что и проблемы #3431, #3811, которые были связаны с аналогичными проблемами с объединенной загрузкой.
References: #3854
Менеджер контекста
Session.no_autoflush
теперь гарантирует, что флаг autoflush сбрасывается внутри блока «finally», так что если в блоке возникнет исключение, состояние все равно сбросится соответствующим образом. Pull request любезно предоставлен Эмином Аракеляном.Исправлена ошибка, при которой критерии запроса наследования одной таблицы не вставлялись в запрос в том случае, если в качестве критериев отбора использовалась конструкция
Bundle
.References: #3874
Исправлена ошибка, связанная с #3177, когда при выполнении операции UNION или другой операции set, вызванной для
Query
, применялся критерий «единого наследования» к внешней части объединения (также ссылался на неправильный selectable), хотя теперь предполагается, что этот критерий уже присутствует во внутренних подзапросах. Теперь критерий единственного наследования опускается после вызова union() или другой операции set дляQuery
таким же образом, как и дляQuery.from_self()
.References: #3856
examples¶
Исправлены две проблемы в примере versioned_history, одна из которых заключается в том, что таблица history теперь имеет autoincrement=False, чтобы избежать новых ошибок 1.1 относительно составных первичных ключей с autoincrement; другая - в том, что флаг sqlite_autoincrement теперь используется для обеспечения на SQLite использования уникальных идентификаторов в течение всего срока жизни таблицы, даже если некоторые строки удалены. Pull request любезно предоставлен Карлосом Гарсией Монторо.
References: #3872
engine¶
Параметр «extend_existing» при отражении
Table
приводил к удвоению индексов и ограничений в случае использования параметра сMetaData.reflect()
(как это делает расширение automap) из-за того, что таблицы отражались как в пути внешнего ключа, так и напрямую. Для предотвращения такого двойного отражения в последовательностиMetaData.reflect()
передается новый дедублирующий набор.References: #3861
sql¶
Исправлена ошибка, первоначально появившаяся в 0.9 через #1068, когда order_by(<some Label()>) упорядочивал по имени метки, основываясь только на имени, т.е. даже если помеченное выражение вовсе не было тем же выражением, которое присутствует в selectable в явном или неявном виде. Логика упорядочивания по метке теперь гарантирует, что помеченное выражение связано с тем, которое разрешается в это имя, прежде чем упорядочивать по имени метки; кроме того, это имя должно разрешаться в фактическую метку, явно присутствующую в выражении в другом месте, а не просто в имя столбца. Эта логика тщательно отделена от функции order by(textual name), которая имеет несколько иное назначение.
References: #3882
Исправлена регрессия 1.1, когда «import *» не работал для sqlalchemy.sql.expression, из-за неправильного написания функций
any_
иall_
.References: #3878
URL движка, встроенный в исключение «не удалось отразить» в
MetaData.reflect()
, теперь скрывает пароль; также__repr__
дляTLEngine
теперь действует аналогичноEngine
, скрывая пароль URL. Pull request любезно предоставлен Валерием Юндиным.Исправлена проблема в
Variant
, когда логика «принуждения правой руки», унаследованная отTypeDecorator
, принуждала правую часть к самомуVariant
, а не к типу по умолчанию дляVariant
. В случаеVariant
мы хотим, чтобы тип действовал в основном как базовый тип, поэтому логика по умолчанию дляTypeDecorator
теперь переопределяется, чтобы вернуться к логике базового обернутого типа. В настоящее время это актуально в основном для JSON.References: #3859
Исправлена ошибка, при которой флаг компилятора literal_binds не соблюдался конструкцией
Insert
для функции «несколько значений»; теперь последующие значения отображаются как литералы.References: #3880
postgresql¶
Исправлена ошибка в новой функции «ON CONFLICT DO UPDATE», когда значения «set» для предложения UPDATE не подвергались обработке на уровне типов, как это обычно происходит для обработки как пользовательских преобразований на уровне типов, так и преобразований, требуемых диалектом, например, для типов данных JSON. Кроме того, уточнено, что ключи в словаре
set_
должны соответствовать «ключу» столбца, если он отличается от имени столбца. Для оставшихся имен колонок, не совпадающих с ключами колонок, выдается предупреждение; в целях совместимости оно выдается в прежнем виде.References: #3888
Типы данных
TIME
иTIMESTAMP
теперь поддерживают установку нуля для параметра «точность»; ранее ноль игнорировался. Pull request любезно предоставлен Ionuț Ciocîrlan.
mysql¶
Добавлен новый параметр
mysql_prefix
, поддерживаемый конструкциейIndex
, позволяющий указывать специфические для MySQL префиксы, такие как «FULLTEXT». Pull request любезно предоставлен Джозефом Шорром.Диалект MySQL теперь не предупреждает, когда отражаемый столбец имеет ключевое слово «COMMENT», но отмечает, что комментарий еще не отражен; это включено в дорожную карту будущего выпуска. Pull request любезно предоставлен Lele Long.
References: #3867
mssql¶
Исправлена ошибка, при которой диалекты SQL Server пытались выбрать идентификатор последней строки для INSERT из SELECT, что при отсутствии строк в SELECT приводило к неудаче. Для такого оператора флаг inline устанавливается в True, указывая, что последний первичный ключ не должен быть получен.
References: #3876
oracle¶
Исправлена ошибка, при которой INSERT из SELECT, где исходная таблица содержит автоинкрементную последовательность, не компилировался корректно.
References: #3877
Исправлена ошибка, когда в запросе ALL_TABLES на Oracle 9.2 использовалось ключевое слово «COMPRESSION»; хотя в документации Oracle указано, что сжатие таблиц было введено в 9i, реальный столбец появился только в 10.1.
References: #3875
misc¶
Исправлено DeprecationWarnings для Python 3.6, связанное с экранированными строками без модификатора „r“, а также добавлено тестовое покрытие для Python 3.6.
This change is also backported to: 1.0.17
References: #3886
В Firebird перенесено исправление для имен Oracle, заключенных в кавычки в нижнем регистре, чтобы имя таблицы, заключенное в кавычки в нижнем регистре, отражалось корректно, в том числе и когда имя таблицы поступает из функции проверки get_table_names().
References: #3548
1.1.4¶
Released: November 15, 2016orm¶
Исправлена ошибка в
Session.bulk_update_mappings()
, когда атрибут первичного ключа с альтернативным именем не отслеживался должным образом в операторе UPDATE.This change is also backported to: 1.0.16
References: #3849
Исправлена ошибка в
Session.bulk_save()
, при которой UPDATE некорректно работал в связке с отображением, реализующим счетчик идентификаторов версий.This change is also backported to: 1.0.16
References: #3781
Исправлена ошибка, из-за которой аксессоры
Mapper.attrs
,Mapper.all_orm_descriptors
и другие производные атрибуты не обновлялись, если свойства mapper или другие ORM-конструкции были добавлены к mapper/классу после первого вызова этих аксессоров.This change is also backported to: 1.0.16
References: #3778
Исправлена ошибка в коллекциях, связанная с #3457, в результате которой при десериализации во время pickle или deepcopy не устанавливались все атрибуты ORM-коллекции, что приводило к неудаче дальнейших операций мутации.
References: #3852
Исправлена давняя ошибка, при которой стратегия загрузки отношений «noload» приводила к игнорированию опций backrefs и/или back_populates.
References: #3845
engine¶
Удален давно устаревший метод «default_schema_name()» из
Connection
. Этот метод остался от очень старой версии и был нерабочим (например, вызывал ошибку). Pull request любезно предоставлен Benjamin Dopplinger.
sql¶
postgresql¶
Исправлена регрессия, вызванная исправлением в #3807 (версия 1.1.0), где мы обеспечивали квалификацию имени таблицы в предложении WHERE части DO UPDATE в ON CONFLICT PostgreSQL, однако вы не можете поместить имя таблицы в предложении WHERE в самом ON CONFLICT. Это было неверное предположение, поэтому эта часть изменения в #3807 отменена.
mysql¶
В диалекты mysqlclient и pymysql добавлена поддержка курсоров на стороне сервера. Эта возможность доступна как через флаг
Connection.execution_options.stream_results
, так и через аргумент диалектаserver_side_cursors=True
, аналогично тому, как это было сделано для psycopg2 на PostgreSQL. Pull request любезно предоставлен Романом Подолякой.Собственный тип ENUM в MySQL поддерживает отправку любого недействительного значения, а в ответ возвращает пустую строку. В реализацию MySQL для ENUM было добавлено жестко закодированное правило проверки на «возврат пустой строки», чтобы эта пустая строка возвращалась приложению, а не отвергалась как недействительное значение. Обратите внимание, что если перечисление MySQL связывает значения с объектами, то вы все равно получите обратно пустую строку.
References: #3841
sqlite¶
Добавлены кавычки в директивы PRAGMA в диалекте pysqlcipher для корректной поддержки дополнительных аргументов шифра. Pull request любезно предоставлен Кевином Юрчиком (Kevin Jurczyk).
Добавлен дополнительный импорт для pysqlcipher3 DBAPI при использовании диалекта pysqlcipher. Этот пакет будет пытаться быть импортированным, если не присутствует только Python-2 pysqlcipher DBAPI. Pull request любезно предоставлен Кевином Юрчиком (Kevin Jurczyk).
mssql¶
Исправлена ошибка в диалекте pyodbc (а также в основном нерабочем диалекте adodbapi), когда точка с запятой в полях password или username могла быть интерпретирована как разделитель для другого токена; теперь при наличии точки с запятой значения берутся в кавычки.
This change is also backported to: 1.0.16
References: #3762
1.1.3¶
Released: October 27, 2016orm¶
Исправлена регрессия, вызванная #2677, при которой вызов
Session.delete()
на объекте, который уже был сброшен как удаленный в этой сессии, не приводил к установке объекта в карту идентификации (или к отказу от объекта), что приводило к ошибкам при сбросе, поскольку объект находился в состоянии, не учитываемом единицей работы. В этом случае восстановлено поведение, существовавшее до версии 1.1: объект помещается обратно в карту идентификации, чтобы снова попытаться выполнить оператор DELETE, который выдает предупреждение о том, что количество ожидаемых строк не было найдено (если только строка не была восстановлена вне сессии).References: #3839
Исправлена ошибка, при которой некоторые методы
Query
, такие какQuery.update()
и другие, давали сбой, еслиQuery
относился к ряду отображаемых столбцов, а не к отображаемой сущности в целом.References: #3836
sql¶
Исправлена ошибка, связанная с новой функцией трансляции и проверки значений в
Enum
, когда при использовании объекта enum в конкатенации строк типEnum
сохранялся в качестве типа выражения в целом, что приводило к отсутствию поиска. Теперь при конкатенации строки с колонкой, имеющей типEnum
, в качестве типа данных самого выражения используетсяString
.References: #3833
Исправлена регрессия, возникавшая как побочный эффект #2919, из-за которой в менее типичном случае пользовательского
TypeDecorator
, который сам являлся экземпляромSchemaType
(а не реализацией такового), события прикрепления столбцов пропускались для самого типа.References: #3832
postgresql¶
При отражении столбца первичного ключа, не имеющего типа данных
Integer
, даже если он по умолчанию относится к последовательности, порождающей целое число, в таблице PostgreSQL флагColumn.autoincrement
будет установлен в значение False. Это может произойти, если столбец был создан как SERIAL и тип данных был изменен. Флаг автоинкремента может быть True только в том случае, если тип данных имеет целочисленную принадлежность в серии 1.1.References: #3835
1.1.2¶
Released: October 17, 2016orm¶
Исправлена ошибка, связанная с правилом отключения объединенного загрузчика коллекций на другой стороне ленивого загрузчика «многие к одному», впервые добавленного в #1495, когда правило не выполнялось, если с родительским объектом были связаны другие опции запроса, связанные с ленивым загрузчиком.
References: #3824
Исправлена проблема самореферентной сущности, отложенной загрузки столбцов в стиле #3431, #3811, когда сущность присутствует в нескольких позициях в строке из-за самореферентной ускоренной загрузки; когда отложенный загрузчик применяется только к одному из путей, «настоящий» загрузчик столбцов теперь будет переопределять отложенную не-загрузку для этой сущности независимо от порядка строк.
References: #3822
sql¶
Исправлена регрессия, вызванная добавлением функции, выполняющей функцию «обернуть вызываемый объект» для объектов sql
DefaultGenerator
, при этом возникала ошибка атрибута__module__
, когда вызываемым по умолчанию являлся объектfunctools.partial
или другой объект, не имеющий атрибута__module__
.References: #3823
Исправлена регрессия в типе
Enum
, при которой обработчики событий не передавались в случае копирования объекта типа из-за противоречивого метода copy(), добавленного в составе #3250. Такое копирование происходит обычно в ситуациях, когда копируется столбец, например, в tometadata() или при использовании декларативных миксинов с столбцами. Отсутствие обработчика события повлияет на создание ограничений для неродного перечисляемого типа, но в большей степени на объект ENUM на бэкенде PostgreSQL.References: #3827
postgresql¶
Изменено соглашение об именовании, используемое при генерации связанных параметров для оператора вставки с несколькими VALUES, чтобы пронумерованные имена параметров не конфликтовали с анонимизированными параметрами предложения WHERE, как это сейчас принято в конструкции PostgreSQL ON CONFLICT.
References: #3828
1.1.1¶
Released: October 7, 2016mssql¶
misc¶
Заменена ошибка CompileError, возникающая при обнаружении различных ситуаций отсутствия первичного ключа, на предупреждение. Оператор снова передается в базу данных, где происходит сбой и, как обычно, возникает ошибка DBAPI (обычно IntegrityError).
См.также
Директива .autoincrement больше не включается неявно для составного столбца первичного ключа
References: #3216
1.1.0¶
Released: October 5, 2016orm¶
Новая стратегия ленивого загрузчика «raise» дополнена вариантом «raise_on_sql», доступным как через
relationship.lazy
, так и черезraiseload()
. В этом варианте повышение происходит только в том случае, если при ленивой загрузке действительно будет выдан SQL, а не в том случае, если механизм ленивого загрузчика вообще будет вызван.References: #3812
Метод
Query.group_by()
теперь сбрасывает группу по коллекции, если передан аргументNone
, аналогично тому, как долгое время работалQuery.order_by()
. Pull request любезно предоставлен Iuri Diniz.Передача False в
Query.order_by()
для отмены всех заказов by устарела; теперь нет никакой разницы между вызовом этого метода с False или с None.Исправлена ошибка, при которой объединенная ускоренная загрузка приводила к ошибке для полиморфно загруженного отображателя, когда параметр polymorphic_on был установлен на не отображенное выражение, например, на CASE-выражение.
This change is also backported to: 1.0.16
References: #3800
Исправлена ошибка, при которой некорректно вызывалась ошибка ArgumentError, связанная с некорректной привязкой, переданной в сессию через
Session.bind_mapper()
,Session.bind_table()
или конструктор.This change is also backported to: 1.0.16
References: #3798
Исправлена ошибка в подзапросе eager loading, когда подзапрос с объектом «of_type()», связанный со вторым подзапросом с обычным mapped-классом или более длинной цепочкой из нескольких атрибутов «of_type()», не мог корректно связать соединения.
This change is also backported to: 1.0.15
Атрибуты ORM теперь могут быть присвоены любому объекту, имеющему атрибут
__clause_element__()
, что приведет к инлайн SQL, как это делает любой классClauseElement
. Это распространяется и на другие отображаемые атрибуты, не преобразуемые другими конструкциями выражений.References: #3802
Внесена корректировка в исправление ошибки, впервые представленной в [ticket:3431], связанной с появлением объекта в нескольких контекстах в одном наборе результатов, в результате которой загрузчик, устанавливающий для связанного объекта значение None, все равно сработает, удовлетворив загрузку этого атрибута. Ранее корректировка учитывала только значения не-None, поступающие для атрибута, загруженного с нетерпением, во вторичной строке.
References: #3811
Исправлена ошибка в событии new
SessionEvents.persistent_to_deleted()
, когда целевой объект мог быть собран в мусор до срабатывания события.References: #3808
Первичное соединение конструкции
relationship()
теперь может включать объектbindparam()
, содержащий вызываемую функцию для генерации значений. Ранее стратегия ленивого загрузчика была несовместима с таким использованием и, кроме того, не могла корректно определить, следует ли использовать критерий «use_get», если первичный ключ был задействован в связанном параметре.References: #3767
Теперь UPDATE, выдаваемый ORM-процессом flush, может содержать элемент SQL-выражения для столбца первичного ключа объекта, если целевая база данных поддерживает RETURNING для предоставления нового значения, или если значение PK устанавливается «само на себя» для целей переключения другого триггера / onupdate на столбец.
References: #3801
Исправлена ошибка, при которой условие «simple many-to-one», позволяющее при ленивой загрузке использовать get() из identity map, не срабатывало, если в primaryjoin отношения было несколько клаузул, разделенных символом AND, которые не совпадали по порядку с колонками первичного ключа, сравниваемыми в каждой клаузуле. Такая разница в упорядочивании возникает для составного внешнего ключа, когда столбцы, связанные с таблицей на ссылающейся стороне, располагались в коллекции .c не в том же порядке, что и столбцы первичного ключа на ссылающейся стороне…., что, в свою очередь, часто встречается при использовании декларативных миксинов и/или declared_attr для задания столбцов.
References: #3788
Исключение возникает, если два декоратора
@validates
на отображении используют одно и то же имя. Одновременно поддерживается только один валидатор с определенным именем, механизм объединения их в цепочку отсутствует, так как порядок валидаторов на уровне декоратора функции не может быть детерминированным.References: #3776
Ошибки мапперов, возникающие при
configure_mappers()
, теперь явно включают имя исходного маппера в сообщение об исключении, чтобы помочь в тех ситуациях, когда обернутое исключение само не включает исходный маппер. Pull request любезно предоставлен Джоном Перкинсом.
orm declarative¶
При создании декларативного базового класса, который наследуется от другого класса, будет наследоваться и его docstring. Это означает, что
as_declarative()
действует скорее как обычный декоратор класса.
sql¶
Исправлена ошибка в
Table
, когда внутренний метод_reset_exported()
приводил к повреждению состояния объекта. Этот метод предназначен для выбираемых объектов и в некоторых случаях вызывается ORM; ошибочная конфигурация маппера могла привести к тому, что ORM вызывал этот метод на объектеTable
.This change is also backported to: 1.0.15
References: #3755
Опции выполнения теперь могут распространяться из оператора во время компиляции во внешний оператор, так что если встроенный элемент хочет, например, установить значение «autocommit» равным True, он может распространить это на окружающий оператор. В настоящее время эта возможность включена для DML-ориентированных CTE, встроенных внутрь оператора SELECT, например, INSERT/UPDATE/DELETE внутри SELECT.
References: #3805
Строка, передаваемая в качестве значения столбца по умолчанию через параметр
Column.server_default
, теперь экранируется для кавычек.References: #3809
Добавлены флаги уровня компилятора, используемые PostgreSQL для размещения дополнительных скобок, чем обычно генерируется правилами старшинства, вокруг операций с JSON, операторов индексирования HSTORE, а также внутри их операндов, поскольку было замечено, что правила старшинства PostgreSQL, по крайней мере, для оператора индексирования HSTORE не согласуются между 9.4 и 9.5.
References: #3806
Класс исключений
BaseException
теперь перехватывается процедурами обработки исключенийConnection
и включает обработку событиемConnectionEvents.handle_error()
. ДляConnection
предотвращения дальнейших операций с соединением базы данных, находящимся в неизвестном и, возможно, поврежденном состоянии, в случае исключения системного уровня, не являющегося подклассомException
, включаяKeyboardInterrupt
и класс greenletGreenletExit
, теперь по умолчанию выполняется invalidated. В наибольшей степени это изменение касается драйверов MySQL, однако оно распространяется на все DBAPI.References: #3803
Операторы «eq» и «ne» больше не входят в список «ассоциативных» операторов, при этом они по-прежнему считаются «коммутативными». Это позволяет сохранить на уровне SQL выражение типа
(x == y) == z
с помощью круглых скобок. Pull request любезно предоставлен Джоном Пассаро.References: #3799
Stringify выражения с неименованными объектами
Column
, что встречается во многих ситуациях, в том числе в ORM-отчетах об ошибках, теперь будет выдавать имя в строковом контексте как «<имя неизвестно>», а не приводить к ошибке компиляции.References: #3789
При ошибочной передаче в
.execute()
ClauseElement или не-SQLAlchemy объектов, которые не являются «исполняемыми», выдается более описательное исключение/сообщение; новое исключение ObjectNotExecutableError выдается последовательно во всех случаях.References: #3786
Исправлена регрессия в типах данных JSON, при которой не вызывался «буквальный процессор» для значения индекса JSON. Теперь собственные типы данных String и Integer вызываются из JSONIndexType и JSONPathType. Это относится к общим типам JSON, PostgreSQL и MySQL, а также имеет зависимость от #3766.
References: #3765
Исправлена ошибка, при которой
Index
не извлекал колонки из составных SQL-выражений, если эти SQL-выражения были обернуты внутри конструкции__clause_element__()
в стиле ORM. Эта ошибка существует и в версии 1.0.x, однако в версии 1.1 она более заметна, поскольку гибридное @выражение hybrid_property теперь возвращает обернутый элемент.References: #3763
postgresql¶
Внесена корректировка в ON CONFLICT, позволяющая использовать логику «inserted_primary_key» в случае отсутствия INSERT или UPDATE и отсутствия чистого изменения. В этом случае значение выдается как None, а не срабатывает исключение.
References: #3813
Исправлена проблема в новой конструкции PG «on conflict», когда столбцы, включая столбцы пространства имен «excluded», не приравнивались к таблицам в предложениях WHERE в операторе.
References: #3807
mysql¶
Добавлена поддержка разбора булевых и целочисленных аргументов MySQL/Connector в строке запроса URL: connection_timeout, connect_timeout, pool_size, get_warnings, raise_on_warnings, raw, consume_results, ssl_verify_cert, force_ipv6, pool_reset_session, compress, allow_local_infile, use_pure.
This change is also backported to: 1.0.15
References: #3787
Исправлена ошибка, при которой флаг «literal_binds» не распространялся на выражение CAST в MySQL.
References: #3766
mssql¶
Изменен запрос, используемый для получения «имени схемы по умолчанию», с запроса к таблице principals базы данных на использование функции «schema_name()», поскольку поступали сообщения о том, что прежняя система была недоступна в редакции Azure Data Warehouse. Есть надежда, что это наконец-то будет работать во всех версиях SQL Server и стилях аутентификации.
This change is also backported to: 1.0.16
References: #3810
Обновлена схема получения информации о версии сервера для pyodbc, чтобы использовать SQL Server SERVERPROPERTY(), а не полагаться на pyodbc.SQL_DBMS_VER, который продолжает оставаться ненадежным, особенно при использовании FreeTDS.
This change is also backported to: 1.0.16
References: #3814
В список исключений отключения, приводящих к сбросу пула соединений, добавлен код ошибки 20017 «unexpected EOF from the server». Pull request любезно предоставлен Кеном Роббинсом (Ken Robbins).
This change is also backported to: 1.0.16
References: #3791
misc¶
Исправлена ошибка, при которой установка подкласса single-table inh подкласса joined-table, включающего дополнительный столбец, приводила к повреждению коллекции внешних ключей сопоставленной таблицы, что мешало инициализации отношений.
This change is also backported to: 1.0.16
References: #3797
1.1.0b3¶
Released: July 26, 2016orm¶
Устранено предупреждение, относящееся к версии 0.4, которое выдавалось при размещении одноименного отношения на двух картографах, наследуемых через объединенное наследование или наследование одной таблицы. Предупреждение не относится к текущей реализации единицы работы.
References: #3749
sql¶
Исправлена ошибка в новой функции CTE для обновления/вставки/удаления, указанной как CTE внутри вложенного оператора (обычно SELECT), в результате которой значения oninsert и onupdate не вызывались для вложенного оператора.
References: #3745
Исправлена ошибка в новой функции CTE для обновления/вставки/удаления, при которой анонимная (например, без переданного имени) конструкция
CTE
вокруг оператора приводила к ошибке.References: #3744
postgresql¶
Исправлена ошибка, из-за которой типы
TypeDecorator
иVariant
недостаточно глубоко проверялись диалектом PostgreSQL, чтобы определить, что нужно выводить SMALLSERIAL или BIGSERIAL, а не SERIAL.This change is also backported to: 1.0.14
References: #3739
oracle¶
Исправлена ошибка в
Select.with_for_update.of
, когда подход Oracle «rownum» к LIMIT/OFFSET не учитывал выражений внутри клаузы «OF», которые должны быть указаны на самом верхнем уровне со ссылкой на выражение внутри подзапроса. Теперь эти выражения добавляются в подзапрос, если это необходимо.This change is also backported to: 1.0.14
References: #3741
misc¶
В новое расширение sqlalchemy.ext.indexable добавлен параметр «default».
Исправлена ошибка в
sqlalchemy.ext.baked
, когда при использовании нескольких загрузчиков подзапросов разворачивание запроса с жадным загрузчиком подзапросов заканчивалось неудачей из-за проблемы с объемом переменной. Pull request любезно предоставлен Марком Ханенбергом (Mark Hahnenberg).This change is also backported to: 1.0.15
References: #3743
sqlalchemy.ext.indexable будет перехватывать IndexError, а также KeyError при возникновении в качестве AttributeError.
1.1.0b2¶
Released: July 1, 2016sql¶
Исправлена проблема, связанная с оператором отрицания в математике SQL, когда тип выражения переставал соответствовать числовому типу оригинала. Это приводило к проблемам, когда тип определял поведение набора результатов.
This change is also backported to: 1.0.14
References: #3735
Исправлена ошибка, из-за которой методы
__getstate__
/__setstate__
для sqlalchemy.util.Properties были нерабочими в связи с переходом в серии 1.0 на__slots__
. Данная проблема потенциально могла повлиять на некоторые сторонние приложения. Pull request любезно предоставлен Питером Малдером (Pieter Mulder).This change is also backported to: 1.0.14
References: #3728
Обработка данных типа
Boolean
для бэкендов, поддерживающих только целочисленные типы, была согласована между версиями чистого Python и C-расширения. Так, в версии C-расширения любое целочисленное значение из базы данных будет восприниматься как булево, а не только ноль и единица; кроме того, небулевые целочисленные значения, передаваемые в базу данных, принудительно приводятся к нулю или единице, а не передаются как исходное целочисленное значение.См.также
Неродные булевые целочисленные значения во всех случаях принудительно приводятся к нулю/одну/Нулю
References: #3730
В
Enum
немного отступили от правил проверки, позволяющих пропускать неизвестные строковые значения, если только Enum не передан флагvalidate_string=True
; любые другие типы объектов, разумеется, по-прежнему отклоняются. Хотя непосредственным применением является разрешение сравнения перечислений с помощью LIKE, сам факт существования такого использования указывает на то, что случаев использования сравнения неизвестных строк может быть больше, чем мы ожидали, что намекает на то, что, возможно, существуют и случаи вставки неизвестных строк.References: #3725
postgresql¶
Внесено небольшое изменение в поведение расширения
sqlalchemy.ext.compiler
, при котором существующие схемы компиляции для установленной конструкции удаляются, если сама конструкция еще не имеет своего собственного выделенного__visit_name__
. В версии 1.0 это происходило редко, однако в версии 1.1ARRAY
является подклассомARRAY
и имеет такое поведение. В результате установка обработчика компиляции для другого диалекта, например SQLite, приведет к тому, что основной объектARRAY
перестанет компилироваться.References: #3732
mysql¶
В Больше не нужно генерировать неявный KEY для составного первичного ключа с AUTO_INCREMENT немного изменен порядок следования столбцов первичного ключа при автоинкременте, так что если
PrimaryKeyConstraint
явно определен, то порядок столбцов сохраняется в точности, что позволяет управлять этим поведением при необходимости.References: #3726
1.1.0b1¶
Released: June 16, 2016orm¶
Добавлено новое ORM-расширение Индексируемый, позволяющее строить Python-атрибуты, ссылающиеся на конкретные элементы «индексированных» структур, таких как массивы и JSON-поля. Pull request любезно предоставлен Jeong YunWon.
См.также
Добавлен новый флаг
Session.bulk_insert_mappings.render_nulls
, позволяющий выполнять массовый ORM INSERT с отображением значений NULL; это позволяет обойти настройки по умолчанию на стороне сервера, но при этом все операторы формируются с одним и тем же набором столбцов, что позволяет обрабатывать их в пакетном режиме. Pull request любезно предоставлен Tobias Sauerwein.Добавлено новое событие
AttributeEvents.init_scalar()
, а также новый набор примеров, иллюстрирующих его использование. Это событие может быть использовано для предоставления значения по умолчанию, сгенерированного Core, атрибуту на стороне Python перед сохранением объекта.References: #1311
В метод
AutomapBase.prepare()
добавлено значениеAutomapBase.prepare.schema
, указывающее, из какой схемы следует отражать таблицы, если это не схема по умолчанию. Pull request любезно предоставлен Джошем Марлоу.В доступные параметры отображения добавлен новый параметр
mapper.passive_deletes
. Это позволяет выполнять DELETE при наследовании по объединенным таблицам только для базовой таблицы, а для удаления строки из таблиц подклассов - ON DELETE CASCADE.References: #2349
Вызов str() для основной конструкции SQL стал более «дружественным», когда конструкция содержит нестандартные элементы SQL, такие как RETURNING, операции с индексами массивов, диалектные или пользовательские типы данных. Теперь в этих случаях возвращается строка, отображающая приближенное представление конструкции (обычно ее версию в стиле PostgreSQL), а не вызывающая ошибку.
References: #3631
Вызов
str()
дляQuery
теперь будет учитыватьEngine
, с которым связанSession
, при генерации строковой формы SQL, так что, по возможности, будет показан реальный SQL, который будет выдан в базу данных. Ранее использовался только движок, связанный сMetaData
, к которому привязано отображение, если таковое имеется. Если ни наSession
, ни наMetaData
, с которым связаны отображения, не удается найти привязки, то для отображения SQL используется диалект «по умолчанию», как это было ранее.References: #3081
Набор
SessionEvents
теперь включает события, позволяющие однозначно отслеживать все переходы состояния жизненного цикла объекта в терминах самогоSession
, например, ожидающий, переходный, постоянный, отсоединенный. Также определяется состояние объекта в рамках каждого события.References: #2677
Добавлено новое состояние жизненного цикла сессии deleted. Это новое состояние представляет объект, который был удален из состояния persistent и перейдет в состояние detached после фиксации транзакции. Это решает давнюю проблему, когда удаленные объекты существовали в серой зоне между постоянными и отсоединенными. Аксессор
InstanceState.persistent
больше не будет не сообщать об удаленном объекте как о постоянном; вместо этого аксессорInstanceState.deleted
будет иметь значение True для таких объектов, пока они не станут отсоединенными.References: #2677
Добавлена проверка на распространенную ошибку, связанную с передачей отображенных классов или отображенных экземпляров в контекст, где они интерпретируются как связанные параметры SQL; в этом случае возникает новое исключение.
References: #3321
Добавлена новая стратегия загрузки отношений
raiseload()
(также доступная черезlazy='raise'
). Эта стратегия ведет себя почти так же, какnoload()
, но вместо возвратаNone
выдает ошибку InvalidRequestError. Pull request любезно предоставлен Adrian Moennich.References: #3512
Параметр
Mapper.order_by
устарел. Это старый параметр, больше не имеющий отношения к работе SQLAlchemy после появления объекта Query. Утратив его, мы показываем, что не поддерживаем нерабочие варианты использования и призываем приложения отказаться от использования этого параметра.См.также
References: #3394
Параметр
Session.weak_identity_map
устарел. Смотрите новый рецепт Поведение при обращении к сеансам для событийно-ориентированного подхода к поддержанию сильного поведения карты идентификации.References: #2677
Исправлена проблема, при которой изменение объекта от одного родителя к другому могло работать некорректно в сочетании с не очищенной модификацией атрибута внешнего ключа. Теперь при перемещении атрибута учитывается зафиксированное в базе данных значение внешнего ключа, чтобы найти «предыдущего» родителя перемещаемого объекта. Это позволяет корректно срабатывать событиям, в том числе и событиям обратной ссылки. Ранее эти события срабатывали не всегда. Это может повлиять на работу приложений, которые полагались на прежнее неработающее поведение.
References: #3708
Исправлена ошибка, при которой отложенные колонки случайно устанавливались для загрузки в базу данных при очередном разворачивании объекта в целом, когда объект был объединен в сессию с помощью
session.merge(obj, load=False)
.References: #3488
В продолжение распространенного в MySQL исключения, связанного с отменой точки сохранения, о котором впервые говорилось в #2696, режим отказа, в котором находится
Session
, когда SAVEPOINT исчезает до отката, был улучшен, чтобыSession
по-прежнему функционировал вне этой точки сохранения. Предполагается, что операция сохранения завершилась неудачно и была отменена.References: #3680
Исправлена ошибка, при которой только что вставленный экземпляр, откаченный назад, все равно потенциально вызывал конфликты персистентности в следующей транзакции, поскольку не проверялось, что срок действия экземпляра истек. Это исправление позволит устранить большой класс случаев, которые ошибочно вызывали ошибку «New instance with identity X conflicts with persistent instance Y».
References: #3677
Улучшение работы
Query.correlate()
, заключающееся в том, что при использовании «полиморфной» сущности, представляющей собой прямое соединение нескольких таблиц, оператор будет гарантировать, что все таблицы, входящие в соединение, являются частью того, что соотносится.References: #3662
Исправлена ошибка, из-за которой атрибут, загружаемый с нетерпением «многие к одному», не загружался, если объединенная загрузка происходила из строки, в которой одна и та же сущность присутствовала несколько раз, в одних случаях вызывая нетерпеливую загрузку атрибута, а в других - нет. Логика здесь изменена таким образом, чтобы атрибут загружался даже в том случае, если родительская сущность уже была обработана другим загрузчиком.
См.также
Реализована ускоренная загрузка, когда одна и та же сущность присутствует несколько раз в одном ряду
References: #3431
Уточнение логики добавления столбцов в результирующий SQL при комбинации
Query.distinct()
сQuery.order_by()
таким образом, что столбцы, которые уже присутствуют, не будут добавляться второй раз, даже если они обозначены другим именем. Независимо от этого изменения, дополнительные столбцы, добавленные в SQL, никогда не возвращались в конечный результат, поэтому данное изменение влияет только на строковую форму оператора, а также на его поведение при использовании в контексте выполнения Core. Кроме того, столбцы больше не добавляются при использовании формата DISTINCT ON, если запрос не обернут внутри подзапроса из-за присоединенной ускоренной загрузки.References: #3641
Исправлена проблема, при которой два одноименных отношения, ссылающихся на базовый класс и конкретно-наследуемый подкласс, при установке этих отношений с помощью «backref» вызывали ошибку, в то время как установка идентичной конфигурации с помощью relationship() с конфликтующими именами была успешной, как и положено в случае конкретного отображения.
References: #3630
Метод
Session.merge()
теперь отслеживает ожидающие объекты по первичному ключу перед выдачей INSERT и объединяет разные объекты с дублирующимися первичными ключами по мере их появления, что в лучшем случае является полудетерминированным. Такое поведение соответствует тому, что уже происходит с постоянными объектами.References: #3601
Исправлена ошибка, при которой критерий «наследование одной таблицы» добавлялся в конец запроса в некоторых неподходящих ситуациях, например, при запросе из exists() подкласса с одним наследованием.
References: #3582
Добавлен новый модификатор уровня типа
TypeEngine.evaluates_none()
, который указывает ORM, что положительный набор None должен быть сохранен как значение NULL, вместо того чтобы исключить столбец из оператора INSERT. Эта возможность используется как в рамках реализации для #3514, так и в качестве самостоятельной функции, доступной для любого типа.References: #3250
Внутренние вызовы «бухгалтерских» функций в
Session.bulk_save_objects()
и связанных с ними массовых методов были сокращены до такой степени, что в настоящее время эта функциональность не используется, например, проверки на получение значений по умолчанию для столбцов после выполнения оператора INSERT или UPDATE.References: #3526
Внесены дополнительные исправления, касающиеся значения
None
в сочетании с типом PostgreSQLJSON
. Если оставить флагJSON.none_as_null
в значении по умолчаниюFalse
, то ORM теперь будет корректно вставлять в колонку строку JSON «„null“», когда значение на объекте ORM установлено в значениеNone
или когда значениеNone
используется сSession.bulk_insert_mappings()
, в том числе если колонка имеет значение по умолчанию или серверное значение по умолчанию.См.также
JSON «null» вставляется, как и ожидалось, при операциях ORM, и опускается, если не присутствует
Новые опции, позволяющие явно сохранять NULL вместо значения по умолчанию
References: #3514
engine¶
Добавлены события пула соединений
ConnectionEvents.close()
,ConnectionEvents.detach()
,ConnectionEvents.close_detached()
.Все строковые форматирования связанных наборов параметров и строк результатов для целей протоколирования, исключений и
repr()
теперь обрезают очень большие скалярные значения внутри каждой коллекции, включая обозначение «N символов обрезано», аналогично тому, как обрезается отображение больших многопараметрических наборов.References: #2837
Добавлена трансляция схем для объектов
Table
с поддержкой нескольких пользователей. Это позволяет использовать приложение, которое использует один и тот же набор объектовTable
во многих схемах, например, в схеме для каждого пользователя. Добавлена новая опция выполненияConnection.execution_options.schema_translate_map
.References: #2685
В движок добавлена новая система точек входа, позволяющая указывать «плагины» в строке запроса к URL. Можно написать пользовательские плагины, которые будут иметь возможность изменять и/или потреблять URL и аргументы ключевых слов движка, а затем при создании движка будут получать сам движок для дополнительных модификаций или регистрации событий. Плагины написаны как подкласс
CreateEnginePlugin
; подробнее см. этот класс.References: #3536
sql¶
Добавлена поддержка TABLESAMPLE с помощью нового метода
FromClause.tablesample()
и отдельной функции. Pull request любезно предоставлен Ilja Everilä.См.также
References: #3718
Добавлена поддержка диапазонов в оконных функциях с использованием параметров
over.range_
иover.rows
.References: #3049
Реализовано отражение ограничений CHECK для SQLite и PostgreSQL. Это доступно как через новый метод инспектора
Inspector.get_check_constraints()
, так и при отраженииTable
объектов в видеCheckConstraint
объектов, присутствующих в коллекции ограничений. Pull request любезно предоставлен Алексом Грёнхольмом (Alex Grönholm).Новые операторы
ColumnOperators.is_distinct_from()
иColumnOperators.isnot_distinct_from()
; pull request любезно предоставлен Себастьяном Банком.В
DDLCompiler.visit_create_table()
добавлен хукDDLCompiler.create_table_suffix()
, позволяющий пользовательским диалектам добавлять ключевые слова после предложения «CREATE TABLE». Pull request любезно предоставлен Марком Санданом.Отрицательные целочисленные индексы теперь учитываются в строках, возвращаемых из
ResultProxy
. Pull request любезно предоставлен Emanuele Gaifas.Добавлена конструкция
Select.lateral()
и связанные с ней конструкции, позволяющие использовать ключевое слово LATERAL стандарта SQL, которое в настоящее время поддерживается только в PostgreSQL.References: #2857
В Core и ORM добавлена поддержка рендеринга «FULL OUTER JOIN». Pull request любезно предоставлен Стефаном Урбанеком.
References: #1957
Функциональность CTE была расширена для поддержки всего DML, позволяя операторам INSERT, UPDATE и DELETE как указывать свое собственное выражение WITH, так и превращать эти операторы в выражения CTE, если они включают в себя выражение RETURNING.
References: #2551
В тип данных
Enum
добавлена поддержка перечислимых классов в стиле PEP-435, а именно классаenum.Enum
из Python 3, а также совместимых библиотек перечислений. Тип данныхEnum
теперь также выполняет проверку входящих значений в Python и добавляет возможность отказаться от создания ограничения CHECKEnum.create_constraint
. Pull request любезно предоставлен Алексом Грёнхольмом (Alex Grönholm).Глубокое усовершенствование недавно добавленного метода
TextClause.columns()
и его взаимодействия с обработкой строк результата позволяет теперь позиционно сопоставлять столбцы, передаваемые в метод, со столбцами результата в операторе, а не сопоставлять их только по имени. Преимуществом этого является то, что при связывании текстового SQL-оператора с ORM или табличной моделью Core не требуется система маркировки или дедупликации общих имен столбцов, что также означает отсутствие необходимости заботиться о соответствии имен таблиц столбцам ORM и так далее. Кроме того, функцияResultProxy
была усовершенствована для более точного сопоставления ключей столбцов и строк со строкой в некоторых случаях.См.также
Расширение возможностей согласования столбцов ResultSet; позиционная настройка столбцов для текстового SQL - обзор возможностей
TextClause.columns() при позиционной передаче будет сопоставлять столбцы не по имени, а позиционно - замечания по обратной совместимости
References: #3501
В ядро добавлен новый тип
JSON
. Он является основой типа PostgreSQLJSON
, а также нового типаJSON
, что позволяет использовать PG/MySQL-агностичный JSON-столбец. Тип поддерживает базовый поиск по индексу и пути.См.также
References: #3619
Добавлена поддержка «наборно-агрегатных» функций вида
<function> WITHIN GROUP (ORDER BY <criteria>)
, использующих методFunctionElement.within_group()
. Добавлен ряд распространенных функций типа «набор-агрегат» с возвращаемыми типами, производными от набора. К ним относятся функции типаpercentile_cont
,dense_rank
и другие.References: #1370
Добавлена поддержка стандартной для SQL функции
array_agg
, которая автоматически возвращаетARRAY
правильного типа и поддерживает операции с индексами / срезами, а такжеarray_agg()
, которая возвращаетARRAY
с дополнительными возможностями сравнения. Поскольку массивы на данный момент поддерживаются только на PostgreSQL, фактически работает только на PostgreSQL. Также добавлена новая конструкцияaggregate_order_by
в поддержку расширения PG «ORDER BY».References: #3132
В ядро добавлен новый тип
ARRAY
. Он является основой типа PostgreSQLARRAY
и теперь входит в состав Core, чтобы начать поддерживать различные возможности поддержки массивов в стандарте SQL, включая некоторые функции и возможную поддержку собственных массивов в других базах данных, имеющих понятие «массив», таких как DB2 или Oracle. Кроме того, добавлены новые операторыany_()
иall_()
. Они поддерживают не только конструкции массивов в PostgreSQL, но и подзапросы, которые можно использовать в MySQL (но, к сожалению, не в PostgreSQL).References: #3516
Система, по которой столбец
Column
считается «автоинкрементным», была изменена таким образом, что автоинкремент больше не включается неявно дляTable
, имеющего составной первичный ключ. Чтобы обеспечить возможность включения автоинкремента для составного столбца-члена PK и в то же время сохранить давно существующее в SQLAlchemy поведение включения неявного автоинкремента для единственного целочисленного первичного ключа, к параметруColumn.autoincrement
"auto"
было добавлено третье состояние, которое теперь используется по умолчанию.См.также
Директива .autoincrement больше не включается неявно для составного столбца первичного ключа
Больше не нужно генерировать неявный KEY для составного первичного ключа с AUTO_INCREMENT
References: #3216
FromClause.count()
является устаревшей. Эта функция использует произвольный столбец таблицы и не является надежной; для использования в ядре следует предпочестьfunc.count()
.References: #3724
Исправлено утверждение, которое несколько некорректно поднималось, если индекс
Index
был связан с индексомColumn
, который был связан с индексомTableClause
в нижнем регистре; для целей связывания индекса с индексомTable
эта связь должна игнорироваться.References: #3616
Конструкция
type_coerce()
теперь является полноценным элементом выражения Core, который подвергается поздней оценке во время компиляции. Ранее эта функция была только функцией преобразования, которая обрабатывала различные входные данные выражения, возвращая либоLabel
из выражения, ориентированного на столбец, либо копию данного объектаBindParameter
, что, в частности, не позволяло логически поддерживать операцию, когда преобразование выражения на уровне ORM конвертирует столбец в связанный параметр (например, для ленивой загрузки).References: #3531
Расширитель типа
TypeDecorator
теперь будет работать совместно с реализациейSchemaType
, обычноEnum
илиBoolean
, обеспечивая передачу событий для каждой таблицы от типа реализации к внешнему типу. Эти события используются для обеспечения корректного создания (и, возможно, удаления) ограничений или типов PostgreSQL (например, ENUM) вместе с родительской таблицей.References: #2919
Поведение конструкции
union()
и связанных с ней конструкций, таких какQuery.union()
, теперь учитывает случаи, когда встроенные операторы SELECT необходимо заключать в круглые скобки из-за того, что они включают LIMIT, OFFSET и/или ORDER BY. Эти запросы не работают на SQLite, и на этом бэкенде, как и раньше, будут неудачными, но теперь должны работать на всех остальных бэкендах.References: #2528
schema¶
Функции генерации, передаваемые по умолчанию объектам
Column
, теперь запускаются через «update_wrapper» или эквивалентную функцию, если передается вызываемая не-функция, так что инструменты интроспекции сохраняют имя и docstring обернутой функции. Pull request courtesy hsum.
postgresql¶
Добавлена поддержка PostgreSQL’s INSERT..ON CONFLICT с использованием нового специфичного для PostgreSQL объекта
Insert
. Pull-запрос и значительные усилия Робин Томас.References: #3529
DDL для DROP INDEX будет выдавать «CONCURRENTLY», если флаг
postgresql_concurrently
установлен послеIndex
и если используемая база данных определяется как PostgreSQL версии 9.2 или выше. Для CREATE INDEX также добавлена функция определения версии базы данных, которая будет опускать предложение, если версия PG меньше 8.2. Pull request любезно предоставлен Iuri de Silvio.Добавлен новый параметр
PGInspector.get_view_names.include
, позволяющий указать, какие виды представлений должны быть возвращены. В настоящее время возвращаются «простые» и «материализованные» представления. Pull request любезно предоставлен Себастьяном Банком.References: #3588
В качестве аргумента к
Index
добавлен параметрpostgresql_tablespace
, позволяющий указывать TABLESPACE для индекса в PostgreSQL. Дополняет одноименный параметр вTable
. Pull request любезно предоставлен Benjamin Bertrand.References: #3720
Добавлен новый параметр
GenerativeSelect.with_for_update.key_share
, который будет выводить на бэкенд PostgreSQL версиюFOR NO KEY UPDATE
вместоFOR UPDATE
иFOR KEY SHARE
вместоFOR SHARE
. Pull request любезно предоставлен Сергеем Скопиным.Добавлен новый параметр
GenerativeSelect.with_for_update.skip_locked
, который выводит фразуSKIP LOCKED
для блокировкиFOR UPDATE
илиFOR SHARE
на бэкендах PostgreSQL и Oracle. Pull request любезно предоставлен Джеком Чжоу (Jack Zhou).Добавлен новый диалект PyGreSQL для диалекта PostgreSQL. Спасибо Кристофу Цвершке и Каолину Имаго Файеру за их усилия.
Добавлена новая константа
JSON.NULL
, указывающая на то, что для значения следует использовать значение JSON NULL независимо от других настроек.См.также
References: #3514
Модуль
sqlalchemy.dialects.postgres
, давно устаревший, удален; он уже много лет выдает предупреждение, и проекты должны обращаться кsqlalchemy.dialects.postgresql
. Однако URL-адреса движков в видеpostgres://
будут продолжать работать.В версию метода
Inspector.get_view_definition()
для PostgreSQL добавлена поддержка отражения источника материализованных представлений.References: #3587
При использовании объекта
ARRAY
, ссылающегося на подтипEnum
илиENUM
, теперь будет выдаваться ожидаемый код «CREATE TYPE» и «DROP TYPE». DDL, когда тип используется внутри «CREATE TABLE» или «DROP TABLE».References: #2729
Флаг «hashable» для специальных типов данных, таких как
ARRAY
,JSON
иHSTORE
, теперь установлен в значение False, что позволяет использовать эти типы в ORM-запросах, включающих сущности в строке.См.также
Изменения, касающиеся «нехешируемых» типов, влияют на дедупликацию строк ORM
В типах ARRAY и JSON теперь корректно указывается «unhashable»
References: #3499
Тип PostgreSQL
ARRAY
теперь поддерживает многомерный индексированный доступ, например, выражения типаsomecol[5][6]
без необходимости явного приведения или принуждения к типу, при условии, что параметрARRAY.dimensions
установлен на желаемое число измерений.References: #3487
Тип возвращаемого выражения
JSON
иJSONB
при использовании индексированного доступа был исправлен таким образом, чтобы оно работало подобно самому PostgreSQL и возвращало выражение, которое само имеет типJSON
илиJSONB
. Ранее аксессор возвращалNullType
, что не позволяло использовать последующие JSON-подобные операторы.References: #3503
Типы данных
JSON
,JSONB
иHSTORE
теперь позволяют полностью контролировать возвращаемый тип операции индексированного текстового доступа, либоcolumn[someindex].astext
для типа JSON, либоcolumn[someindex]
для типа HSTORE, через параметрыJSON.astext_type
иHSTORE.text_type
.References: #3503
Модификатор
Comparator.astext
больше не обращается кColumnElement.cast()
неявно, поскольку типы JSON/JSONB в PG позволяют осуществлять перекрестное обращение друг к другу. Код, использующийColumnElement.cast()
при индексированном доступе к JSON, например,col[someindex].cast(Integer)
, должен быть изменен для явного вызоваComparator.astext
.References: #3503
mysql¶
Добавлена поддержка «autocommit» в драйверах MySQL, через настройку уровня изоляции AUTOCOMMIT. Pull request любезно предоставлен Романом Подолякой.
References: #3332
Добавлен
JSON
для MySQL 5.7. Тип JSON обеспечивает сохранение значений JSON в MySQL, а также базовую поддержку операторов «getitem» и «getpath», используя функциюJSON_EXTRACT
для обращения к отдельным путям в структуре JSON.См.также
References: #3547
Диалект MySQL больше не генерирует дополнительную директиву «KEY» при генерации DDL CREATE TABLE для таблицы, использующей InnoDB с составным первичным ключом с AUTO_INCREMENT на столбце, который не является первым столбцом; чтобы преодолеть ограничение InnoDB, ограничение PRIMARY KEY теперь генерируется со столбцом AUTO_INCREMENT, расположенным первым в списке столбцов.
См.также
Больше не нужно генерировать неявный KEY для составного первичного ключа с AUTO_INCREMENT
Директива .autoincrement больше не включается неявно для составного столбца первичного ключа
References: #3216
sqlite¶
Диалект SQLite теперь отражает фразы ON UPDATE и ON DELETE в ограничениях внешнего ключа. Pull request любезно предоставлен Михалом Петрухой.
Диалект SQLite теперь отражает имена ограничений первичного ключа. Pull request courtesy Diana Clarke.
References: #3629
Добавлена поддержка диалекта SQLite для работы метода
Inspector.get_schema_names()
с SQLite; pull request любезно предоставлен Брайаном Ван Клавереном. Также восстановлена поддержка создания индексов со схемами, а также отражения ограничений внешнего ключа в таблицах, связанных со схемами.См.также
При обнаружении версии SQLite 3.7.16 и выше отменяется обходной путь для право-вложенных объединений на SQLite, когда они переписываются в виде подзапросов, чтобы обойти отсутствие поддержки этого синтаксиса в SQLite.
См.также
Обходное решение для вложенных соединений с правой стороны отменено для SQLite версии 3.7.16
References: #3634
Обходной путь, связанный с неожиданной выдачей SQLite имен столбцов в виде
tablename.columnname
для некоторых типов запросов, теперь отключается при обнаружении SQLite версии 3.10.0 или выше.References: #3633
mssql¶
Флаг
mssql_clustered
, доступный дляUniqueConstraint
,PrimaryKeyConstraint
,Index
, теперь имеет значение по умолчаниюNone
и может быть установлен в значение False, что приведет к тому, что ключевое слово NONCLUSTERED не будет использоваться для первичного ключа, что позволит использовать другой индекс в качестве «кластеризованного». Pull request courtesy Saulius Žemaitaitis.Добавлена поддержка базового уровня изоляции для диалектов SQL Server с помощью параметров
create_engine.isolation_level
иConnection.execution_options.isolation_level
.References: #3534
Флаг
legacy_schema_aliasing
, введенный в версии 1.0.5 как часть #3424 для отключения попыток диалекта MSSQL создавать псевдонимы для таблиц с критериями схемы, теперь имеет значение False; старое поведение теперь отключено, если не включено явным образом.References: #3434
Корректировка диалекта mxODBC для использования символа
BinaryNull
в сочетании с типом данныхVARBINARY
. Pull request любезно предоставлен Sheila Allen.Исправлена проблема, при которой диалект SQL Server отражал строковый или другой тип столбца переменной длины с неограниченной длиной, присваивая атрибуту длины строки маркер
"max"
. Хотя явное использование маркера"max"
поддерживается диалектом SQL Server, оно не является частью обычного контракта базовых типов строк, и вместо этого длину следует просто оставить как None. Теперь диалект присваивает длине значение None при отражении типа, чтобы тип вел себя нормально в других контекстах.References: #3504
misc¶
В расширение Отслеживание мутаций добавлены вспомогательные классы
MutableSet
иMutableList
. Pull request любезно предоставлен Jeong YunWon.References: #3297
Документная строка, указанная для гибридного свойства или метода, теперь учитывается на уровне класса, что позволяет работать с такими инструментами, как Sphinx autodoc. При этом для гибридных свойств необходимо выполнить некоторую обертку выражений, что может привести к тому, что они будут выглядеть по-разному при использовании интроспекции.
References: #3653
Неподдерживаемый диалект Sybase теперь выдает ошибку
NotImplementedError
при попытке скомпилировать запрос, содержащий «offset»; Sybase не имеет прямой функции «offset».References: #2278