1.1 Changelog

1.1.18

Released: March 6, 2018

postgresql

  • [postgresql] [bug] [py3k]

    Исправлена ошибка в корректировке COLLATE / ARRAY в PostgreSQL, впервые представленная в #4006, когда новое поведение регулярных выражений в Python 3.7 приводило к сбою исправления.

    References: #4208

mysql

  • [mysql] [bug]

    Диалекты MySQL теперь запрашивают версию сервера, используя явный запрос SELECT @@version к серверу, чтобы убедиться, что мы получаем в ответ правильную информацию о версии. Прокси-серверы, такие как MaxScale, вмешиваются в значение, передаваемое в значение connection.server_version в DBAPI, поэтому этот способ больше не является надежным.

    References: #4205

1.1.17

Released: February 22, 2018
  • [bug] [ext]

    Исправлена регрессия, возникшая в 1.2.3 и 1.1.16 в отношении ассоциативных прокси-объектов: подход к #4185 при вычислении «принадлежащего класса» ассоциативного прокси по умолчанию выбирает текущий класс, если прокси-объект не связан напрямую с сопоставленным классом, например, с mixin’ом.

    References: #4185

1.1.16

Released: February 16, 2018

orm

  • [orm] [bug]

    Исправлена проблема в функции post_update, когда UPDATE выдавался, когда родительский объект был удален, а зависимый - нет. Эта проблема существовала уже давно, однако с тех пор, как в версии 1.2 для функции post_update стали утверждать, что строки совпадают, это приводило к ошибке.

    References: #4187

  • [orm] [bug]

    Исправлена регрессия, вызванная исправлением проблемы #4116, затрагивавшей версии 1.2.2 и 1.1.15, в результате которой в некоторых ситуациях декларативного смешивания/наследования, а также при обращении к ассоциативному прокси из не отображенного класса, «класс-владелец» AssociationProxy неправильно вычислялся как класс NoneType. Логика «выяснения владельца» была заменена на более глубокую процедуру, которая выполняет поиск по всей иерархии отображения, назначенной классу или подклассу, чтобы определить правильное (как мы надеемся) соответствие; если соответствие не найдено, то владелец не назначается. Если прокси используется против не отображенного экземпляра, то возникает исключение.

    References: #4185

  • [orm] [bug]

    Исправлена ошибка, при которой объект, удаляемый при откате вложенной или субтранзакции, в которой также был изменен первичный ключ, некорректно удалялся из сессии, что приводило к последующим проблемам при использовании сессии.

    References: #4151

sql

  • [sql] [bug]

    Добавлены nullsfirst() и nullslast() в качестве импортов верхнего уровня в пространства имен sqlalchemy. и sqlalchemy.sql.. Pull request любезно предоставлен Леле Гайфаксом.

  • [sql] [bug]

    Исправлена ошибка в Insert.values(), при которой использование формата «многозначных значений» в сочетании с объектами Column в качестве ключей, а не строк, приводило к ошибке. Pull request любезно предоставлен Обри Старк-Толером.

    References: #4162

postgresql

  • [postgresql] [bug]

    В список сообщений, запускающих сценарий «отключение», добавлено «Ошибка SSL SYSCALL: Operation timed out» в список сообщений, вызывающих сценарий «disconnect» для драйвера psycopg2. Pull request любезно предоставлен Андре Крузом (André Cruz).

  • [postgresql] [bug]

    В список ключевых слов, принимаемых диалектом PostgreSQL в качестве триггерного ключевого слова «autocommit», добавлено «TRUNCATE». Pull request любезно предоставлен Джейкобом Хейсом.

mysql

  • [mysql] [bug]

    Исправлена ошибка, при которой операторы MySQL «concat» и «match» не распространяли kwargs на левое и правое выражение, что приводило к ошибке опций компилятора, таких как «literal_binds».

    References: #4136

misc

  • [bug] [pool]

    Исправлена достаточно серьезная ошибка, связанная с тем, что соединение, полученное после обновления в результате выполнения пользовательской команды DisconnectionError или в результате использования функции «pre_ping» в версии 1.2, не сбрасывалось корректно при возврате соединения в пул в результате очистки weakref (например, при сборке мусора переднего объекта); weakref по-прежнему ссылался на ранее недействительное DBAPI-соединение, для которого ошибочно вызывалась операция сброса. Это приведет к появлению трассировки стека в журналах, а также к тому, что соединение будет занесено в пул без сброса, что может привести к проблемам с блокировкой.

    References: #4184

1.1.15

Released: November 3, 2017

orm

  • [orm] [bug] [ext]

    Исправлена ошибка, при которой прокси ассоциации непреднамеренно связывался с объектом AliasedClass, если он вызывался первым с AliasedClass в качестве родителя, что приводило к ошибкам при последующем использовании.

    References: #4116

  • [orm] [bug]

    Исправлена ошибка, при которой ORM-отношения предупреждали о конфликте целей синхронизации (например, два отношения записывали в один и тот же столбец) для классов-близнецов в иерархии наследования, в то время как на самом деле эти два отношения никогда не конфликтовали при записи.

    References: #4078

  • [orm] [bug]

    Исправлена ошибка, при которой корреляционный select, используемый в отношении сущности с наследованием в одной таблице, не отображался корректно во внешнем запросе из-за того, что настройка критериев дискриминатора одиночного наследования неправомерно повторно применяла критерии к внешнему запросу.

    References: #4103

orm declarative

  • [orm] [declarative] [bug]

    Исправлена ошибка, при которой дескриптор, находящийся в другом месте отображаемого столбца или отношения в иерархии, основанной на AbstractConcreteBase, при обновлении вызывал ошибку, так как атрибут не отображался как свойство маппера. Аналогичная проблема может возникнуть и для других атрибутов, например, для столбца «type», добавляемого AbstractConcreteBase, если класс не включит в свой маппер значение «concrete=True», однако проверка, выполненная здесь, должна предотвратить и этот сценарий.

    References: #4124

sql

  • [sql] [bug]

    Исправлена ошибка, при которой __repr__ из ColumnDefault приводило к ошибке, если аргумент был кортежем. Pull request любезно предоставлен Nicolas Caniart.

    References: #4126

  • [sql] [bug]

    Исправлена ошибка, из-за которой недавно добавленные методы ColumnOperators.any_() и ColumnOperators.all_() не работали, если их вызывать как методы, а не как самостоятельные функции any_() и all_(). Также добавлены примеры документации по этим относительно неинтуитивным операторам SQL.

    References: #4093

postgresql

  • [postgresql] [bug]

    Внесены дополнительные исправления в класс ARRAY в сочетании с COLLATE, так как исправление, сделанное в #4006, не учитывало многомерный массив.

    References: #4006

  • [postgresql] [bug]

    Исправлена ошибка в функции array_agg, когда при передаче аргумента, уже имеющего тип ARRAY, например, конструкции PostgreSQL array, возникала ошибка ValueError, связанная с тем, что функция пыталась вложить массивы.

    References: #4107

  • [postgresql] [bug]

    Исправлена ошибка в PostgreSQL Insert.on_conflict_do_update(), из-за которой оператор insert не мог быть использован в качестве CTE, например, через Insert.cte(), внутри другого оператора.

    References: #4074

mysql

  • [mysql] [bug]

    Предупреждение выдается при обнаружении MariaDB 10.2.8 или более ранних версий серии 10.2, поскольку в этих версиях имеются серьезные проблемы с ограничениями CHECK, которые были решены в версии 10.2.9.

    Обратите внимание, что данное сообщение в журнале изменений НЕ было выпущено вместе с SQLAlchemy 1.2.0b3 и было добавлено задним числом.

    References: #4097

  • [mysql] [bug]

    MySQL 5.7.20 теперь предупреждает об использовании переменной @tx_isolation; для предотвращения этого предупреждения теперь выполняется проверка версии и вместо нее используется @transaction_isolation.

    References: #4120

  • [mysql] [bug]

    Исправлена проблема, при которой CURRENT_TIMESTAMP некорректно отражалась в серии MariaDB 10.2 из-за изменения синтаксиса, где функция теперь представлена в виде current_timestamp().

    References: #4096

  • [mysql] [bug]

    MariaDB 10.2 теперь поддерживает ограничения CHECK (предупреждение: используйте версию 10.2.9 или выше из-за проблем с восходящим потоком, отмеченных в #4097). Теперь Reflection учитывает эти CHECK-ограничения, если они присутствуют в выводе SHOW CREATE TABLE.

    References: #4098

sqlite

  • [sqlite] [bug]

    Исправлена ошибка, при которой отражение ограничений SQLite CHECK приводило к ошибке, если ссылающаяся таблица находилась в удаленной схеме, например, на SQLite удаленная база данных, на которую ссылался ATTACH.

    References: #4099

mssql

  • [mssql] [bug]

    В диалект PyODBC для SQL Server добавлен полный набор кодов исключений «соединение закрыто», включая „08S01“, „01002“, „08003“, „08007“, „08S02“, „08001“, „HYT00“, „HY010“. Ранее был охвачен только „08S01“.

    References: #4095

1.1.14

Released: September 5, 2017

orm

  • [orm] [bug]

    Исправлена ошибка в Session.merge(), аналогичная ошибке в #4030, когда внутренняя проверка наличия целевого объекта в карте идентификаторов могла привести к ошибке, если он был собран в мусор непосредственно перед тем, как процедура слияния действительно получит объект.

    References: #4069

  • [orm] [bug]

    Исправлена ошибка, при которой опция undefer_group() не распознавалась, если она распространялась на отношения, загружаемые с использованием объединенной ускоренной загрузки. Кроме того, поскольку ошибка приводила к избыточной работе, количество вызовов функций Python также улучшено на 20% при первоначальном вычислении столбцов результирующего набора, что дополняет улучшения в объединенной ускоренной загрузке #3915.

    References: #4048

  • [orm] [bug]

    Исправлено состояние гонки в ORM identity map, которое приводило к неправомерному удалению объектов во время операции загрузки, что приводило к дублированию идентификаторов объектов, особенно при загрузке с ускорением, включающей дедупликацию объектов. Проблема связана со сборкой мусора для слабых ссылок и наблюдается только в интерпретаторе PyPy.

    References: #4068

  • [orm] [bug]

    Исправлена ошибка в Session.merge(), когда объекты в коллекции, у которых атрибут первичного ключа был установлен в значение None для ключа, который обычно является автоинкрементным, считались персистентным ключом базы данных для части внутреннего процесса дедупликации, в результате чего в базу данных реально вставлялся только один объект.

    References: #4056

  • [orm] [bug]

    При использовании атрибута synonym() против атрибута, который не используется против атрибута MapperProperty, например, ассоциативного прокси, возникает ошибка InvalidRequestError. Ранее при попытке найти несуществующие атрибуты происходило переполнение рекурсии.

    References: #4067

sql

  • [sql] [bug]

    Изменена спецификация диапазона для оконных функций, позволяющая использовать в диапазоне два одинаковых ключевых слова PRECEDING или FOLLOWING, причем левая часть диапазона может быть положительной, а правая - отрицательной, например, (1, 3) - это «1 FOLLOWING и 3 FOLLOWING».

    References: #4053

1.1.13

Released: August 3, 2017

oracle

  • [oracle] [bug] [performance] [py2k]

    Исправлена регрессия производительности, вызванная исправлением #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, 2017

orm

  • [orm] [bug]

    Исправлена ошибка из версии 1.1.11, при которой добавление дополнительных колонок, не относящихся к сущности, в запрос, включающий сущность с отношениями subqueryload, приводило к неудаче из-за проверки, добавленной в версии 1.1.11 в результате использования #4011.

    References: #4033

  • [orm] [bug]

    Исправлена ошибка, связанная с логикой оценки JSON NULL, добавленной в 1.1 как часть #3514, когда логика не учитывала ORM-маппинг атрибутов, названных не так, как в Column, который был маппингом.

    References: #4031

  • [orm] [bug]

    Добавлены проверки KeyError во все методы внутри WeakInstanceDict, где проверка на key in dict сопровождается индексированным доступом к этому ключу, для защиты от гонки со сборкой мусора, которая под нагрузкой может удалить ключ из диктанта после того, как код предположит его наличие, что приведет к очень редким появлениям KeyError.

    References: #4030

oracle

  • [oracle] [feature] [postgresql]

    В Sequence добавлены новые ключевые слова Sequence.cache и Sequence.order, позволяющие выводить параметр CACHE, понимаемый Oracle и PostgreSQL, и параметр ORDER, понимаемый Oracle. Pull request любезно предоставлен Дэвидом Муром.

tests

  • [tests] [bug] [py3k]

    Исправлена проблема в тестировании фикстур, которая была несовместима с изменением, внесенным в Python 3.6.2 в отношении менеджеров контекста.

    This change is also backported to: 1.0.18

    References: #4034

1.1.11

Released: Monday, June 19, 2017

orm

  • [orm] [bug]

    Исправлена проблема с ускоренной загрузкой подзапросов, которая продолжает серию проблем, исправленных в #2699, #3106, #3893, связанных с тем, что «подзапрос» содержит правильное предложение FROM, когда начинается с объединенного подкласса наследования и затем выполняется ускоренная загрузка подзапроса на отношение из базового класса, при этом запрос также включает критерии против подкласса. Исправление, описанное в предыдущих тикетах, не учитывало дополнительных операций загрузки подзапросов, загружающих более глубокие отношения с первого уровня, поэтому исправление было дополнительно обобщено.

    References: #4011

sql

  • [sql] [bug]

    Исправлена ошибка AttributeError, возникавшая в конструкции WithinGroup при итерации структуры.

    References: #4012

postgresql

  • [postgresql] [bug]

    В продолжение исправления, корректно обрабатывающего строку версии PostgreSQL «10devel», выпущенного в 1.1.8, добавлена дополнительная ошибка regexp для обработки строк версий вида «10beta1». Хотя в настоящее время PostgreSQL предлагает более эффективные способы получения этой информации, мы придерживаемся regexp, по крайней мере, до версии 1.1.x для наименьшего риска совместимости со старыми или альтернативными базами данных PostgreSQL.

    References: #4005

  • [postgresql] [bug]

    Исправлена ошибка, при которой использование ARRAY со строковым типом, имеющим collation, не приводило к корректному синтаксису в CREATE TABLE.

    References: #4006

mysql

  • [mysql] [bug]

    В MySQL 5.7 введено ограничение прав доступа для команды «SHOW VARIABLES»; теперь диалект MySQL будет обрабатывать случаи, когда SHOW не возвращает ни одной строки, в частности, при начальном получении SQL_MODE, и выдавать предупреждение о необходимости изменения прав доступа пользователя для того, чтобы строка могла присутствовать.

    References: #4007

mssql

  • [mssql] [bug]

    Исправлена ошибка, когда при использовании хранилища данных Azure необходимо было получить данные об изолированности транзакций SQL Server из другого представления. Теперь запрос выполняется к обоим представлениям, а в случае неудачи безусловно выдается сообщение NotImplemented, что обеспечивает наилучшую устойчивость к будущим произвольным изменениям API в новых версиях SQL Server.

    References: #3994

  • [mssql] [bug]

    В диалект SQL Server добавлен тип-заполнитель XML, благодаря чему отраженная таблица, содержащая этот тип, может быть пересчитана как CREATE TABLE. Тип не имеет специального поведения при обходе и не поддерживает дополнительных уточняющих аргументов.

    References: #3973

oracle

  • [oracle] [bug]

    Поддержка двухфазных транзакций полностью удалена из cx_Oracle при использовании DBAPI версии 6.0b1 или более поздней. Исторически сложилось так, что в cx_Oracle 5.x двухфазные транзакции никогда не использовались, а в cx_Oracle 6.x был удален флаг «twophase» на уровне соединения, от которого зависела эта возможность.

    References: #3997

1.1.10

Released: Friday, May 19, 2017

orm

  • [orm] [bug]

    Исправлена ошибка, при которой каскад типа «delete-orphan» (впрочем, как и другие) не находил объект, связанный с отношением, которое само является локальным для подкласса в отношениях наследования, в результате чего операция не выполнялась.

    References: #3986

schema

  • [schema] [bug]

    Теперь при создании объекта ForeignKeyConstraint с несоответствующим количеством «локальных» и «удаленных» столбцов выдается сообщение ArgumentError, что в противном случае приводит к некорректному внутреннему состоянию ограничения. Обратите внимание, что это также влияет на ситуацию, когда в процессе рефлексии диалекта создается несовпадающий набор столбцов для ограничения внешнего ключа.

    References: #3949

postgresql

  • [postgresql] [bug]

    Добавлена поддержка «autocommit» для ключевых слов GRANT, REVOKE. Pull request любезно предоставлен Джейкобом Хейсом.

mysql

  • [mysql] [bug]

    Удален древний и ненужный перехват MySQL-функции UTC_TIMESTAMP, который мешал использовать ее с параметром.

    References: #3966

  • [mysql] [bug]

    Исправлена ошибка в диалекте MySQL, связанная с отображением параметров таблицы в сочетании с параметрами PARTITION при создании CREATE TABLE. Опции, связанные с PARTITION, должны следовать за опциями таблицы, тогда как ранее такой порядок не соблюдался.

    References: #3961

oracle

  • [oracle] [bug]

    Исправлена ошибка в диалекте cx_Oracle, при которой разбор строки версии для cx_Oracle версии 6.0b1 не выполнялся из-за наличия символа «b». Разбор строки версии теперь выполняется с помощью regexp, а не простого разбиения.

    References: #3975

misc

  • [bug] [ext]

    Защита от проверки «None» в качестве класса в случае, когда происходит сборка мусора декларативных классов и параллельно выполняются новые операции automap prepare(), что очень редко приводит к попаданию в weakref, который не был полностью отработан после gc.

    References: #3980

1.1.9

Released: April 4, 2017

sql

  • [sql] [bug]

    Исправлена регрессия, появившаяся в 1.1.5 из-за #3859, когда корректировка оценки «правой стороны» выражения, основанного на Variant, с учетом правил «правой стороны» базового типа приводила к неуместной потере типа Variant в тех случаях, когда мы хотим, чтобы тип левой стороны был передан непосредственно в правую часть, чтобы к аргументу выражения могли быть применены правила уровня связывания.

    References: #3952

  • [sql] [bug] [postgresql]

    Изменена механика работы ResultProxy для безусловной задержки шага «autoclose» до тех пор, пока Connection не закончит работу с объектом; в случае, когда PostgreSQL ON CONFLICT с RETURNING возвращает отсутствие строк, autoclose происходил в этом ранее не существовавшем случае использования, что приводило к сбою обычного поведения autocommit, которое происходит безусловно при INSERT/UPDATE/DELETE.

    References: #3955

misc

  • [bug] [ext]

    Исправлена регрессия, появившаяся в версии 1.1.8 из-за #3950, когда углубленный поиск информации о типах столбцов в случае «типа схемы» или TypeDecorator приводил к ошибке атрибута, если отображение также содержало column_property.

    References: #3956

1.1.8

Released: March 31, 2017

postgresql

  • [postgresql] [bug]

    Добавлена поддержка разбора строки версии PostgreSQL для версии разработки типа «PostgreSQL 10devel». Pull request любезно предоставлен Шоном Маккалли.

misc

  • [bug] [ext]

    Исправлена ошибка в sqlalchemy.ext.mutable, когда метод Mutable.as_mutable() не отслеживал тип, который был скопирован с помощью TypeEngine.copy(). В 1.1 по сравнению с 1.0 это стало более серьезной проблемой, поскольку класс TypeDecorator теперь является подклассом SchemaEventTarget, что, помимо прочего, указывает родительскому Column, что тип должен быть скопирован при Column. Такие копии часто встречаются при использовании декларативных с миксинами или абстрактными классами.

    References: #3950

  • [bug] [ext]

    В метод Result.count() добавлена поддержка связанных параметров, например, тех, которые обычно задаются через Query.params(). Ранее поддержка параметров была опущена. Pull request любезно предоставлен Pat Deegan.

1.1.7

Released: March 27, 2017

orm

  • [orm] [feature]

    Теперь методу Query.select_entity_from() можно передать конструкцию aliased(). Сущности будут извлечены из выборки, представленной конструкцией aliased(). Это позволяет использовать специальные опции для aliased(), такие как aliased.adapt_on_names, в сочетании с Query.select_entity_from().

    References: #3933

  • [orm] [bug]

    Исправлено состояние гонки, которое могло возникнуть в многопоточном окружении в результате добавления кэширования через #3915. Внутренняя коллекция объектов Column могла неадекватно регенерироваться на объекте-псевдониме, что приводило к ошибке атрибутов и запутывало подключенный загрузчик, когда он пытался вывести SQL и собрать результаты. Теперь коллекция генерируется заранее, до того как объект псевдонима кэшируется и разделяется между потоками.

    References: #3947

engine

  • [engine] [bug]

    Добавлен обработчик исключений, который будет предупреждать об исключении «cause» в Py2K, когда функция «autorollback» в Connection сама вызывает исключение. В Py3K эти два исключения естественно сообщаются интерпретатором как одно, возникшее во время обработки другого. Это продолжение серии изменений для обработки откатов, которые в последний раз были внесены в #2696 в версии 1.0.12.

    References: #3946

sql

  • [sql] [bug] [postgresql]

    Добавлена поддержка совместимости объектов Variant и SchemaType. То есть, можно создать вариант с типом Enum, и инструкции по созданию ограничений и/или объектов типа, специфичных для базы данных, будут корректно распространяться в соответствии с диалектным отображением варианта.

    References: #2892

  • [sql] [bug]

    Исправлена ошибка в компиляторе, когда строковый идентификатор точки сохранения кэшировался в словаре котировок идентификаторов; поскольку эти идентификаторы произвольны, то при использовании неограниченного числа точек сохранения в одном Connection, а также при непосредственном использовании конструкции savepoint clause с неограниченным числом имен точек сохранения могла происходить небольшая утечка памяти. Утечка памяти не влияет на подавляющее большинство случаев, так как обычно Connection, который выводит имена точек сохранения с помощью простого счетчика, начинающегося с «1», используется для каждой транзакции или для фиксированного количества транзакций перед тем, как быть отброшенным.

    References: #3931

  • [sql] [bug]

    Исправлена ошибка в новой функции «перевод схемы», когда при выводе вместе с выражением столбца транслированное имя схемы обращалось к имени псевдонима; это происходило только в том случае, если исходное имя трансляции имело значение «None». Функция «перевод схемы» теперь действует только для подклассов SchemaItem и SchemaType, то есть объектов, соответствующих DDL-создаваемой структуре в базе данных.

    References: #3924

oracle

  • [oracle] [bug]

    Исправление режима 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, 2017

orm

  • [orm] [bug]

    Устранены некоторые давно не замечаемые проблемы с производительностью системы построения запросов объединенного eager loader, накопившиеся с предыдущих версий в результате повышения уровня абстракции. Использование специальных AliasedClass объектов для каждого запроса, которое каждый раз приводило к большим затратам на поиск столбцов, было заменено на кэшированный подход, использующий небольшой пул AliasedClass объектов, который повторно используется между вызовами объединенной ускоренной загрузки. Также были оптимизированы некоторые механизмы, связанные с построением путей соединения. Количество вызовов для теста «сквозное построение запроса + выборка одной строки» при наихудшем сценарии работы объединенного загрузчика сократилось примерно на 60% по сравнению с версией 1.1.5 и на 42% по сравнению с версией 0.8.6.

    References: #3915

  • [orm] [bug]

    Исправлена серьезная неэффективность функции «eager_defaults», когда для значений столбцов, в которые ORM явно вставлял NULL, выдавался ненужный SELECT, соответствующий атрибутам, которые были не заданы в объекте, но не имели серверного значения по умолчанию, а также атрибутам с истекшим сроком обновления, для которых, тем не менее, не было задано серверное значение onupdate. Поскольку эти столбцы не являются частью RETURNING, который пытается использовать eager_defaults, они также не должны быть post-SELECTed.

    References: #3909

  • [orm] [bug]

    Исправлены две тесно связанные ошибки, связанные с флагом mapper eager_defaults в сочетании с наследованием одной таблицы; в одной из них логика eager defaults непреднамеренно пыталась получить доступ к столбцу, входящему в список «exclude_properties» маппера (используемый Declarative при наследовании одной таблицы) во время eager defaults fetch, а в другой - при полной загрузке строки для получения defaults не использовался правильный наследующий маппер.

    References: #3908

  • [orm] [bug]

    Исправлена ошибка, впервые появившаяся в 0.9.7 в результате применения #3106, которая приводила к некорректному запросу в некоторых формах многоуровневой загрузки подзапросов к aliased entities, при этом во внутреннем подзапросе появлялась ненужная дополнительная сущность FROM.

    References: #3893

orm declarative

  • [orm] [declarative] [bug]

    Исправлена ошибка, при которой функция «автоматического исключения» в declarative, гарантирующая, что столбец, локальный для одного подкласса наследования таблицы, не появится в качестве атрибута в других производных от базы, не действовала для нескольких уровней подклассификации от базы.

    References: #3895

sql

  • [sql] [bug]

    Исправлена ошибка, из-за которой событие DDLEvents.column_reflect() не позволяло передавать нетекстовое выражение в качестве значения «по умолчанию» для нового столбца, например, объект FetchedValue для указания общего срабатывания по умолчанию или конструкцию text(). В связи с этим также уточнена документация.

    References: #3905

postgresql

  • [postgresql] [bug]

    Добавлены регулярные выражения для операторов PostgreSQL «IMPORT FOREIGN SCHEMA», «REFRESH MATERIALIZED VIEW», чтобы они автокоммитировались при вызове через соединение или движок без явной транзакции. Pull requests любезно предоставлены Frazer McLean и Paweł Stiasny.

    References: #3804

  • [postgresql] [bug]

    Исправлена ошибка в PostgreSQL ExcludeConstraint, когда параметры «whereclause» и «using» не копировались при выполнении операции типа Table.tometadata().

    References: #3900

mysql

  • [mysql] [bug]

    Добавлены новые зарезервированные слова MySQL 8.0 в диалект MySQL для правильного цитирования. Pull request любезно предоставлен Ханно Шлихтингом (Hanno Schlichting).

mssql

  • [mssql] [bug]

    В функцию «get_isolation_level», которая вызывается при первом подключении, добавлена проверка версии, чтобы она пропускала SQL Server версии 2000, так как до SQL Server 2005 необходимое системное представление недоступно.

    References: #3898

misc

  • [feature] [ext]

    В систему «печеных» запросов добавлены Result.scalar() и Result.count().

    References: #3896

  • [bug] [ext]

    Исправлена ошибка в новом расширении sqlalchemy.ext.indexable, когда установка свойства, которое само ссылается на другое свойство, приводила к ошибке.

    References: #3901

1.1.5

Released: January 17, 2017

orm

  • [orm] [bug]

    Исправлена ошибка, связанная с объединенной ускоренной загрузкой для нескольких сущностей при использовании полиморфного наследования, которая приводила к ошибке «„NoneType“ object has no attribute „isa“». Проблема была вызвана исправлением для #3611.

    This change is also backported to: 1.0.17

    References: #3884

  • [orm] [bug]

    Исправлена ошибка в загрузке подзапросов, когда объект, встреченный как «существующая» строка, например, уже загруженный из другого пути в том же запросе, не вызывал загрузчиков подзапросов для выгруженных атрибутов, которые указывали на эту загрузку. Эта проблема находится в той же области, что и проблемы #3431, #3811, которые были связаны с аналогичными проблемами с объединенной загрузкой.

    References: #3854

  • [orm] [bug]

    Менеджер контекста Session.no_autoflush теперь гарантирует, что флаг autoflush сбрасывается внутри блока «finally», так что если в блоке возникнет исключение, состояние все равно сбросится соответствующим образом. Pull request любезно предоставлен Эмином Аракеляном.

  • [orm] [bug]

    Исправлена ошибка, при которой критерии запроса наследования одной таблицы не вставлялись в запрос в том случае, если в качестве критериев отбора использовалась конструкция Bundle.

    References: #3874

  • [orm] [bug]

    Исправлена ошибка, связанная с #3177, когда при выполнении операции UNION или другой операции set, вызванной для Query, применялся критерий «единого наследования» к внешней части объединения (также ссылался на неправильный selectable), хотя теперь предполагается, что этот критерий уже присутствует во внутренних подзапросах. Теперь критерий единственного наследования опускается после вызова union() или другой операции set для Query таким же образом, как и для Query.from_self().

    References: #3856

examples

  • [examples] [bug]

    Исправлены две проблемы в примере versioned_history, одна из которых заключается в том, что таблица history теперь имеет autoincrement=False, чтобы избежать новых ошибок 1.1 относительно составных первичных ключей с autoincrement; другая - в том, что флаг sqlite_autoincrement теперь используется для обеспечения на SQLite использования уникальных идентификаторов в течение всего срока жизни таблицы, даже если некоторые строки удалены. Pull request любезно предоставлен Карлосом Гарсией Монторо.

    References: #3872

engine

  • [engine] [bug]

    Параметр «extend_existing» при отражении Table приводил к удвоению индексов и ограничений в случае использования параметра с MetaData.reflect() (как это делает расширение automap) из-за того, что таблицы отражались как в пути внешнего ключа, так и напрямую. Для предотвращения такого двойного отражения в последовательности MetaData.reflect() передается новый дедублирующий набор.

    References: #3861

sql

  • [sql] [bug]

    Исправлена ошибка, первоначально появившаяся в 0.9 через #1068, когда order_by(<some Label()>) упорядочивал по имени метки, основываясь только на имени, т.е. даже если помеченное выражение вовсе не было тем же выражением, которое присутствует в selectable в явном или неявном виде. Логика упорядочивания по метке теперь гарантирует, что помеченное выражение связано с тем, которое разрешается в это имя, прежде чем упорядочивать по имени метки; кроме того, это имя должно разрешаться в фактическую метку, явно присутствующую в выражении в другом месте, а не просто в имя столбца. Эта логика тщательно отделена от функции order by(textual name), которая имеет несколько иное назначение.

    References: #3882

  • [sql] [bug]

    Исправлена регрессия 1.1, когда «import *» не работал для sqlalchemy.sql.expression, из-за неправильного написания функций any_ и all_.

    References: #3878

  • [sql] [bug]

    URL движка, встроенный в исключение «не удалось отразить» в MetaData.reflect(), теперь скрывает пароль; также __repr__ для TLEngine теперь действует аналогично Engine, скрывая пароль URL. Pull request любезно предоставлен Валерием Юндиным.

  • [sql] [bug]

    Исправлена проблема в Variant, когда логика «принуждения правой руки», унаследованная от TypeDecorator, принуждала правую часть к самому Variant, а не к типу по умолчанию для Variant. В случае Variant мы хотим, чтобы тип действовал в основном как базовый тип, поэтому логика по умолчанию для TypeDecorator теперь переопределяется, чтобы вернуться к логике базового обернутого типа. В настоящее время это актуально в основном для JSON.

    References: #3859

  • [sql] [bg]

    Исправлена ошибка, при которой флаг компилятора literal_binds не соблюдался конструкцией Insert для функции «несколько значений»; теперь последующие значения отображаются как литералы.

    References: #3880

postgresql

  • [postgresql] [bug]

    Исправлена ошибка в новой функции «ON CONFLICT DO UPDATE», когда значения «set» для предложения UPDATE не подвергались обработке на уровне типов, как это обычно происходит для обработки как пользовательских преобразований на уровне типов, так и преобразований, требуемых диалектом, например, для типов данных JSON. Кроме того, уточнено, что ключи в словаре set_ должны соответствовать «ключу» столбца, если он отличается от имени столбца. Для оставшихся имен колонок, не совпадающих с ключами колонок, выдается предупреждение; в целях совместимости оно выдается в прежнем виде.

    References: #3888

  • [postgresql] [bug]

    Типы данных TIME и TIMESTAMP теперь поддерживают установку нуля для параметра «точность»; ранее ноль игнорировался. Pull request любезно предоставлен Ionuț Ciocîrlan.

mysql

  • [mysql] [feature]

    Добавлен новый параметр mysql_prefix, поддерживаемый конструкцией Index, позволяющий указывать специфические для MySQL префиксы, такие как «FULLTEXT». Pull request любезно предоставлен Джозефом Шорром.

  • [mysql] [bug]

    Диалект MySQL теперь не предупреждает, когда отражаемый столбец имеет ключевое слово «COMMENT», но отмечает, что комментарий еще не отражен; это включено в дорожную карту будущего выпуска. Pull request любезно предоставлен Lele Long.

    References: #3867

mssql

  • [mssql] [bug]

    Исправлена ошибка, при которой диалекты SQL Server пытались выбрать идентификатор последней строки для INSERT из SELECT, что при отсутствии строк в SELECT приводило к неудаче. Для такого оператора флаг inline устанавливается в True, указывая, что последний первичный ключ не должен быть получен.

    References: #3876

oracle

  • [oracle] [bug] [postgresql]

    Исправлена ошибка, при которой INSERT из SELECT, где исходная таблица содержит автоинкрементную последовательность, не компилировался корректно.

    References: #3877

  • [oracle] [bug]

    Исправлена ошибка, когда в запросе ALL_TABLES на Oracle 9.2 использовалось ключевое слово «COMPRESSION»; хотя в документации Oracle указано, что сжатие таблиц было введено в 9i, реальный столбец появился только в 10.1.

    References: #3875

misc

  • [bug] [py3k]

    Исправлено DeprecationWarnings для Python 3.6, связанное с экранированными строками без модификатора „r“, а также добавлено тестовое покрытие для Python 3.6.

    This change is also backported to: 1.0.17

    References: #3886

  • [bug] [firebird]

    В Firebird перенесено исправление для имен Oracle, заключенных в кавычки в нижнем регистре, чтобы имя таблицы, заключенное в кавычки в нижнем регистре, отражалось корректно, в том числе и когда имя таблицы поступает из функции проверки get_table_names().

    References: #3548

1.1.4

Released: November 15, 2016

orm

  • [orm] [bug]

    Исправлена ошибка в Session.bulk_update_mappings(), когда атрибут первичного ключа с альтернативным именем не отслеживался должным образом в операторе UPDATE.

    This change is also backported to: 1.0.16

    References: #3849

  • [orm] [bug]

    Исправлена ошибка в Session.bulk_save(), при которой UPDATE некорректно работал в связке с отображением, реализующим счетчик идентификаторов версий.

    This change is also backported to: 1.0.16

    References: #3781

  • [orm] [bug]

    Исправлена ошибка, из-за которой аксессоры Mapper.attrs, Mapper.all_orm_descriptors и другие производные атрибуты не обновлялись, если свойства mapper или другие ORM-конструкции были добавлены к mapper/классу после первого вызова этих аксессоров.

    This change is also backported to: 1.0.16

    References: #3778

  • [orm] [bug]

    Исправлена ошибка в коллекциях, связанная с #3457, в результате которой при десериализации во время pickle или deepcopy не устанавливались все атрибуты ORM-коллекции, что приводило к неудаче дальнейших операций мутации.

    References: #3852

  • [orm] [bug]

    Исправлена давняя ошибка, при которой стратегия загрузки отношений «noload» приводила к игнорированию опций backrefs и/или back_populates.

    References: #3845

engine

  • [engine] [bug]

    Удален давно устаревший метод «default_schema_name()» из Connection. Этот метод остался от очень старой версии и был нерабочим (например, вызывал ошибку). Pull request любезно предоставлен Benjamin Dopplinger.

sql

  • [sql] [bug]

    Исправлена ошибка, при которой вновь добавленное предупреждение о первичном ключе при вставке без установки автоинкремента (см. #3216) не выдавалось корректно при вызове конструкции table() в нижнем регистре.

    References: #3842

postgresql

  • [postgresql] [bug]

    Исправлена регрессия, вызванная исправлением в #3807 (версия 1.1.0), где мы обеспечивали квалификацию имени таблицы в предложении WHERE части DO UPDATE в ON CONFLICT PostgreSQL, однако вы не можете поместить имя таблицы в предложении WHERE в самом ON CONFLICT. Это было неверное предположение, поэтому эта часть изменения в #3807 отменена.

    References: #3807, #3846

mysql

  • [mysql] [feature]

    В диалекты mysqlclient и pymysql добавлена поддержка курсоров на стороне сервера. Эта возможность доступна как через флаг Connection.execution_options.stream_results, так и через аргумент диалекта server_side_cursors=True, аналогично тому, как это было сделано для psycopg2 на PostgreSQL. Pull request любезно предоставлен Романом Подолякой.

  • [mysql] [bug]

    Собственный тип ENUM в MySQL поддерживает отправку любого недействительного значения, а в ответ возвращает пустую строку. В реализацию MySQL для ENUM было добавлено жестко закодированное правило проверки на «возврат пустой строки», чтобы эта пустая строка возвращалась приложению, а не отвергалась как недействительное значение. Обратите внимание, что если перечисление MySQL связывает значения с объектами, то вы все равно получите обратно пустую строку.

    References: #3841

sqlite

  • [sqlite] [bug]

    Добавлены кавычки в директивы PRAGMA в диалекте pysqlcipher для корректной поддержки дополнительных аргументов шифра. Pull request любезно предоставлен Кевином Юрчиком (Kevin Jurczyk).

  • [sqlite] [bug] [py3k]

    Добавлен дополнительный импорт для pysqlcipher3 DBAPI при использовании диалекта pysqlcipher. Этот пакет будет пытаться быть импортированным, если не присутствует только Python-2 pysqlcipher DBAPI. Pull request любезно предоставлен Кевином Юрчиком (Kevin Jurczyk).

mssql

  • [mssql] [bug]

    Исправлена ошибка в диалекте pyodbc (а также в основном нерабочем диалекте adodbapi), когда точка с запятой в полях password или username могла быть интерпретирована как разделитель для другого токена; теперь при наличии точки с запятой значения берутся в кавычки.

    This change is also backported to: 1.0.16

    References: #3762

1.1.3

Released: October 27, 2016

orm

  • [orm] [bug]

    Исправлена регрессия, вызванная #2677, при которой вызов Session.delete() на объекте, который уже был сброшен как удаленный в этой сессии, не приводил к установке объекта в карту идентификации (или к отказу от объекта), что приводило к ошибкам при сбросе, поскольку объект находился в состоянии, не учитываемом единицей работы. В этом случае восстановлено поведение, существовавшее до версии 1.1: объект помещается обратно в карту идентификации, чтобы снова попытаться выполнить оператор DELETE, который выдает предупреждение о том, что количество ожидаемых строк не было найдено (если только строка не была восстановлена вне сессии).

    References: #3839

  • [orm] [bug]

    Исправлена ошибка, при которой некоторые методы Query, такие как Query.update() и другие, давали сбой, если Query относился к ряду отображаемых столбцов, а не к отображаемой сущности в целом.

    References: #3836

sql

  • [sql] [bug]

    Исправлена ошибка, связанная с новой функцией трансляции и проверки значений в Enum, когда при использовании объекта enum в конкатенации строк тип Enum сохранялся в качестве типа выражения в целом, что приводило к отсутствию поиска. Теперь при конкатенации строки с колонкой, имеющей тип Enum, в качестве типа данных самого выражения используется String.

    References: #3833

  • [sql] [bug]

    Исправлена регрессия, возникавшая как побочный эффект #2919, из-за которой в менее типичном случае пользовательского TypeDecorator, который сам являлся экземпляром SchemaType (а не реализацией такового), события прикрепления столбцов пропускались для самого типа.

    References: #3832

postgresql

  • [postgresql] [bug]

    При отражении столбца первичного ключа, не имеющего типа данных Integer, даже если он по умолчанию относится к последовательности, порождающей целое число, в таблице PostgreSQL флаг Column.autoincrement будет установлен в значение False. Это может произойти, если столбец был создан как SERIAL и тип данных был изменен. Флаг автоинкремента может быть True только в том случае, если тип данных имеет целочисленную принадлежность в серии 1.1.

    References: #3835

1.1.2

Released: October 17, 2016

orm

  • [orm] [bug]

    Исправлена ошибка, связанная с правилом отключения объединенного загрузчика коллекций на другой стороне ленивого загрузчика «многие к одному», впервые добавленного в #1495, когда правило не выполнялось, если с родительским объектом были связаны другие опции запроса, связанные с ленивым загрузчиком.

    References: #3824

  • [orm] [bug]

    Исправлена проблема самореферентной сущности, отложенной загрузки столбцов в стиле #3431, #3811, когда сущность присутствует в нескольких позициях в строке из-за самореферентной ускоренной загрузки; когда отложенный загрузчик применяется только к одному из путей, «настоящий» загрузчик столбцов теперь будет переопределять отложенную не-загрузку для этой сущности независимо от порядка строк.

    References: #3822

sql

  • [sql] [bug]

    Исправлена регрессия, вызванная добавлением функции, выполняющей функцию «обернуть вызываемый объект» для объектов sql DefaultGenerator, при этом возникала ошибка атрибута __module__, когда вызываемым по умолчанию являлся объект functools.partial или другой объект, не имеющий атрибута __module__.

    References: #3823

  • [sql] [bug] [postgresql]

    Исправлена регрессия в типе Enum, при которой обработчики событий не передавались в случае копирования объекта типа из-за противоречивого метода copy(), добавленного в составе #3250. Такое копирование происходит обычно в ситуациях, когда копируется столбец, например, в tometadata() или при использовании декларативных миксинов с столбцами. Отсутствие обработчика события повлияет на создание ограничений для неродного перечисляемого типа, но в большей степени на объект ENUM на бэкенде PostgreSQL.

    References: #3827

postgresql

  • [postgresql] [bug] [sql]

    Изменено соглашение об именовании, используемое при генерации связанных параметров для оператора вставки с несколькими VALUES, чтобы пронумерованные имена параметров не конфликтовали с анонимизированными параметрами предложения WHERE, как это сейчас принято в конструкции PostgreSQL ON CONFLICT.

    References: #3828

1.1.1

Released: October 7, 2016

mssql

  • [mssql] [bug]

    Запрос «SELECT SERVERPROPERTY», добавленный в #3810 и #3814, терпит неудачу на неизвестных комбинациях Pyodbc и SQL Server. Отказ этой функции был ожидаем, но перехват исключений был недостаточно широк, поэтому теперь он перехватывает все формы pyodbc.Error.

    References: #3820

misc

1.1.0

Released: October 5, 2016

orm

  • [orm] [feature]

    Новая стратегия ленивого загрузчика «raise» дополнена вариантом «raise_on_sql», доступным как через relationship.lazy, так и через raiseload(). В этом варианте повышение происходит только в том случае, если при ленивой загрузке действительно будет выдан SQL, а не в том случае, если механизм ленивого загрузчика вообще будет вызван.

    References: #3812

  • [orm] [feature]

    Метод Query.group_by() теперь сбрасывает группу по коллекции, если передан аргумент None, аналогично тому, как долгое время работал Query.order_by(). Pull request любезно предоставлен Iuri Diniz.

  • [orm] [change]

    Передача False в Query.order_by() для отмены всех заказов by устарела; теперь нет никакой разницы между вызовом этого метода с False или с None.

  • [orm] [bug]

    Исправлена ошибка, при которой объединенная ускоренная загрузка приводила к ошибке для полиморфно загруженного отображателя, когда параметр polymorphic_on был установлен на не отображенное выражение, например, на CASE-выражение.

    This change is also backported to: 1.0.16

    References: #3800

  • [orm] [bug]

    Исправлена ошибка, при которой некорректно вызывалась ошибка ArgumentError, связанная с некорректной привязкой, переданной в сессию через Session.bind_mapper(), Session.bind_table() или конструктор.

    This change is also backported to: 1.0.16

    References: #3798

  • [orm] [bug]

    Исправлена ошибка в подзапросе eager loading, когда подзапрос с объектом «of_type()», связанный со вторым подзапросом с обычным mapped-классом или более длинной цепочкой из нескольких атрибутов «of_type()», не мог корректно связать соединения.

    This change is also backported to: 1.0.15

    References: #3773, #3774

  • [orm] [bug]

    Атрибуты ORM теперь могут быть присвоены любому объекту, имеющему атрибут __clause_element__(), что приведет к инлайн SQL, как это делает любой класс ClauseElement. Это распространяется и на другие отображаемые атрибуты, не преобразуемые другими конструкциями выражений.

    References: #3802

  • [orm] [bug]

    Внесена корректировка в исправление ошибки, впервые представленной в [ticket:3431], связанной с появлением объекта в нескольких контекстах в одном наборе результатов, в результате которой загрузчик, устанавливающий для связанного объекта значение None, все равно сработает, удовлетворив загрузку этого атрибута. Ранее корректировка учитывала только значения не-None, поступающие для атрибута, загруженного с нетерпением, во вторичной строке.

    References: #3811

  • [orm] [bug]

    Исправлена ошибка в событии new SessionEvents.persistent_to_deleted(), когда целевой объект мог быть собран в мусор до срабатывания события.

    References: #3808

  • [orm] [bug]

    Первичное соединение конструкции relationship() теперь может включать объект bindparam(), содержащий вызываемую функцию для генерации значений. Ранее стратегия ленивого загрузчика была несовместима с таким использованием и, кроме того, не могла корректно определить, следует ли использовать критерий «use_get», если первичный ключ был задействован в связанном параметре.

    References: #3767

  • [orm] [bug]

    Теперь UPDATE, выдаваемый ORM-процессом flush, может содержать элемент SQL-выражения для столбца первичного ключа объекта, если целевая база данных поддерживает RETURNING для предоставления нового значения, или если значение PK устанавливается «само на себя» для целей переключения другого триггера / onupdate на столбец.

    References: #3801

  • [orm] [bug]

    Исправлена ошибка, при которой условие «simple many-to-one», позволяющее при ленивой загрузке использовать get() из identity map, не срабатывало, если в primaryjoin отношения было несколько клаузул, разделенных символом AND, которые не совпадали по порядку с колонками первичного ключа, сравниваемыми в каждой клаузуле. Такая разница в упорядочивании возникает для составного внешнего ключа, когда столбцы, связанные с таблицей на ссылающейся стороне, располагались в коллекции .c не в том же порядке, что и столбцы первичного ключа на ссылающейся стороне…., что, в свою очередь, часто встречается при использовании декларативных миксинов и/или declared_attr для задания столбцов.

    References: #3788

  • [orm] [bug]

    Исключение возникает, если два декоратора @validates на отображении используют одно и то же имя. Одновременно поддерживается только один валидатор с определенным именем, механизм объединения их в цепочку отсутствует, так как порядок валидаторов на уровне декоратора функции не может быть детерминированным.

    References: #3776

  • [orm] [bug]

    Ошибки мапперов, возникающие при configure_mappers(), теперь явно включают имя исходного маппера в сообщение об исключении, чтобы помочь в тех ситуациях, когда обернутое исключение само не включает исходный маппер. Pull request любезно предоставлен Джоном Перкинсом.

orm declarative

  • [orm] [declarative] [change]

    При создании декларативного базового класса, который наследуется от другого класса, будет наследоваться и его docstring. Это означает, что as_declarative() действует скорее как обычный декоратор класса.

sql

  • [sql] [bug]

    Исправлена ошибка в Table, когда внутренний метод _reset_exported() приводил к повреждению состояния объекта. Этот метод предназначен для выбираемых объектов и в некоторых случаях вызывается ORM; ошибочная конфигурация маппера могла привести к тому, что ORM вызывал этот метод на объекте Table.

    This change is also backported to: 1.0.15

    References: #3755

  • [sql] [bug]

    Опции выполнения теперь могут распространяться из оператора во время компиляции во внешний оператор, так что если встроенный элемент хочет, например, установить значение «autocommit» равным True, он может распространить это на окружающий оператор. В настоящее время эта возможность включена для DML-ориентированных CTE, встроенных внутрь оператора SELECT, например, INSERT/UPDATE/DELETE внутри SELECT.

    References: #3805

  • [sql] [bug]

    Строка, передаваемая в качестве значения столбца по умолчанию через параметр Column.server_default, теперь экранируется для кавычек.

    References: #3809

  • [sql] [bug] [postgresql]

    Добавлены флаги уровня компилятора, используемые PostgreSQL для размещения дополнительных скобок, чем обычно генерируется правилами старшинства, вокруг операций с JSON, операторов индексирования HSTORE, а также внутри их операндов, поскольку было замечено, что правила старшинства PostgreSQL, по крайней мере, для оператора индексирования HSTORE не согласуются между 9.4 и 9.5.

    References: #3806

  • [sql] [bug] [mysql]

    Класс исключений BaseException теперь перехватывается процедурами обработки исключений Connection и включает обработку событием ConnectionEvents.handle_error(). Для Connection предотвращения дальнейших операций с соединением базы данных, находящимся в неизвестном и, возможно, поврежденном состоянии, в случае исключения системного уровня, не являющегося подклассом Exception, включая KeyboardInterrupt и класс greenlet GreenletExit, теперь по умолчанию выполняется invalidated. В наибольшей степени это изменение касается драйверов MySQL, однако оно распространяется на все DBAPI.

    References: #3803

  • [sql] [bug]

    Операторы «eq» и «ne» больше не входят в список «ассоциативных» операторов, при этом они по-прежнему считаются «коммутативными». Это позволяет сохранить на уровне SQL выражение типа (x == y) == z с помощью круглых скобок. Pull request любезно предоставлен Джоном Пассаро.

    References: #3799

  • [sql] [bug]

    Stringify выражения с неименованными объектами Column, что встречается во многих ситуациях, в том числе в ORM-отчетах об ошибках, теперь будет выдавать имя в строковом контексте как «<имя неизвестно>», а не приводить к ошибке компиляции.

    References: #3789

  • [sql] [bug]

    При ошибочной передаче в .execute() ClauseElement или не-SQLAlchemy объектов, которые не являются «исполняемыми», выдается более описательное исключение/сообщение; новое исключение ObjectNotExecutableError выдается последовательно во всех случаях.

    References: #3786

  • [sql] [bug] [mysql] [postgresql]

    Исправлена регрессия в типах данных JSON, при которой не вызывался «буквальный процессор» для значения индекса JSON. Теперь собственные типы данных String и Integer вызываются из JSONIndexType и JSONPathType. Это относится к общим типам JSON, PostgreSQL и MySQL, а также имеет зависимость от #3766.

    References: #3765

  • [sql] [bug]

    Исправлена ошибка, при которой Index не извлекал колонки из составных SQL-выражений, если эти SQL-выражения были обернуты внутри конструкции __clause_element__() в стиле ORM. Эта ошибка существует и в версии 1.0.x, однако в версии 1.1 она более заметна, поскольку гибридное @выражение hybrid_property теперь возвращает обернутый элемент.

    References: #3763

postgresql

  • [postgresql] [bug]

    Внесена корректировка в ON CONFLICT, позволяющая использовать логику «inserted_primary_key» в случае отсутствия INSERT или UPDATE и отсутствия чистого изменения. В этом случае значение выдается как None, а не срабатывает исключение.

    References: #3813

  • [postgresql] [bug]

    Исправлена проблема в новой конструкции PG «on conflict», когда столбцы, включая столбцы пространства имен «excluded», не приравнивались к таблицам в предложениях WHERE в операторе.

    References: #3807

mysql

  • [mysql] [bug]

    Добавлена поддержка разбора булевых и целочисленных аргументов 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

  • [mysql] [bug]

    Исправлена ошибка, при которой флаг «literal_binds» не распространялся на выражение CAST в MySQL.

    References: #3766

mssql

  • [mssql] [bug]

    Изменен запрос, используемый для получения «имени схемы по умолчанию», с запроса к таблице principals базы данных на использование функции «schema_name()», поскольку поступали сообщения о том, что прежняя система была недоступна в редакции Azure Data Warehouse. Есть надежда, что это наконец-то будет работать во всех версиях SQL Server и стилях аутентификации.

    This change is also backported to: 1.0.16

    References: #3810

  • [mssql] [bug]

    Обновлена схема получения информации о версии сервера для pyodbc, чтобы использовать SQL Server SERVERPROPERTY(), а не полагаться на pyodbc.SQL_DBMS_VER, который продолжает оставаться ненадежным, особенно при использовании FreeTDS.

    This change is also backported to: 1.0.16

    References: #3814

  • [mssql] [bug]

    В список исключений отключения, приводящих к сбросу пула соединений, добавлен код ошибки 20017 «unexpected EOF from the server». Pull request любезно предоставлен Кеном Роббинсом (Ken Robbins).

    This change is also backported to: 1.0.16

    References: #3791

misc

  • [bug] [orm.declarative]

    Исправлена ошибка, при которой установка подкласса single-table inh подкласса joined-table, включающего дополнительный столбец, приводила к повреждению коллекции внешних ключей сопоставленной таблицы, что мешало инициализации отношений.

    This change is also backported to: 1.0.16

    References: #3797

1.1.0b3

Released: July 26, 2016

orm

sql

  • [sql] [bug]

    Исправлена ошибка в новой функции CTE для обновления/вставки/удаления, указанной как CTE внутри вложенного оператора (обычно SELECT), в результате которой значения oninsert и onupdate не вызывались для вложенного оператора.

    References: #3745

  • [sql] [bug]

    Исправлена ошибка в новой функции CTE для обновления/вставки/удаления, при которой анонимная (например, без переданного имени) конструкция CTE вокруг оператора приводила к ошибке.

    References: #3744

postgresql

  • [postgresql] [bug]

    Исправлена ошибка, из-за которой типы TypeDecorator и Variant недостаточно глубоко проверялись диалектом PostgreSQL, чтобы определить, что нужно выводить SMALLSERIAL или BIGSERIAL, а не SERIAL.

    This change is also backported to: 1.0.14

    References: #3739

oracle

  • [oracle] [bug]

    Исправлена ошибка в Select.with_for_update.of, когда подход Oracle «rownum» к LIMIT/OFFSET не учитывал выражений внутри клаузы «OF», которые должны быть указаны на самом верхнем уровне со ссылкой на выражение внутри подзапроса. Теперь эти выражения добавляются в подзапрос, если это необходимо.

    This change is also backported to: 1.0.14

    References: #3741

misc

  • [feature] [ext]

    В новое расширение sqlalchemy.ext.indexable добавлен параметр «default».

  • [bug] [ext]

    Исправлена ошибка в sqlalchemy.ext.baked, когда при использовании нескольких загрузчиков подзапросов разворачивание запроса с жадным загрузчиком подзапросов заканчивалось неудачей из-за проблемы с объемом переменной. Pull request любезно предоставлен Марком Ханенбергом (Mark Hahnenberg).

    This change is also backported to: 1.0.15

    References: #3743

  • [bug] [ext]

    sqlalchemy.ext.indexable будет перехватывать IndexError, а также KeyError при возникновении в качестве AttributeError.

1.1.0b2

Released: July 1, 2016

sql

  • [sql] [bug]

    Исправлена проблема, связанная с оператором отрицания в математике SQL, когда тип выражения переставал соответствовать числовому типу оригинала. Это приводило к проблемам, когда тип определял поведение набора результатов.

    This change is also backported to: 1.0.14

    References: #3735

  • [sql] [bug]

    Исправлена ошибка, из-за которой методы __getstate__ / __setstate__ для sqlalchemy.util.Properties были нерабочими в связи с переходом в серии 1.0 на __slots__. Данная проблема потенциально могла повлиять на некоторые сторонние приложения. Pull request любезно предоставлен Питером Малдером (Pieter Mulder).

    This change is also backported to: 1.0.14

    References: #3728

  • [sql] [bug]

    Обработка данных типа Boolean для бэкендов, поддерживающих только целочисленные типы, была согласована между версиями чистого Python и C-расширения. Так, в версии C-расширения любое целочисленное значение из базы данных будет восприниматься как булево, а не только ноль и единица; кроме того, небулевые целочисленные значения, передаваемые в базу данных, принудительно приводятся к нулю или единице, а не передаются как исходное целочисленное значение.

    References: #3730

  • [sql] [bug]

    В Enum немного отступили от правил проверки, позволяющих пропускать неизвестные строковые значения, если только Enum не передан флаг validate_string=True; любые другие типы объектов, разумеется, по-прежнему отклоняются. Хотя непосредственным применением является разрешение сравнения перечислений с помощью LIKE, сам факт существования такого использования указывает на то, что случаев использования сравнения неизвестных строк может быть больше, чем мы ожидали, что намекает на то, что, возможно, существуют и случаи вставки неизвестных строк.

    References: #3725

postgresql

  • [postgresql] [bug] [ext]

    Внесено небольшое изменение в поведение расширения sqlalchemy.ext.compiler, при котором существующие схемы компиляции для установленной конструкции удаляются, если сама конструкция еще не имеет своего собственного выделенного __visit_name__. В версии 1.0 это происходило редко, однако в версии 1.1 ARRAY является подклассом ARRAY и имеет такое поведение. В результате установка обработчика компиляции для другого диалекта, например SQLite, приведет к тому, что основной объект ARRAY перестанет компилироваться.

    References: #3732

mysql

1.1.0b1

Released: June 16, 2016

orm

  • [orm] [feature] [ext]

    Добавлено новое ORM-расширение Индексируемый, позволяющее строить Python-атрибуты, ссылающиеся на конкретные элементы «индексированных» структур, таких как массивы и JSON-поля. Pull request любезно предоставлен Jeong YunWon.

  • [orm] [feature]

    Добавлен новый флаг Session.bulk_insert_mappings.render_nulls, позволяющий выполнять массовый ORM INSERT с отображением значений NULL; это позволяет обойти настройки по умолчанию на стороне сервера, но при этом все операторы формируются с одним и тем же набором столбцов, что позволяет обрабатывать их в пакетном режиме. Pull request любезно предоставлен Tobias Sauerwein.

  • [orm] [feature]

    Добавлено новое событие AttributeEvents.init_scalar(), а также новый набор примеров, иллюстрирующих его использование. Это событие может быть использовано для предоставления значения по умолчанию, сгенерированного Core, атрибуту на стороне Python перед сохранением объекта.

    References: #1311

  • [orm] [feature]

    В метод AutomapBase.prepare() добавлено значение AutomapBase.prepare.schema, указывающее, из какой схемы следует отражать таблицы, если это не схема по умолчанию. Pull request любезно предоставлен Джошем Марлоу.

  • [orm] [feature]

    В доступные параметры отображения добавлен новый параметр mapper.passive_deletes. Это позволяет выполнять DELETE при наследовании по объединенным таблицам только для базовой таблицы, а для удаления строки из таблиц подклассов - ON DELETE CASCADE.

    References: #2349

  • [orm] [feature]

    Вызов str() для основной конструкции SQL стал более «дружественным», когда конструкция содержит нестандартные элементы SQL, такие как RETURNING, операции с индексами массивов, диалектные или пользовательские типы данных. Теперь в этих случаях возвращается строка, отображающая приближенное представление конструкции (обычно ее версию в стиле PostgreSQL), а не вызывающая ошибку.

    References: #3631

  • [orm] [feature]

    Вызов str() для Query теперь будет учитывать Engine, с которым связан Session, при генерации строковой формы SQL, так что, по возможности, будет показан реальный SQL, который будет выдан в базу данных. Ранее использовался только движок, связанный с MetaData, к которому привязано отображение, если таковое имеется. Если ни на Session, ни на MetaData, с которым связаны отображения, не удается найти привязки, то для отображения SQL используется диалект «по умолчанию», как это было ранее.

    References: #3081

  • [orm] [feature]

    Набор SessionEvents теперь включает события, позволяющие однозначно отслеживать все переходы состояния жизненного цикла объекта в терминах самого Session, например, ожидающий, переходный, постоянный, отсоединенный. Также определяется состояние объекта в рамках каждого события.

    References: #2677

  • [orm] [feature]

    Добавлено новое состояние жизненного цикла сессии deleted. Это новое состояние представляет объект, который был удален из состояния persistent и перейдет в состояние detached после фиксации транзакции. Это решает давнюю проблему, когда удаленные объекты существовали в серой зоне между постоянными и отсоединенными. Аксессор InstanceState.persistent больше не будет не сообщать об удаленном объекте как о постоянном; вместо этого аксессор InstanceState.deleted будет иметь значение True для таких объектов, пока они не станут отсоединенными.

    References: #2677

  • [orm] [feature]

    Добавлена проверка на распространенную ошибку, связанную с передачей отображенных классов или отображенных экземпляров в контекст, где они интерпретируются как связанные параметры SQL; в этом случае возникает новое исключение.

    References: #3321

  • [orm] [feature]

    Добавлена новая стратегия загрузки отношений raiseload() (также доступная через lazy='raise'). Эта стратегия ведет себя почти так же, как noload(), но вместо возврата None выдает ошибку InvalidRequestError. Pull request любезно предоставлен Adrian Moennich.

    References: #3512

  • [orm] [change]

    Параметр Mapper.order_by устарел. Это старый параметр, больше не имеющий отношения к работе SQLAlchemy после появления объекта Query. Утратив его, мы показываем, что не поддерживаем нерабочие варианты использования и призываем приложения отказаться от использования этого параметра.

    References: #3394

  • [orm] [change]

    Параметр Session.weak_identity_map устарел. Смотрите новый рецепт Поведение при обращении к сеансам для событийно-ориентированного подхода к поддержанию сильного поведения карты идентификации.

    References: #2677

  • [orm] [bug]

    Исправлена проблема, при которой изменение объекта от одного родителя к другому могло работать некорректно в сочетании с не очищенной модификацией атрибута внешнего ключа. Теперь при перемещении атрибута учитывается зафиксированное в базе данных значение внешнего ключа, чтобы найти «предыдущего» родителя перемещаемого объекта. Это позволяет корректно срабатывать событиям, в том числе и событиям обратной ссылки. Ранее эти события срабатывали не всегда. Это может повлиять на работу приложений, которые полагались на прежнее неработающее поведение.

    References: #3708

  • [orm] [bug]

    Исправлена ошибка, при которой отложенные колонки случайно устанавливались для загрузки в базу данных при очередном разворачивании объекта в целом, когда объект был объединен в сессию с помощью session.merge(obj, load=False).

    References: #3488

  • [orm] [bug] [mysql]

    В продолжение распространенного в MySQL исключения, связанного с отменой точки сохранения, о котором впервые говорилось в #2696, режим отказа, в котором находится Session, когда SAVEPOINT исчезает до отката, был улучшен, чтобы Session по-прежнему функционировал вне этой точки сохранения. Предполагается, что операция сохранения завершилась неудачно и была отменена.

    References: #3680

  • [orm] [bug]

    Исправлена ошибка, при которой только что вставленный экземпляр, откаченный назад, все равно потенциально вызывал конфликты персистентности в следующей транзакции, поскольку не проверялось, что срок действия экземпляра истек. Это исправление позволит устранить большой класс случаев, которые ошибочно вызывали ошибку «New instance with identity X conflicts with persistent instance Y».

    References: #3677

  • [orm] [bug]

    Улучшение работы Query.correlate(), заключающееся в том, что при использовании «полиморфной» сущности, представляющей собой прямое соединение нескольких таблиц, оператор будет гарантировать, что все таблицы, входящие в соединение, являются частью того, что соотносится.

    References: #3662

  • [orm] [bug]

    Исправлена ошибка, из-за которой атрибут, загружаемый с нетерпением «многие к одному», не загружался, если объединенная загрузка происходила из строки, в которой одна и та же сущность присутствовала несколько раз, в одних случаях вызывая нетерпеливую загрузку атрибута, а в других - нет. Логика здесь изменена таким образом, чтобы атрибут загружался даже в том случае, если родительская сущность уже была обработана другим загрузчиком.

    References: #3431

  • [orm] [bug]

    Уточнение логики добавления столбцов в результирующий SQL при комбинации Query.distinct() с Query.order_by() таким образом, что столбцы, которые уже присутствуют, не будут добавляться второй раз, даже если они обозначены другим именем. Независимо от этого изменения, дополнительные столбцы, добавленные в SQL, никогда не возвращались в конечный результат, поэтому данное изменение влияет только на строковую форму оператора, а также на его поведение при использовании в контексте выполнения Core. Кроме того, столбцы больше не добавляются при использовании формата DISTINCT ON, если запрос не обернут внутри подзапроса из-за присоединенной ускоренной загрузки.

    References: #3641

  • [orm] [bug]

    Исправлена проблема, при которой два одноименных отношения, ссылающихся на базовый класс и конкретно-наследуемый подкласс, при установке этих отношений с помощью «backref» вызывали ошибку, в то время как установка идентичной конфигурации с помощью relationship() с конфликтующими именами была успешной, как и положено в случае конкретного отображения.

    References: #3630

  • [orm] [bug]

    Метод Session.merge() теперь отслеживает ожидающие объекты по первичному ключу перед выдачей INSERT и объединяет разные объекты с дублирующимися первичными ключами по мере их появления, что в лучшем случае является полудетерминированным. Такое поведение соответствует тому, что уже происходит с постоянными объектами.

    References: #3601

  • [orm] [bug]

    Исправлена ошибка, при которой критерий «наследование одной таблицы» добавлялся в конец запроса в некоторых неподходящих ситуациях, например, при запросе из exists() подкласса с одним наследованием.

    References: #3582

  • [orm] [bug]

    Добавлен новый модификатор уровня типа TypeEngine.evaluates_none(), который указывает ORM, что положительный набор None должен быть сохранен как значение NULL, вместо того чтобы исключить столбец из оператора INSERT. Эта возможность используется как в рамках реализации для #3514, так и в качестве самостоятельной функции, доступной для любого типа.

    References: #3250

  • [orm] [bug]

    Внутренние вызовы «бухгалтерских» функций в Session.bulk_save_objects() и связанных с ними массовых методов были сокращены до такой степени, что в настоящее время эта функциональность не используется, например, проверки на получение значений по умолчанию для столбцов после выполнения оператора INSERT или UPDATE.

    References: #3526

  • [orm] [bug] [postgresql]

    Внесены дополнительные исправления, касающиеся значения None в сочетании с типом PostgreSQL JSON. Если оставить флаг JSON.none_as_null в значении по умолчанию False, то ORM теперь будет корректно вставлять в колонку строку JSON «„null“», когда значение на объекте ORM установлено в значение None или когда значение None используется с Session.bulk_insert_mappings(), в том числе если колонка имеет значение по умолчанию или серверное значение по умолчанию.

    References: #3514

engine

  • [engine] [feature]

    Добавлены события пула соединений ConnectionEvents.close(), ConnectionEvents.detach(), ConnectionEvents.close_detached().

  • [engine] [feature]

    Все строковые форматирования связанных наборов параметров и строк результатов для целей протоколирования, исключений и repr() теперь обрезают очень большие скалярные значения внутри каждой коллекции, включая обозначение «N символов обрезано», аналогично тому, как обрезается отображение больших многопараметрических наборов.

    References: #2837

  • [engine] [feature]

    Добавлена трансляция схем для объектов Table с поддержкой нескольких пользователей. Это позволяет использовать приложение, которое использует один и тот же набор объектов Table во многих схемах, например, в схеме для каждого пользователя. Добавлена новая опция выполнения Connection.execution_options.schema_translate_map.

    References: #2685

  • [engine] [feature]

    В движок добавлена новая система точек входа, позволяющая указывать «плагины» в строке запроса к URL. Можно написать пользовательские плагины, которые будут иметь возможность изменять и/или потреблять URL и аргументы ключевых слов движка, а затем при создании движка будут получать сам движок для дополнительных модификаций или регистрации событий. Плагины написаны как подкласс CreateEnginePlugin; подробнее см. этот класс.

    References: #3536

sql

  • [sql] [feature]

    Добавлена поддержка TABLESAMPLE с помощью нового метода FromClause.tablesample() и отдельной функции. Pull request любезно предоставлен Ilja Everilä.

    References: #3718

  • [sql] [feature]

    Добавлена поддержка диапазонов в оконных функциях с использованием параметров over.range_ и over.rows.

    References: #3049

  • [sql] [feature]

    Реализовано отражение ограничений CHECK для SQLite и PostgreSQL. Это доступно как через новый метод инспектора Inspector.get_check_constraints(), так и при отражении Table объектов в виде CheckConstraint объектов, присутствующих в коллекции ограничений. Pull request любезно предоставлен Алексом Грёнхольмом (Alex Grönholm).

  • [sql] [feature]

    Новые операторы ColumnOperators.is_distinct_from() и ColumnOperators.isnot_distinct_from(); pull request любезно предоставлен Себастьяном Банком.

  • [sql] [feature]

    В DDLCompiler.visit_create_table() добавлен хук DDLCompiler.create_table_suffix(), позволяющий пользовательским диалектам добавлять ключевые слова после предложения «CREATE TABLE». Pull request любезно предоставлен Марком Санданом.

  • [sql] [feature]

    Отрицательные целочисленные индексы теперь учитываются в строках, возвращаемых из ResultProxy. Pull request любезно предоставлен Emanuele Gaifas.

  • [sql] [feature]

    Добавлена конструкция Select.lateral() и связанные с ней конструкции, позволяющие использовать ключевое слово LATERAL стандарта SQL, которое в настоящее время поддерживается только в PostgreSQL.

    References: #2857

  • [sql] [feature]

    В Core и ORM добавлена поддержка рендеринга «FULL OUTER JOIN». Pull request любезно предоставлен Стефаном Урбанеком.

    References: #1957

  • [sql] [feature]

    Функциональность CTE была расширена для поддержки всего DML, позволяя операторам INSERT, UPDATE и DELETE как указывать свое собственное выражение WITH, так и превращать эти операторы в выражения CTE, если они включают в себя выражение RETURNING.

    References: #2551

  • [sql] [feature]

    В тип данных Enum добавлена поддержка перечислимых классов в стиле PEP-435, а именно класса enum.Enum из Python 3, а также совместимых библиотек перечислений. Тип данных Enum теперь также выполняет проверку входящих значений в Python и добавляет возможность отказаться от создания ограничения CHECK Enum.create_constraint. Pull request любезно предоставлен Алексом Грёнхольмом (Alex Grönholm).

    References: #3095, #3292

  • [sql] [feature]

    Глубокое усовершенствование недавно добавленного метода TextClause.columns() и его взаимодействия с обработкой строк результата позволяет теперь позиционно сопоставлять столбцы, передаваемые в метод, со столбцами результата в операторе, а не сопоставлять их только по имени. Преимуществом этого является то, что при связывании текстового SQL-оператора с ORM или табличной моделью Core не требуется система маркировки или дедупликации общих имен столбцов, что также означает отсутствие необходимости заботиться о соответствии имен таблиц столбцам ORM и так далее. Кроме того, функция ResultProxy была усовершенствована для более точного сопоставления ключей столбцов и строк со строкой в некоторых случаях.

    References: #3501

  • [sql] [feature]

    В ядро добавлен новый тип JSON. Он является основой типа PostgreSQL JSON, а также нового типа JSON, что позволяет использовать PG/MySQL-агностичный JSON-столбец. Тип поддерживает базовый поиск по индексу и пути.

    References: #3619

  • [sql] [feature]

    Добавлена поддержка «наборно-агрегатных» функций вида <function> WITHIN GROUP (ORDER BY <criteria>), использующих метод FunctionElement.within_group(). Добавлен ряд распространенных функций типа «набор-агрегат» с возвращаемыми типами, производными от набора. К ним относятся функции типа percentile_cont, dense_rank и другие.

    References: #1370

  • [sql] [feature] [postgresql]

    Добавлена поддержка стандартной для SQL функции array_agg, которая автоматически возвращает ARRAY правильного типа и поддерживает операции с индексами / срезами, а также array_agg(), которая возвращает ARRAY с дополнительными возможностями сравнения. Поскольку массивы на данный момент поддерживаются только на PostgreSQL, фактически работает только на PostgreSQL. Также добавлена новая конструкция aggregate_order_by в поддержку расширения PG «ORDER BY».

    References: #3132

  • [sql] [feature]

    В ядро добавлен новый тип ARRAY. Он является основой типа PostgreSQL ARRAY и теперь входит в состав Core, чтобы начать поддерживать различные возможности поддержки массивов в стандарте SQL, включая некоторые функции и возможную поддержку собственных массивов в других базах данных, имеющих понятие «массив», таких как DB2 или Oracle. Кроме того, добавлены новые операторы any_() и all_(). Они поддерживают не только конструкции массивов в PostgreSQL, но и подзапросы, которые можно использовать в MySQL (но, к сожалению, не в PostgreSQL).

    References: #3516

  • [sql] [change] [mysql]

    Система, по которой столбец Column считается «автоинкрементным», была изменена таким образом, что автоинкремент больше не включается неявно для Table, имеющего составной первичный ключ. Чтобы обеспечить возможность включения автоинкремента для составного столбца-члена PK и в то же время сохранить давно существующее в SQLAlchemy поведение включения неявного автоинкремента для единственного целочисленного первичного ключа, к параметру Column.autoincrement "auto" было добавлено третье состояние, которое теперь используется по умолчанию.

    References: #3216

  • [sql] [bug]

    FromClause.count() является устаревшей. Эта функция использует произвольный столбец таблицы и не является надежной; для использования в ядре следует предпочесть func.count().

    References: #3724

  • [sql] [bug]

    Исправлено утверждение, которое несколько некорректно поднималось, если индекс Index был связан с индексом Column, который был связан с индексом TableClause в нижнем регистре; для целей связывания индекса с индексом Table эта связь должна игнорироваться.

    References: #3616

  • [sql] [bug]

    Конструкция type_coerce() теперь является полноценным элементом выражения Core, который подвергается поздней оценке во время компиляции. Ранее эта функция была только функцией преобразования, которая обрабатывала различные входные данные выражения, возвращая либо Label из выражения, ориентированного на столбец, либо копию данного объекта BindParameter, что, в частности, не позволяло логически поддерживать операцию, когда преобразование выражения на уровне ORM конвертирует столбец в связанный параметр (например, для ленивой загрузки).

    References: #3531

  • [sql] [bug]

    Расширитель типа TypeDecorator теперь будет работать совместно с реализацией SchemaType, обычно Enum или Boolean, обеспечивая передачу событий для каждой таблицы от типа реализации к внешнему типу. Эти события используются для обеспечения корректного создания (и, возможно, удаления) ограничений или типов PostgreSQL (например, ENUM) вместе с родительской таблицей.

    References: #2919

  • [sql] [bug]

    Поведение конструкции union() и связанных с ней конструкций, таких как Query.union(), теперь учитывает случаи, когда встроенные операторы SELECT необходимо заключать в круглые скобки из-за того, что они включают LIMIT, OFFSET и/или ORDER BY. Эти запросы не работают на SQLite, и на этом бэкенде, как и раньше, будут неудачными, но теперь должны работать на всех остальных бэкендах.

    References: #2528

schema

  • [schema] [enhancement]

    Функции генерации, передаваемые по умолчанию объектам Column, теперь запускаются через «update_wrapper» или эквивалентную функцию, если передается вызываемая не-функция, так что инструменты интроспекции сохраняют имя и docstring обернутой функции. Pull request courtesy hsum.

postgresql

  • [postgresql] [feature]

    Добавлена поддержка PostgreSQL’s INSERT..ON CONFLICT с использованием нового специфичного для PostgreSQL объекта Insert. Pull-запрос и значительные усилия Робин Томас.

    References: #3529

  • [postgresql] [feature]

    DDL для DROP INDEX будет выдавать «CONCURRENTLY», если флаг postgresql_concurrently установлен после Index и если используемая база данных определяется как PostgreSQL версии 9.2 или выше. Для CREATE INDEX также добавлена функция определения версии базы данных, которая будет опускать предложение, если версия PG меньше 8.2. Pull request любезно предоставлен Iuri de Silvio.

  • [postgresql] [feature]

    Добавлен новый параметр PGInspector.get_view_names.include, позволяющий указать, какие виды представлений должны быть возвращены. В настоящее время возвращаются «простые» и «материализованные» представления. Pull request любезно предоставлен Себастьяном Банком.

    References: #3588

  • [postgresql] [feature]

    В качестве аргумента к Index добавлен параметр postgresql_tablespace, позволяющий указывать TABLESPACE для индекса в PostgreSQL. Дополняет одноименный параметр в Table. Pull request любезно предоставлен Benjamin Bertrand.

    References: #3720

  • [postgresql] [feature]

    Добавлен новый параметр GenerativeSelect.with_for_update.key_share, который будет выводить на бэкенд PostgreSQL версию FOR NO KEY UPDATE вместо FOR UPDATE и FOR KEY SHARE вместо FOR SHARE. Pull request любезно предоставлен Сергеем Скопиным.

  • [postgresql] [feature] [oracle]

    Добавлен новый параметр GenerativeSelect.with_for_update.skip_locked, который выводит фразу SKIP LOCKED для блокировки FOR UPDATE или FOR SHARE на бэкендах PostgreSQL и Oracle. Pull request любезно предоставлен Джеком Чжоу (Jack Zhou).

  • [postgresql] [feature]

    Добавлен новый диалект PyGreSQL для диалекта PostgreSQL. Спасибо Кристофу Цвершке и Каолину Имаго Файеру за их усилия.

  • [postgresql] [feature]

    Добавлена новая константа JSON.NULL, указывающая на то, что для значения следует использовать значение JSON NULL независимо от других настроек.

    References: #3514

  • [postgresql] [change]

    Модуль sqlalchemy.dialects.postgres, давно устаревший, удален; он уже много лет выдает предупреждение, и проекты должны обращаться к sqlalchemy.dialects.postgresql. Однако URL-адреса движков в виде postgres:// будут продолжать работать.

  • [postgresql] [bug]

    В версию метода Inspector.get_view_definition() для PostgreSQL добавлена поддержка отражения источника материализованных представлений.

    References: #3587

  • [postgresql] [bug]

    При использовании объекта ARRAY, ссылающегося на подтип Enum или ENUM, теперь будет выдаваться ожидаемый код «CREATE TYPE» и «DROP TYPE». DDL, когда тип используется внутри «CREATE TABLE» или «DROP TABLE».

    References: #2729

  • [postgresql] [bug]

    Флаг «hashable» для специальных типов данных, таких как ARRAY, JSON и HSTORE, теперь установлен в значение False, что позволяет использовать эти типы в ORM-запросах, включающих сущности в строке.

    References: #3499

  • [postgresql] [bug]

    Тип PostgreSQL ARRAY теперь поддерживает многомерный индексированный доступ, например, выражения типа somecol[5][6] без необходимости явного приведения или принуждения к типу, при условии, что параметр ARRAY.dimensions установлен на желаемое число измерений.

    References: #3487

  • [postgresql] [bug]

    Тип возвращаемого выражения JSON и JSONB при использовании индексированного доступа был исправлен таким образом, чтобы оно работало подобно самому PostgreSQL и возвращало выражение, которое само имеет тип JSON или JSONB. Ранее аксессор возвращал NullType, что не позволяло использовать последующие JSON-подобные операторы.

    References: #3503

  • [postgresql] [bug]

    Типы данных JSON, JSONB и HSTORE теперь позволяют полностью контролировать возвращаемый тип операции индексированного текстового доступа, либо column[someindex].astext для типа JSON, либо column[someindex] для типа HSTORE, через параметры JSON.astext_type и HSTORE.text_type.

    References: #3503

  • [postgresql] [bug]

    Модификатор Comparator.astext больше не обращается к ColumnElement.cast() неявно, поскольку типы JSON/JSONB в PG позволяют осуществлять перекрестное обращение друг к другу. Код, использующий ColumnElement.cast() при индексированном доступе к JSON, например, col[someindex].cast(Integer), должен быть изменен для явного вызова Comparator.astext.

    References: #3503

mysql

sqlite

mssql

  • [mssql] [feature]

    Флаг mssql_clustered, доступный для UniqueConstraint, PrimaryKeyConstraint, Index, теперь имеет значение по умолчанию None и может быть установлен в значение False, что приведет к тому, что ключевое слово NONCLUSTERED не будет использоваться для первичного ключа, что позволит использовать другой индекс в качестве «кластеризованного». Pull request courtesy Saulius Žemaitaitis.

  • [mssql] [feature]

    Добавлена поддержка базового уровня изоляции для диалектов SQL Server с помощью параметров create_engine.isolation_level и Connection.execution_options.isolation_level.

    References: #3534

  • [mssql] [change]

    Флаг legacy_schema_aliasing, введенный в версии 1.0.5 как часть #3424 для отключения попыток диалекта MSSQL создавать псевдонимы для таблиц с критериями схемы, теперь имеет значение False; старое поведение теперь отключено, если не включено явным образом.

    References: #3434

  • [mssql] [bug]

    Корректировка диалекта mxODBC для использования символа BinaryNull в сочетании с типом данных VARBINARY. Pull request любезно предоставлен Sheila Allen.

  • [mssql] [bug]

    Исправлена проблема, при которой диалект SQL Server отражал строковый или другой тип столбца переменной длины с неограниченной длиной, присваивая атрибуту длины строки маркер "max". Хотя явное использование маркера "max" поддерживается диалектом SQL Server, оно не является частью обычного контракта базовых типов строк, и вместо этого длину следует просто оставить как None. Теперь диалект присваивает длине значение None при отражении типа, чтобы тип вел себя нормально в других контекстах.

    References: #3504

misc

  • [feature] [ext]

    В расширение Отслеживание мутаций добавлены вспомогательные классы MutableSet и MutableList. Pull request любезно предоставлен Jeong YunWon.

    References: #3297

  • [bug] [ext]

    Документная строка, указанная для гибридного свойства или метода, теперь учитывается на уровне класса, что позволяет работать с такими инструментами, как Sphinx autodoc. При этом для гибридных свойств необходимо выполнить некоторую обертку выражений, что может привести к тому, что они будут выглядеть по-разному при использовании интроспекции.

    References: #3653

  • [bug] [sybase]

    Неподдерживаемый диалект Sybase теперь выдает ошибку NotImplementedError при попытке скомпилировать запрос, содержащий «offset»; Sybase не имеет прямой функции «offset».

    References: #2278

Вернуться на верх