1.2 Changelog

1.2.19

Released: April 15, 2019

orm

  • [orm] [bug]

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

    References: #4507

examples

  • [examples] [bug]

    Исправлена ошибка в примере large_resultsets, когда переименование переменной «id» в результате переформатирования кода приводило к неудаче теста. Pull request любезно предоставлен Matt Schuchhardt.

    References: #4528

engine

  • [engine] [bug]

    При сравнении двух объектов URL с помощью __eq__() не учитывался номер порта, два объекта, отличающиеся только номером порта, считались равными. Теперь сравнение портов добавлено в метод __eq__() метода URL, объекты, отличающиеся номером порта, теперь не равны. Кроме того, __ne__() не был реализован для URL, что приводило к неожиданному результату при использовании != в Python2, так как в Python2 не существует подразумеваемых отношений между операторами сравнения.

    References: #4406

mssql

  • [mssql] [bug]

    После изменения уровня изоляции на SNAPSHOT выполняется commit(), поскольку и pyodbc, и pymssql открывают неявную транзакцию, которая блокирует выполнение последующих SQL в текущей транзакции.

    References: #4536

oracle

  • [oracle] [bug]

    В диалекте Oracle добавлена поддержка отражения типа данных NCHAR, а в список типов, экспортируемых диалектом Oracle, добавлен NCHAR.

    References: #4506

1.2.18

Released: February 15, 2019

orm

  • [orm] [bug]

    В 1.2 исправлена регрессия, при которой опция загрузчика wildcard/load_only не работала корректно по отношению к пути загрузчика, в котором для ограничения конкретным подклассом использовались функции of_type(). Пока исправление работает только для of_type() простого подкласса, но не для сущности with_polymorphic, которая будет рассмотрена в отдельном выпуске; маловероятно, что последний случай работал ранее.

    References: #4468

  • [orm] [bug]

    Исправлена довольно простая, но критическая проблема, когда событие SessionEvents.pending_to_persistent() вызывалось для объектов не только при переходе из состояния pending в состояние persistent, но и когда они уже были persistent и только обновлялись, в результате чего событие вызывалось для всех объектов при каждом обновлении.

    References: #4489

sql

  • [sql] [bug]

    Исправлена проблема, когда тип JSON имел атрибут JSON.should_evaluate_none, доступный только для чтения, что приводило к сбоям при использовании метода TypeEngine.evaluates_none() в связке с этим типом. Pull request courtesy Sanjana S.

    References: #4485

mysql

  • [mysql] [bug]

    Исправлена вторая регрессия, вызванная #4344 (первая была #4361), которая позволяет обойти проблему MySQL 88718, когда используемая функция нижнего кега была некорректна для Python 2 с соглашениями о кеге OSX/Windows, что приводило к появлению TypeError. В эту логику было добавлено полное покрытие, так что каждый кодовый путь отрабатывается в имитационном стиле для всех трех соглашений о регистре на всех версиях Python. В MySQL 8.0 тем временем была исправлена проблема 88718, поэтому обходной путь применим только к определенному диапазону версий MySQL 8.0.

    References: #4492

sqlite

  • [sqlite] [bug]

    Исправлена ошибка в SQLite DDL, когда при использовании выражения в качестве значения по умолчанию на стороне сервера требовалось, чтобы оно содержалось в круглых скобках и было принято парсером sqlite. Pull request любезно предоставлен Bartlomiej Biernacki.

    References: #4474

mssql

  • [mssql] [bug]

    Исправлена ошибка, при которой логика SQL Server «IDENTITY_INSERT», позволяющая выполнять INSERT с явным значением в столбце IDENTITY, не обнаруживала случая, когда Insert.values() использовался со словарем, содержащим Column в качестве ключа и SQL-выражение в качестве значения.

    References: #4499

1.2.17

Released: January 25, 2019

orm

  • [orm] [feature]

    Добавлены новые крючки событий QueryEvents.before_compile_update() и QueryEvents.before_compile_delete(), которые дополняют QueryEvents.before_compile() в случае методов Query.update() и Query.delete().

    References: #4461

  • [orm] [bug]

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

    References: #4454

postgresql

  • [postgresql] [bug]

    Пересмотрен запрос, используемый при отражении ограничений CHECK, с целью использования функции pg_get_constraintdef, так как столбец consrc в PG 12 упраздняется. Спасибо Джону А Стивенсону за подсказку.

    References: #4463

oracle

  • [oracle] [bug]

    Исправлена регрессия в логике целочисленной точности, связанная с рефакторингом диалекта cx_Oracle в версии 1.2. Теперь мы больше не применяем тип cx_Oracle.NATIVE_INT к столбцам результатов, передающим целочисленные значения (определяемые как положительная точность с масштабом ==0), что приводит к проблемам целочисленного переполнения при значениях, выходящих за 32-битную границу. Вместо этого выходная переменная оставляется нетипизированной, чтобы cx_Oracle мог выбрать оптимальный вариант.

    References: #4457

1.2.16

Released: January 11, 2019

engine

  • [engine] [bug]

    Исправлена регрессия, появившаяся в версии 1.2, когда рефактор базового класса исключений SQLAlchemyError приводил к некорректному кодированию сообщения в виде простой строки в Unicode под python 2k, которое не обрабатывается интерпретатором Python для символов, не входящих в кодировку платформы (обычно ascii). Класс SQLAlchemyError теперь передает байтовую строку под Py2K для __str__(), как и вообще поведение объектов исключений под Py2K, и выполняет безопасное приведение к юникоду utf-8 с возвратом на обратную косую черту для __unicode__(). Для Py3K сообщение, как правило, уже имеет юникод, но если это не так, то для метода __str__() снова выполняется безопасное коэрцитивное преобразование в utf-8 с обратным слешем.

    References: #4429

sql

  • [sql] [bug] [mysql] [oracle]

    Исправлена проблема, при которой DDL, выдаваемый для DropTableComment, который будет использоваться в будущей версии Alembic, был некорректен для баз данных MySQL и Oracle.

    References: #4436

postgresql

  • [postgresql] [bug]

    Исправлена проблема, при которой перечисление ENUM или пользовательский домен, присутствующие в удаленной схеме, не распознавались в отражении колонок, если имя перечисления/домена или имя схемы требовало кавычек. Новая схема разбора теперь полностью разбирает лексемы с кавычками и без кавычек, включая поддержку кавычек в формате SQL.

    References: #4416

  • [postgresql] [bug]

    Исправлена проблема, при которой несколько объектов ENUM, на которые ссылался один и тот же объект MetaData, не создавались, если несколько объектов имели одинаковое имя при разных именах схем. Внутренняя мемоизация, используемая диалектом PostgreSQL для отслеживания факта создания конкретного ENUM в базе данных во время последовательности создания DDL, теперь учитывает имя схемы.

sqlite

  • [sqlite] [bug]

    Отражение индекса, основанного на SQL-выражениях, теперь пропускается с предупреждением, как и в диалекте Postgresql, где в настоящее время мы не поддерживаем отражение индексов, содержащих SQL-выражения. Ранее создавался индекс с колонками None, что приводило к поломке таких инструментов, как Alembic.

    References: #4431

misc

  • [no_tags]

    Исправлена проблема в функции «расширение IN», когда использование одного и того же имени связанного параметра в запросе более одного раза приводило к ошибке KeyError в процессе переписывания параметров в запросе.

    References: #4394

1.2.15

Released: December 11, 2018

orm

  • [orm] [bug]

    Исправлена ошибка, из-за которой аннотации ORM могли быть некорректными для отношений primaryjoin/secondaryjoin, если в декларативных связках использовался паттерн ForeignKey(SomeClass.id). При этом в условия присоединения просачивались нежелательные аннотации, которые могли нарушить операции псевдонимов, выполняемые в рамках Query, которые не должны были влиять на элементы в этом условии присоединения. Теперь такие аннотации удаляются заранее, если они присутствуют.

    References: #4367

  • [orm] [bug]

    В продолжение темы, схожей с недавней #4349, отремонтирована проблема с Comparator.any() и Comparator.has(), где «вторичный» selectable должен быть явно включен в предложение FROM в подзапросе EXISTS для случая, когда этот «вторичный» является объектом Join.

    References: #4366

  • [orm] [bug]

    Исправлена ошибка, вызванная #4349, когда добавление «вторичной» таблицы в предложение FROM для динамического загрузчика влияло на способность Query выполнять последующее присоединение к другой сущности. Исправление добавляет первичную сущность в качестве первого элемента списка FROM, поскольку Query.join() хочет перейти от нее. В версии 1.3 будет найдено более полное решение и этой проблемы (#4365).

    References: #4363

  • [orm] [bug]

    Исправлена ошибка, при которой цепочка опций mapper с использованием RelationshipProperty.of_type() в сочетании с цепочкой опций, ссылающихся на имя атрибута только в виде строки, не находила атрибут.

    References: #4400

orm declarative

  • [orm] [declarative] [bug]

    Предупреждение выдается в том случае, если к декларативному классу применяется объект column(), так как, скорее всего, он должен быть объектом Column.

    References: #4374

misc

  • [no_tags]

    Добавлена поддержка передачи в строке URL флага write_timeout, принимаемого mysqlclient и pymysql.

    References: #4381

  • [no_tags]

    Исправлена проблема, при которой отражение домена PostgreSQL, выраженного в виде массива, не распознавалось. Pull request любезно предоставлен Jakub Synowiec.

    References: #4377, #4380

1.2.14

Released: November 10, 2018

orm

  • [orm] [bug]

    Исправлена ошибка в Session.bulk_update_mappings(), при которой альтернативные имена атрибутов сопоставления приводили к тому, что столбец первичного ключа оператора UPDATE включался в предложение SET, а также в предложение WHERE; хотя обычно это не представляет опасности, для SQL Server это может привести к ошибке, связанной с наличием столбца IDENTITY. Это продолжение той же ошибки, которая была исправлена в #3849, где тестирование было недостаточным для выявления этого дополнительного дефекта.

    References: #4357

  • [orm] [bug]

    Исправлена незначительная проблема производительности, которая в некоторых случаях могла привести к излишним накладным расходам при получении результата, связанным с использованием ORM-колонок и сущностей, включающих эти колонки одновременно в запрос. Проблема связана с накладными расходами на хеширование / eq при обращении к столбцу разными способами.

    References: #4347

mysql

  • [mysql] [bug]

    Исправлена регрессия, вызванная выпуском #4344 в версии 1.2.13, в которой исправление проблемы чувствительности MySQL 8.0 к регистру имен ссылающихся столбцов при отражении ссылок на внешний ключ обходится с помощью представления information_schema.columns. В OSX / lower_case_table_names=2 не удавалось обойти эту проблему, что приводило к несовпадению регистров в представлении information_schema.columns и SHOW CREATE TABLE, поэтому в режимах SQL, не чувствительных к регистру, теперь используется нечувствительное к регистру соответствие.

    References: #4361

1.2.13

Released: October 31, 2018

orm

  • [orm] [bug]

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

    References: #4349

orm declarative

  • [orm] [declarative] [bug]

    Исправлена регрессия, вызванная #4326 в версии 1.2.12, когда использование declared_attr с миксином в сочетании с synonym() приводило к неправильному сопоставлению синонима с наследуемым подклассом.

    References: #4350

  • [orm] [declarative] [bug]

    Техника разрешения конфликтов столбцов, рассмотренная в разделе ``use_existing_column``R, теперь работает и для столбца Column, который также является первичным ключом. Ранее проверка на наличие столбцов первичного ключа, объявленных в подклассе с одним наследованием, происходила до того, как разрешалось передавать экземпляр столбца.

    References: #4352

sql

  • [sql] [feature]

    Рефакторинг SQLCompiler для отображения метода SQLCompiler.group_by_clause(), аналогичного методам SQLCompiler.order_by_clause() и SQLCompiler.limit_clause(), который может быть переопределен диалектами для настройки отображения GROUP BY. Pull request любезно предоставлен Samuel Chou.

  • [sql] [bug]

    Исправлена ошибка, при которой флаг Enum.create_constraint на типе данных Enum не распространялся на экземпляры типа, что влияло на такие случаи использования, как декларативные миксины и абстрактные базы.

    References: #4341

postgresql

  • [postgresql] [bug]

    Добавлена поддержка функции aggregate_order_by для приема нескольких элементов ORDER BY, ранее принимался только один элемент.

    References: #4337

mysql

  • [mysql] [bug]

    В список зарезервированных слов для MySQL добавлено слово function, которое теперь является ключевым словом в MySQL 8.0

    References: #4348

  • [mysql] [bug]

    Добавлено решение для ошибки MySQL #88718, появившейся в версии 8.0, когда при отражении ограничения по внешнему ключу не указывается правильная чувствительность регистра для ссылающегося столбца, что приводит к ошибкам при использовании отраженного ограничения, например, при использовании расширения automap. Решение проблемы заключается в дополнительном запросе к таблицам information_schema для получения правильного имени с учетом регистра.

    References: #4344

misc

  • [misc] [bug]

    Исправлена проблема, при которой часть внутренних функций вспомогательного языка передавала встроенному модулю Python __import__ неправильный аргумент в виде списка импортируемых модулей. Проблема не проявлялась в основной библиотеке, но могла вызывать проблемы во внешних приложениях, переопределяющих встроенный модуль __import__ или иным образом использующих его. Pull request любезно предоставлен Joe Urciuoli.

  • [misc] [bug] [py3k]

    Исправлены дополнительные предупреждения, выдаваемые Python 3.7 в связи с изменениями в организации пакетов Python collections и collections.abc. Предыдущие предупреждения collections были исправлены в версии 1.2.11. Pull request любезно предоставлен xtreak.

    References: #4339

  • [bug] [ext]

    Добавлен недостающий метод .index() в списочные коллекции ассоциаций в расширении association proxy.

1.2.12

Released: September 19, 2018

orm

  • [orm] [bug]

    Добавлена проверка в рамках очистки weakref для объекта InstanceState на наличие встроенного ключа dict, чтобы уменьшить количество сообщений об ошибках, выдаваемых при очистке во время завершения работы интерпретатора. Pull request любезно предоставлен Romuald Brunet.

  • [orm] [bug]

    Исправлена ошибка, при которой использование конструкции Lateral в сочетании с Query.join(), а также Query.select_entity_from() не приводило к адаптации клаузы к правой стороне соединения. «Боковой» вводит случай, когда правая часть соединения является коррелируемой. Ранее адаптация этой клаузы не рассматривалась. Заметим, что только в версии 1.2 selectable, вводимый функцией Query.subquery(), по-прежнему не адаптируется из-за #4304; selectable должен быть произведен функцией select(), чтобы быть правой стороной «бокового» соединения.

    References: #4334

  • [orm] [bug]

    Исправлена регрессия 1. 2 регрессия, вызванная #3472, при которой обработка столбца в стиле «updated_at» в контексте операции post-update происходила и для строки, которая должна быть удалена после обновления, то есть столбец с генератором значений на Python показывал уже удаленное значение, которое было выдано для UPDATE перед DELETE (что не соответствовало предыдущему поведению), а также то, что генератор значений, созданный на SQL, будет иметь атрибут expired, то есть предыдущее значение будет недоступно из-за того, что строка была удалена, а объект отсоединен от сессии. Логика «поствыборки», которая была добавлена в #3472, теперь полностью пропускается для объекта, который в конечном итоге должен быть удален.

    References: #4327

orm declarative

  • [orm] [declarative] [bug]

    Исправлена ошибка, из-за которой при получении дескриптора через вызываемую команду @declared_attr на подклассе уже отображенного класса декларативное сканирование атрибутов получало прокси выражения, передаваемого гибридным атрибутом на уровне класса, а не сам гибридный атрибут. Это привело бы к тому, что при просмотре в Mapper.all_orm_descriptors атрибут не сообщал бы о себе как о гибридном.

    References: #4326

postgresql

  • [postgresql] [bug]

    Исправлена ошибка в диалекте PostgreSQL, когда аргументы ключевого слова компилятора, такие как literal_binds=True, не распространялись на выражение DISTINCT ON.

    References: #4325

  • [postgresql] [bug]

    Исправлена функция array_agg(), которая является слегка измененной версией обычной функции array_agg(), чтобы также принимать входящий аргумент «тип» без принудительного создания ARRAY вокруг него, по существу то же самое, что было исправлено для функции generic в 1.1 в #4107.

    References: #4324

  • [postgresql] [bug]

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

    References: #4323

oracle

  • [oracle] [bug]

    Исправлена проблема для cx_Oracle 7.0, когда поведение Oracle param.getvalue() теперь возвращало список, а не одно скалярное значение, что нарушало логику автоинкремента во всем ядре и ORM. Флаг совместимости dml_ret_array_val используется для cx_Oracle 6.3 и 6.4, чтобы установить совместимое поведение с 7.0 и далее, для cx_Oracle 6.2.1 и ранее проверка номера версии возвращает к старой логике.

    References: #4335

misc

  • [bug] [ext]

    Исправлена проблема, когда BakedQuery не включал в ключ кэша конкретный класс запроса, используемый Session, что приводило к несовместимости при использовании пользовательских классов запросов, в частности ShardedQuery, который имеет несколько иные сигнатуры аргументов.

    References: #4328

1.2.11

Released: August 20, 2018

orm declarative

  • [orm] [declarative] [bug]

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

    References: #4321

sql

  • [sql] [bug]

    Исправлена проблема, тесно связанная с #3639, когда при использовании ColumnElement.self_group() выражение, представленное в булевом контексте на неродном булевом бэкенде, сравнивалось с 1/0, хотя оно уже является неявно булевым выражением. Хотя это не влияет на дружественные бэкенды (MySQL, SQLite), это не было обработано Oracle (и, возможно, SQL Server). Теперь вопрос о том, является ли выражение неявно булевым в любой базе данных, определяется заранее в качестве дополнительной проверки, чтобы не генерировать целочисленное сравнение в процессе компиляции оператора.

    References: #4320

  • [sql] [bug]

    В методы WithinGroup.over() и FunctionFilter.over() добавлены недостающие параметры оконных функций WithinGroup.over.range_ и WithinGroup.over.rows, что соответствует функции range/rows, добавленной в метод «over» функций SQL в составе #3049 в версии 1.1.

    References: #4322

  • [sql] [bug]

    Исправлена ошибка, при которой поддержка многотабличных операторов UPDATE и DELETE не рассматривала дополнительные элементы FROM в качестве целей для корреляции, когда с этим оператором также сочетался коррелированный SELECT. Это изменение теперь включает в себя то, что оператор SELECT в предложении WHERE для такого оператора будет пытаться автокоррелировать обратно к этим дополнительным таблицам в родительском UPDATE/DELETE или безусловно коррелировать, если используется Select.correlate(). Обратите внимание, что автокорреляция приводит к ошибке, если в результате оператор SELECT не будет иметь ни одного предложения FROM, что теперь может произойти, если родительский UPDATE/DELETE укажет те же таблицы в своем дополнительном наборе таблиц; для решения этой проблемы явно укажите Select.correlate().

    References: #4313

oracle

  • [oracle] [bug]

    Для cx_Oracle типы данных Integer теперь будут привязываться к «int», согласно рекомендациям разработчиков cx_Oracle. Ранее использование cx_Oracle.NUMBER приводило к потере точности в серии cx_Oracle 6.x.

    References: #4309

misc

  • [bug] [py3k]

    Начат импорт «collections» из «collections.abc» под Python 3.3 и выше для совместимости с Python 3.8. Pull request любезно предоставлен Натаниэлем Найтом.

  • [no_tags]

    Исправлена проблема, при которой имя «schema», используемое для базы данных SQLite в отражении таблицы, не приводило к корректному отражению имени схемы. Pull request любезно предоставлен Phillip Cloud.

1.2.10

Released: July 13, 2018

orm

  • [orm] [bug]

    Исправлена ошибка в конструкции Bundle, при которой размещение двух одноименных столбцов не дублировалось, если Bundle использовались как часть визуализируемого SQL, например, в ORDER BY или GROUP BY оператора.

    References: #4295

  • [orm] [bug]

    В версии 1.2.9 исправлена ошибка #4287, когда использование опции Load в сочетании с подстановочным символом строки приводило к ошибке типа TypeError.

    References: #4298

sql

  • [sql] [bug]

    Исправлена ошибка, при которой последовательность Sequence сбрасывалась явно перед любой ссылающейся на нее последовательностью Table, что при использовании MetaData.drop_all() приводило к сбою в том случае, если эта последовательность также участвует в серверном дефолте для данной таблицы. Теперь шаг, обрабатывающий последовательности, которые должны быть удалены с помощью не серверных функций умолчания столбцов, вызывается после удаления самой таблицы.

    References: #4300

1.2.9

Released: June 29, 2018

orm

  • [orm] [bug]

    Исправлена проблема, при которой цепочка из нескольких элементов join внутри Query.join() могла некорректно адаптироваться к предыдущей левой стороне, когда в цепочку объединялись классы наследования, имеющие один и тот же базовый класс.

    References: #3505

  • [orm] [bug]

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

    References: #4287

  • [orm] [bug]

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

    References: #4286

  • [orm] [bug]

    Исправлена регрессия, вызванная конструктором #4256 (который сам по себе является исправлением регрессии для #4228), которая нарушает недокументированное поведение, которое преобразовывало для не-последовательности сущностей, передаваемых непосредственно в конструктор Query, в одноэлементную последовательность. Хотя такое поведение никогда не поддерживалось и не документировалось, оно уже используется, поэтому было добавлено в качестве поведенческого контракта в Query.

    References: #4269

  • [orm] [bug]

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

    References: #4270

sql

  • [sql] [bug]

    В 1.2 исправлена ошибка #4147, связанная с тем, что в Table, у которого некоторые индексированные столбцы были переопределены на новые, как это происходит при переопределении столбцов во время отражения или при использовании Table.extend_existing, метод Table.tometadata() при попытке скопировать эти индексы давал сбой, поскольку они по-прежнему ссылались на замененный столбец. Теперь логика копирования учитывает это условие.

    References: #4279

mysql

  • [mysql] [bug]

    Исправлено удвоение знаков процента в диалекте mysql-connector-python, который не требует удвоения знаков процента. Кроме того, драйвер mysql-connector-python непоследовательно передает имена столбцов в cursor.description, поэтому был добавлен декодер для условного декодирования этих случайных иногда байтовых значений в юникод только в случае необходимости. Также улучшена тестовая поддержка mysql-connector-python, однако следует отметить, что этот драйвер по-прежнему имеет проблемы с юникодом, которые до сих пор не решены.

  • [mysql] [bug]

    Исправлена ошибка в отражении индексов, когда в MySQL 8.0 индекс, включающий ASC или DESC в спецификации индексированного столбца, не отражался корректно, поскольку в MySQL 8.0 появилась поддержка возврата этой информации в строке определения таблицы.

    References: #4293

  • [mysql] [bug]

    Исправлена ошибка в диалекте MySQLdb и его вариантах, таких как PyMySQL, когда дополнительная проверка «unicode returns» при подключении явно использует набор символов «utf8», что в MySQL 8.0 выдает предупреждение о необходимости использования utf8mb4. Теперь оно заменено на эквивалент utf8mb4. Также обновлена документация для диалекта MySQL, чтобы во всех примерах указывалось utf8mb4. Дополнительные изменения внесены в тестовый набор для использования наборов символов и баз данных utf8mb3 (при использовании utf8mb4 в некоторых крайних случаях возникают проблемы со сверткой), а также для поддержки изменений конфигурации по умолчанию, внесенных в MySQL 8.0, таких как explicit_defaults_for_timestamp, и новых ошибок, возникающих при недействительных индексах MyISAM.

    References: #4283

  • [mysql] [bug]

    Конструкция Update теперь вмещает объект Join, как это поддерживается в MySQL для UPDATE..FROM. Поскольку конструкция уже принимает объект alias для аналогичной цели, возможность UPDATE против не-таблицы уже подразумевалась, поэтому она была добавлена.

    References: #3645

sqlite

  • [sqlite] [bug]

    Исправлена проблема в тестовом наборе, когда в SQLite 3.24 добавлялось новое зарезервированное слово, которое конфликтовало с использованием в TypeReflectionTest. Pull request любезно предоставлен Nils Philippsen.

mssql

  • [mssql] [bug]

    Исправлена ошибка в отражении MSSQL, когда две одноименные таблицы в разных схемах имели одноименные ограничения первичного ключа, ограничения внешнего ключа, ссылающиеся на одну из таблиц, удваивали свои столбцы, что приводило к ошибкам. Pull request любезно предоставлен Шоном Данном.

    References: #4288

  • [mssql] [bug] [py3k]

    Исправлена проблема в диалекте SQL Server под Python 3, когда при работе с нестандартной базой данных SQL-сервера, не содержащей представлений «sys.dm_exec_sessions» или «sys.dm_pdw_nodes_exec_sessions», что приводило к невозможности получения уровня изоляции, повышение уровня ошибки приводило к ошибке UnboundLocalError.

    References: #4273

oracle

  • [oracle] [feature]

    Добавлено новое событие, используемое в настоящее время только диалектом cx_Oracle, DialectEvents.setiputsizes(). Это событие передает словарь объектов BindParameter в объекты типов, специфичных для DBAPI, которые после преобразования в имена параметров будут переданы методу cx_Oracle cursor.setinputsizes(). Это позволяет как наблюдать за процессом setinputsizes, так и изменять поведение типов данных, передаваемых в этот метод.

    References: #4290

  • [oracle] [bug] [mysql]

    Исправлен INSERT FROM SELECT с CTE для диалектов Oracle и MySQL, где CTE располагался над всем оператором, как это принято в других базах данных, однако Oracle и MariaDB 10.2 хотят, чтобы CTE находился под сегментом «INSERT». Обратите внимание, что диалекты Oracle и MySQL пока не работают, когда CTE применяется к подзапросу внутри оператора UPDATE или DELETE, поскольку CTE по-прежнему применяется сверху, а не внутри подзапроса.

    References: #4275

misc

  • [feature] [ext]

    Добавлен новый атрибут Query.lazy_loaded_from, который заполняется атрибутом InstanceState, использующим данный атрибут Query для ленивой загрузки отношения. Смысл этого заключается в том, что он служит подсказкой для использования функции горизонтального шардинга, так что идентификационный маркер состояния может быть использован в качестве идентификационного маркера по умолчанию для запроса в функции id_chooser().

    References: #4243

  • [bug] [py3k]

    Заменено использование inspect.formatargspec() вендорной версией, скопированной из стандартной библиотеки Python, поскольку inspect.formatargspec() устарел и начиная с Python 3.7.0 выдает предупреждение.

    References: #4291

1.2.8

Released: May 28, 2018

orm

  • [orm] [bug]

    Исправлена регрессия в 1.2.7, вызванная #4228, которая сама по себе исправляла регрессию уровня 1.2, когда вызываемая функция query_cls, передаваемая в Session, считалась подклассом Query с доступностью методов класса, а не произвольным вызываемым объектом. В частности, в примере с кэшированием собачьей кучи показано, что query_cls является функцией, а не подклассом Query.

    References: #4256

  • [orm] [bug]

    Исправлена давняя ошибка, возникшая в версии 1.0, которая не позволяла использовать пользовательский MapperOption, изменяющий _параметры объекта Query для ленивой загрузки, поскольку сам ленивый загрузчик перезаписывал эти параметры. Это относится к примеру «временного диапазона», приведенному в вики. Заметим, однако, что метод Query.populate_existing() теперь необходим для того, чтобы переписать параметры отображения, связанные с объектом, уже загруженным в карту идентичности.

    В рамках этого изменения пользовательское определение MapperOption теперь будет приводить к тому, что ленивые загрузчики, связанные с целевым объектом, по умолчанию будут использовать непеченый запрос, если не реализован метод MapperOption._generate_cache_key(). В частности, это устраняет одну регрессию, возникшую при использовании «продвинутого» примера dogpile.cache, который не возвращал кэшированные результаты, а вместо этого выдавал SQL из-за несовместимости с загрузчиком печеных запросов; благодаря этому изменению опция RelationshipCache, включенная во многие релизы в пример dogpile, полностью отключает «печеный» запрос. Отметим, что в рамках выпуска #4258 пример dogpile также модернизирован, чтобы избежать обеих этих проблем.

    References: #4128

  • [orm] [bug]

    Исправлена ошибка, при которой новый метод Result.with_post_criteria() некорректно взаимодействовал с загрузчиком подзапросов, в результате чего «пост-критерии» не применялись к встроенным загрузчикам подзапросов. Это связано с #4128 в том, что функция post criteria теперь используется ленивым загрузчиком.

  • [orm] [bug]

    Обновлен пример dogpile.caching для включения новых структур, учитывающих «запеченную» систему запросов, которая по умолчанию используется в ленивых загрузчиках и некоторых нетерпеливых загрузчиках отношений. Примеры dogpile.caching «relationship_caching» и «advanced» также были сломаны из-за #4256. Проблема здесь также решена исправлением в #4128.

    References: #4258

engine

  • [engine] [bug]

    Исправлена проблема, связанная с тем, что если во время выполнения последовательности «сброс при возврате» пула соединений возникала ошибка разъединения в сочетании с явной транзакцией, открытой против окружающего объекта Connection (например, при вызове Session.close() без отката или фиксации, или при вызове Connection.close() без предварительного закрытия транзакции, объявленной с помощью Connection.begin()), то возникал двойной контроль, который мог привести к одновременным проверкам одного и того же соединения. Теперь условие double-checkin в целом предотвращается утверждением, а также исправлен конкретный сценарий double-checkin.

    References: #4252

  • [engine] [bug]

    Исправлена проблема утечки ссылок, когда на значения словаря параметров, используемые при выполнении оператора, оставались ссылки в «скомпилированном кэше», в результате хранения представления ключей, используемого в Python 3 словарем keys(). Pull request любезно предоставлен Оливье Гризелем.

sql

  • [sql] [bug]

    Исправлена проблема, при которой сообщение об ошибке «неоднозначный литерал», используемое при интерпретации литеральных значений как значений SQL-выражений, встречало значение кортежа и не могло правильно отформатировать сообщение. Pull request любезно предоставлен Мигелем Вентурой.

mssql

  • [mssql] [bug]

    Исправлена регрессия в версии 1.2, вызванная использованием #4061, когда тип SQL Server «BIT» считался «родным булевым». Целью было избежать создания ограничения CHECK на столбец, однако более серьезная проблема заключается в том, что значение BIT не ведет себя как константа true/false и не может быть интерпретировано как самостоятельное выражение, например, «WHERE <column>». Теперь диалект SQL Server возвращается к неродному значению boolean, но с дополнительным флагом, который все равно позволяет избежать создания ограничения CHECK.

    References: #4250

oracle

  • [oracle] [bug]

    Типы данных Oracle BINARY_FLOAT и BINARY_DOUBLE теперь участвуют в cx_Oracle.setinputsizes(), передавая NATIVE_FLOAT, чтобы поддерживать значение NaN. Кроме того, BINARY_FLOAT, BINARY_DOUBLE и DOUBLE_PRECISION теперь являются подклассами Float, поскольку это типы данных с плавающей точкой, а не десятичные. Эти типы данных уже устанавливали флаг Float.asdecimal по умолчанию в False, что соответствует тому, что уже делает Float.

    References: #4264

  • [oracle] [bug]

    Добавлены возможности отражения для типов данных BINARY_FLOAT, BINARY_DOUBLE.

  • [oracle] [bug]

    Изменен диалект Oracle таким образом, что при использовании типа Integer для функции setinputsizes() устанавливается тип cx_Oracle.NUMERIC. В SQLAlchemy 1.1 и более ранних версиях cx_Oracle.NUMERIC передавался для всех числовых типов безусловно, а в 1.2 это было убрано, чтобы обеспечить более высокую точность вычислений. Тем не менее, для целых чисел некоторые базы данных/клиенты не смогут преобразовать булевы значения True/False в целые числа, что приводит к регрессивному поведению при использовании SQLAlchemy 1.2. В целом, кажется, что логика setinputsizes должна быть гораздо более гибкой в будущем, так что это - начало пути.

    References: #4259

tests

  • [tests] [bug]

    Исправлена ошибка в тестовом наборе, когда если внешний диалект возвращал None для server_version_info, то логика исключения выдавала ошибку AttributeError.

    References: #4249

misc

  • [bug] [ext]

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

    References: #4247

  • [bug] [ext]

    Исправлено состояние гонки, которое могло возникнуть при использовании automap AutomapBase.prepare() в многопоточном контексте против других потоков, которые могли вызывать configure_mappers() в результате использования других мапперов. Незавершенная работа automap с отображением особенно чувствительна к тому, что ее может перетянуть на себя шаг configure_mappers(), приводящий к ошибкам.

    References: #4266

1.2.7

Released: April 20, 2018

orm

  • [orm] [bug]

    В версии 1.2 исправлена ошибка в функции sharded query, когда новый элемент «identity_token» некорректно учитывался в рамках операции lazy load при поиске в карте идентификации связанного с ним элемента «многие-к-одному». Новое поведение позволит использовать «id_chooser» для определения оптимального идентификационного ключа для получения из карты идентификации. Для этого в результате рефакторинга подхода «identity_token» в версии 1.2 в реализацию ShardedQuery были внесены некоторые незначительные изменения, на которые следует обратить внимание при использовании других производных этого класса.

    References: #4228

  • [orm] [bug]

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

    References: #4241

sql

  • [sql] [bug]

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

    References: #4231

postgresql

  • [postgresql] [feature]

    Добавлен новый PG-тип REGCLASS, который помогает приводить имена таблиц к значениям OID. Pull request любезно предоставлен Себастьяном Банком.

    References: #4160

  • [postgresql] [bug]

    Исправлена ошибка, при которой специальный оператор «not equals» для типов данных PostgreSQL «range», таких как DATERANGE, не приводил к выводу значения «IS NOT NULL» при сравнении со значением Python None.

    References: #4229

mssql

  • [mssql] [bug]

    Исправлена регрессия 1.2, вызванная #4060, когда запрос, используемый для отражения кросс-схемных внешних ключей SQL Server, некорректно ограничивал критерии.

    References: #4234

oracle

  • [oracle] [bug]

    Тип данных Oracle NUMBER отражается как INTEGER, если точность равна NULL, а масштаб равен нулю, так как именно таким образом значения INTEGER возвращаются при отражении из таблиц Oracle. Pull request любезно предоставлен Кентом Бауэром.

1.2.6

Released: March 30, 2018

orm

  • [orm] [bug]

    Исправлена ошибка, при которой использование Mutable.associate_with() или Mutable.as_mutable() в сочетании с классом, у которого установлены непервичные отображения с альтернативными именами атрибутов, приводило к ошибке атрибута. Поскольку непервичные отображения не используются для персистентности, расширение mutable теперь исключает непервичные отображения из своих шагов инструментации.

    References: #4215

engine

  • [engine] [bug]

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

    References: #4225

sql

  • [sql] [bug]

    Исправлена регрессия, возникшая после предыдущего исправления #4204 в версии 1.2.5, когда CTE, ссылающийся на себя после вызова метода CTE.alias(), некорректно ссылался на себя.

    References: #4204

postgresql

  • [postgresql] [feature]

    Добавлена поддержка «PARTITION BY» в определениях таблиц PostgreSQL, с использованием «postgresql_partition_by». Pull request любезно предоставлен Всеволодом Соловьевым.

mssql

  • [mssql] [bug]

    Настроено определение версии SQL Server для pyodbc таким образом, чтобы оно допускало только числовые токены, отсеивая нецелые, поскольку диалект выполняет числовые сравнения кортежей с этим значением. В любом случае это справедливо для всех известных драйверов SQL Server / pyodbc.

    References: #4227

oracle

  • [oracle] [bug]

    Минимальная поддерживаемая версия cx_Oracle - 5.2 (июнь 2015 года). Ранее диалект утверждал, что поддерживается версия 5.0, но начиная с версии 1.2.2 мы используем некоторые символы, которые появились только в версии 5.2.

    References: #4211

misc

  • [bug] [declarative]

    Устранено предупреждение, выдаваемое при вызове методов __table_args__, __mapper_args__, именованных методом @declared_attr, из не сопоставленного декларативного миксина. Вызов этих методов напрямую документирован как подход, который следует использовать при переопределении одного из этих методов в сопоставленном классе. Предупреждение по-прежнему выдается для обычных имен атрибутов.

    References: #4221

1.2.5

Released: March 6, 2018

orm

  • [orm] [feature]

    Добавлена новая функция Query.only_return_tuples(). Приводит к тому, что объект Query возвращает объекты кортежей с ключами безусловно, даже если запрос выполняется к одной сущности. Pull request любезно предоставлен Эриком Аткиным.

  • [orm] [bug]

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

    References: #4199

  • [orm] [bug]

    Исправлена ошибка 1.2, когда опция маппера, содержащая объект AliasedClass, что характерно при использовании метода QueryableAttribute.of_type(), не могла быть замаринована. В версии 1.1 было принято опускать объекты псевдоклассов из пути, поэтому это поведение восстановлено.

    References: #4209

sql

  • [sql] [bug]

    Исправлена ошибка в методе :class:.`CTE` construct along the same lines as that of #4204 where a CTE that was aliased would not copy itself correctly during a «clone» operation as is frequent within the ORM as well as when using the ClauseElement.params().

    References: #4210

  • [sql] [bug]

    Исправлена ошибка в рендеринге CTE, когда для CTE, превращенного в Alias, не отображалось должным образом предложение «ctename AS aliasname», если в предложении FROM было более одной ссылки на CTE.

    References: #4204

  • [sql] [bug]

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

    References: #4198

postgresql

  • [postgresql] [bug] [py3k]

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

    This change is also backported to: 1.1.18

    References: #4208

mysql

  • [mysql] [bug]

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

    This change is also backported to: 1.1.18

    References: #4205

1.2.4

Released: February 22, 2018

orm

  • [orm] [bug]

    Исправлена ошибка 1.2 в функции версионирования ORM, когда отображение на select() или alias(), в котором также использовался столбец версионирования для базовой таблицы, было неудачным из-за проверки, добавленной как часть #3673.

    References: #4193

engine

  • [engine] [bug]

    Исправлена регрессия, возникшая в версии 1.2.3 из-за исправления из #4181, когда изменения в системе событий Engine и OptionEngine не учитывали удаления событий, что при вызове на уровне класса приводило к появлению AttributeError.

    References: #4190

sql

  • [sql] [bug]

    Исправлена ошибка, при которой в CTE-выражениях имя или псевдоним не заключались в кавычки, если имя чувствительно к регистру или иным образом требует заключения в кавычки. Pull request любезно предоставлен Эриком Аткином.

    References: #4197

1.2.3

Released: February 16, 2018

orm

  • [orm] [feature]

    В функцию set_attribute() добавлен новый аргумент set_attribute.inititator, позволяющий распространять маркер события, полученный от функции-слушателя, на последующие события набора.

  • [orm] [bug]

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

    This change is also backported to: 1.1.16

    References: #4187

  • [orm] [bug]

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

    This change is also backported to: 1.1.16

    References: #4185

  • [orm] [bug]

    Исправлена ошибка, при которой объект Bundle некорректно сообщал о первичном объекте Mapper, представленном пучком, если таковой имелся. Непосредственным побочным эффектом этой проблемы было то, что новая стратегия загрузчика selectinload не работала с расширением горизонтального шардинга.

    References: #4175

  • [orm] [bug]

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

    References: #4188

  • [orm] [bug]

    Исправлена ошибка, при которой помощник события reconstructor() не распознавался, если он применялся к методу __init__() сопоставленного класса.

    References: #4178

engine

  • [engine] [bug]

    Исправлена ошибка, при которой события, связанные с Engine на уровне класса, удваивались при использовании метода Engine.execution_options(). Для этого полуприватный класс OptionEngine больше не принимает события непосредственно на уровне класса и будет выдавать ошибку; класс распространяет события только на уровне класса от своего родителя Engine. События на уровне экземпляров продолжают работать как и раньше.

    References: #4181

  • [engine] [bug]

    Объект URL теперь позволяет несколько раз указывать ключи запроса, значения которых будут объединены в список. Это сделано для поддержки функции plugins, задокументированной в CreateEnginePlugin, где указано, что «plugin» может передаваться несколько раз. Кроме того, имена плагинов могут быть переданы в create_engine() вне URL с помощью нового параметра create_engine.plugins.

    References: #4170

sql

  • [sql] [feature]

    Добавлена поддержка Enum для сохранения значений перечисления, а не ключей, при использовании перечислимого объекта в стиле Python pep-435. Пользователь предоставляет вызываемую функцию, которая возвращает сохраняемые строковые значения. Это позволяет перечислениям, не содержащим строковых значений, также быть персистируемыми. Pull request любезно предоставлен Джоном Снайдером.

    References: #3906

  • [sql] [bug]

    Исправлена ошибка, из-за которой тип Enum некорректно обрабатывал «псевдонимы» перечислений, когда более одного ключа ссылались на одно и то же значение. Pull request любезно предоставлен Даниэлем Кнеллом.

    References: #4180

postgresql

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.16

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.16

sqlite

  • [sqlite] [bug]

    Исправлена ошибка импорта, возникающая, когда на платформе не установлены ни pysqlite2, ни sqlite3, в результате чего возникает ошибка импорта, связанная с sqlite3, а не с pysqlite2, которая не является реальной причиной сбоя. Pull request courtesy Robin.

oracle

  • [oracle] [feature]

    Опции ON DELETE для внешних ключей теперь являются частью Oracle reflection. Oracle не поддерживает каскады ON UPDATE. Pull request любезно предоставлен Мирославом Шубернецким.

  • [oracle] [bug]

    Исправлена ошибка в определении отключения cx_Oracle, используемая в pre_ping и других функциях, когда ошибка могла быть выдана как DatabaseError, содержащая числовой код ошибки; ранее мы не проверяли в этом случае код отключения.

    References: #4182

tests

  • [tests] [bug]

    Тест, добавленный в 1.2, который, как предполагалось, подтверждает поведение Python 2.7, оказывается, подтверждает это поведение только в Python 2.7.8. Ошибка Python #8743 по-прежнему влияет на сравнение множеств в Python 2.7.7 и более ранних версиях, поэтому тест, связанный с AssociationSet, больше не работает для этих старых версий Python 2.7.

    References: #3265

misc

  • [bug] [pool]

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

    This change is also backported to: 1.1.16

    References: #4184

1.2.2

Released: January 24, 2018

orm

  • [orm] [bug]

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

    References: #4171

mysql

  • [mysql] [bug]

    В диалект MySQL 8.0 добавлено больше зарезервированных слов для целей цитирования. Pull request любезно предоставлен Riccardo Magliocchetti.

mssql

  • [mssql] [bug]

    В список кодов ошибок, которые считаются отключением для ODBC / MSSQL-сервера, добавлен код ошибки ODBC 10054.

    References: #4164

oracle

  • [oracle] [bug]

    Диалект cx_Oracle теперь вызывает функцию setinputsizes() с cx_Oracle.NCHAR безусловно, если используется тип данных NVARCHAR2, в SQLAlchemy соответствующий sqltypes.Unicode(). По мнению автора cx_Oracle, это позволяет выполнять корректные преобразования в клиенте Oracle независимо от настройки параметра NLS_NCHAR_CHARACTERSET.

    References: #4163

1.2.1

Released: January 15, 2018

orm

  • [orm] [bug]

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

    This change is also backported to: 1.1.16

    References: #4151

  • [orm] [bug]

    Исправлена ошибка, когда при изменении формата pickle объекта Load / _UnboundLoad (например, опции загрузчика), __setstate__() вызывал ошибку UnboundLocalError для объекта, полученного в устаревшем формате, хотя попытка сделать это была предпринята. теперь добавлены тесты для проверки работоспособности.

    References: #4159

  • [orm] [bug]

    Исправлена ошибка, вызванная новой схемой кэширования lazyload в #3954, когда запрос, использующий опции загрузчика с параметром of_type, приводил к тому, что lazyload несвязанных путей завершался с ошибкой TypeError.

    References: #4153

  • [orm] [bug]

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

    References: #4156

sql

  • [sql] [bug]

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

    This change is also backported to: 1.1.16

    References: #4162

mssql

  • [mssql] [bug]

    В версии 1.2 исправлена ошибка, при которой вновь исправленное цитирование имен collation в #3785 нарушало работу SQL Server, который явно не понимает цитируемое имя collation. Вопрос о том, заключать ли имена смешанного регистра в кавычки или нет, теперь отложен на уровень диалекта, так что каждый диалект может готовить эти идентификаторы напрямую.

    References: #4154

oracle

  • [oracle] [bug]

    Исправлена ошибка, при которой удаление большинства правил setinputsizes из диалекта cx_Oracle влияло на способность типа данных TIMESTAMP извлекать дробные секунды.

    References: #4157

  • [oracle] [bug]

    Исправлена ошибка в импорте Oracle, когда пропущенная запятая приводила к появлению неопределенного символа. Pull request любезно предоставлен Мирославом Шубернецким.

tests

  • [tests] [bug]

    Из публичного набора тестов удалено правило требований, специфичное для oracle, которое мешало работе наборов диалектов сторонних разработчиков.

  • [tests] [bug]

    Добавлено новое правило исключения group_by_complex_expression, которое отключает тесты, использующие «GROUP BY <expr>», что, по-видимому, не подходит, по крайней мере, для двух сторонних диалектов.

misc

  • [bug] [ext]

    Исправлена регрессия в ассоциативном прокси из-за #3769 (разрешение цепочки any() / has()), когда contains() против ассоциативного прокси, соединенного в цепочку в виде (o2m relationship, associationproxy(m2o relationship, m2o relationship)), приводила к ошибке повторного применения contains() на последнем звене цепочки.

    References: #4150

1.2.0

Released: December 27, 2017

orm

  • [orm] [feature]

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

    References: #4137

  • [orm] [bug] [ext]

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

    This change is also backported to: 1.1.15

    References: #4116

  • [orm] [bug]

    Исправлена ошибка в опции запроса contains_eager(), когда при использовании пути, использующего PropComparator.of_type() для ссылки на подкласс на более чем одном уровне соединений, требовалось, чтобы аргумент «alias» также имел тот же подтип, чтобы избежать добавления ненужных предложений FROM в запрос; кроме того, использование contains_eager() в подклассах, использующих aliased() объекты подклассов в качестве аргумента PropComparator.of_type(), также будет корректно отображаться.

    References: #4130

  • [orm] [bug]

    Метод Query.exists() теперь будет отключать загрузчики на время отрисовки запроса. Ранее при этом излишне отображались джойны с ускоренной загрузкой, а также генерировались запросы с ускоренной загрузкой подзапросов. Новое поведение соответствует поведению метода Query.subquery().

    References: #4032

orm declarative

  • [orm] [declarative] [bug]

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

    This change is also backported to: 1.1.15

    References: #4124

engine

  • [engine] [feature]

    Атрибутом «password» объекта URL теперь может быть любой пользовательский или подклассифицированный строковый объект, отвечающий встроенному модулю Python str(). Переданный объект будет сохранен как член данных URL.password_original и будет использоваться при чтении атрибута URL.password для получения строкового значения.

    References: #4089

sql

  • [sql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4126

  • [sql] [bug]

    Новая функция «автоэскейп», появившаяся в Новая опция «autoescape» для startswith(), endswith() в версии 1.2.0b2, стала полностью автоматической; теперь символ эскейпа по умолчанию - передняя косая черта "/" и применяется к процентам, подчеркиваниям, а также к самому символу эскейпа, что обеспечивает полностью автоматический эскейп. Символ также может быть изменен с помощью параметра «escape».

    References: #2694

  • [sql] [bug]

    Исправлена ошибка, при которой метод Table.tometadata() не мог корректно работать с объектами Index, не состоящими из простых выражений столбцов, например, индексами по отношению к конструкции text(), индексами, использующими SQL-выражения или func, и т.д. Теперь процедура полностью копирует выражения в новый объект Index, заменяя все привязанные к таблице объекты Column на объекты целевой таблицы.

    References: #4147

  • [sql] [bug]

    Изменено «имя посещения» ColumnElement с «column» на «column_element», чтобы при использовании этого элемента в качестве основы для пользовательского SQL-элемента не предполагалось, что он будет вести себя как привязанный к таблице ColumnClause при обработке различными утилитами обхода SQL, как это обычно делается в ORM.

    References: #4142

  • [sql] [bug] [ext]

    Исправлена проблема в типе данных ARRAY, по сути, аналогичная проблеме #3832, за исключением регрессии, когда события прикрепления колонок поверх ARRAY срабатывали некорректно, что мешало работе систем, которые на это полагались. Ключевым случаем, который был нарушен в результате этого, является использование миксинов для объявления колонок, использующих MutableList.as_mutable().

    References: #4141

  • [sql] [bug]

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

    References: #4140

  • [sql] [enhancement]

    Реализован синтаксис «DELETE..FROM» для PostgreSQL, MySQL, MS SQL Server (а также в неподдерживаемом диалекте Sybase) аналогично тому, как работает «UPDATE..FROM». Оператор DELETE, обращающийся к нескольким таблицам, переключается в режим «многотабличности» и выводит соответствующее предложение «USING» или многотабличное предложение «FROM» в соответствии с пониманием базы данных. Pull request любезно предоставлен Питером Малдером (Pieter Mulder).

    References: #959

postgresql

  • [postgresql] [feature]

    Добавлен новый тип данных MONEY. Pull request любезно предоставлен Cleber J Santos.

mysql

  • [mysql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4120

  • [mysql] [bug]

    Исправлена регрессия из выпуска 1.2.0b3, когда сравнение версий «MariaDB» для некоторых конкретных строк версий MariaDB под Python 3 могло завершиться неудачей.

    References: #4115

mssql

  • [mssql] [bug]

    Исправлена ошибка, при которой типы данных sqltypes.BINARY и sqltypes.VARBINARY не включали корректные обработчики связанных значений для pyodbc, что позволяет передавать значение pyodbc.NullParam, которое помогает при работе с FreeTDS.

    References: #4121

oracle

  • [oracle] [bug]

    Добавлены некоторые дополнительные правила для полноценной обработки значений Decimal('Infinity'), Decimal('-Infinity') с числовыми значениями cx_Oracle при использовании asdecimal=True.

    References: #4064

misc

  • [misc] [feature]

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

  • [enhancement] [ext]

    В систему запеченных запросов добавлен новый метод Result.with_post_criteria(), позволяющий выполнять не модифицирующие SQL преобразования после извлечения запроса из кэша. Кроме всего прочего, этот метод может быть использован вместе с ShardedQuery для установки идентификатора шарда. Метод ShardedQuery также был модифицирован таким образом, чтобы его метод ShardedQuery.get() корректно взаимодействовал с методом Result.

    References: #4135

1.2.0b3

Released: October 13, 2017

orm

  • [orm] [bug]

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

    This change is also backported to: 1.1.15

    References: #4078

  • [orm] [bug]

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

    This change is also backported to: 1.1.15

    References: #4103

  • [orm] [bug]

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

    This change is also backported to: 1.1.14

    References: #4069

  • [orm] [bug]

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

    This change is also backported to: 1.1.14

    References: #4048

  • [orm] [bug]

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

    This change is also backported to: 1.1.14

    References: #4056

  • [orm] [bug]

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

    This change is also backported to: 1.1.14

    References: #4067

  • [orm] [bug]

    Исправлена регрессия, появившаяся в версии 1.2.0b1 из-за #3934, когда Session не мог «деактивировать» транзакцию, если откат был неудачным (целевая проблема - когда MySQL теряет отслеживание SAVEPOINT). Это приводило к тому, что последующий вызов Session.rollback() вызывал ошибку во второй раз, вместо того чтобы завершить транзакцию и вернуть Session в состояние ACTIVE.

    References: #4050

  • [orm] [bug]

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

    References: #4084

  • [orm] [bug]

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

    Примечание

    Данное исправление было случайно объединено во время выпуска версии 1.2.0b3 и не было добавлено в журнал изменений. Данное примечание было добавлено в журнал изменений задним числом, начиная с версии 1.2.13.

    References: #4040

  • [orm] [bug]

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

    References: #4026

  • [orm] [bug]

    Убраны предупреждения, выдаваемые при достижении порога LRU-кэша, используемого стратегиями mapper и loader; вначале это предупреждение служило для защиты от генерации избыточных кэш-ключей, но затем стало, по сути, проверкой антипаттерна «создание большого количества движков». Хотя это все еще антипаттерн, наличие тестовых наборов, которые как создают движок на каждый тест, так и повышают уровень предупреждений, будет неудобством; не стоит критично менять архитектуру таких тестовых наборов только ради этого предупреждения (хотя набор движков на каждый тест всегда лучше).

    References: #4071

  • [orm] [bug]

    Исправлена регрессия, при которой использование опции undefer_group() в сочетании с опцией отношения с ленивой загрузкой приводило к ошибке атрибута, связанной с ошибкой в генерации ключей кэша SQL, добавленной в 1.2 в качестве части #3954.

    References: #4049

  • [orm] [bug]

    Модифицировано изменение, внесенное в оценщик обновлений/удалений ORM в #3366 таким образом, что если в обновлении или удалении присутствует выражение с неотображенным столбцом, то если оценщик может сопоставить его имя с отображенными столбцами целевого класса, то выдается предупреждение, а не возникает ошибка UnevaluatableError. По сути, это поведение, существовавшее до версии 1.2, и оно должно обеспечить миграцию приложений, которые в настоящее время полагаются на этот паттерн. Однако если заданное имя атрибута не может быть сопоставлено с колонками отображателя, то UnevaluatableError все равно будет выдано, что и было исправлено в #3366.

    References: #4073

orm declarative

  • [orm] [declarative] [bug]

    При попытке подкласса переопределить атрибут, объявленный в суперклассе с помощью @declared_attr.cascading, выдается предупреждение о том, что переопределенный атрибут будет проигнорирован. Этот вариант использования не может быть полностью поддержан вплоть до последующих подклассов без более сложной разработки, поэтому для согласованности «каскадирование» соблюдается на всем пути вниз, независимо от переопределения атрибутов.

    References: #4091

  • [orm] [declarative] [bug]

    Если атрибут @declared_attr.cascading используется со специальным декларативным именем, например __tablename__, то выдается предупреждение, так как это не имеет никакого эффекта.

    References: #4092

engine

  • [engine] [feature]

    В ResultProxy добавлены методы __next__() и next(), чтобы встроенная функция next() работала с объектом напрямую. ResultProxy уже давно имеет метод __iter__(), который уже позволяет ему реагировать на встроенную функцию iter(). Реализация для __iter__() осталась без изменений, так как тестирование производительности показало, что итерация с использованием метода __next__() с StopIteration происходит примерно на 20% медленнее как в Python 2.7, так и в 3.6.

    References: #4077

  • [engine] [bug]

    Внесены некоторые изменения в Pool и Connection, чтобы логика восстановления не выполнялась под перехватом исключений для pool.Empty, AttributeError, так как при неудачной операции восстановления Python 3 создает вводящую в заблуждение трассировку стека, ссылаясь на Empty / AttributeError как на причину, в то время как на самом деле эти перехваты исключений являются частью потока управления.

    References: #4028

sql

  • [sql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4093

  • [sql] [bug]

    Добавлен новый метод DefaultExecutionContext.get_current_parameters(), который используется в генераторе значений по умолчанию на основе функции для получения текущих параметров, передаваемых в оператор. Новая функция отличается от атрибута DefaultExecutionContext.current_parameters тем, что в ней также предусмотрена опциональная группировка параметров, соответствующих многозначной конструкции «вставка». Ранее определить подмножество параметров, относящихся к вызову функции, не представлялось возможным.

    References: #4075

  • [sql] [bug]

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

    References: #4087

  • [sql] [bug]

    В релизе 1.1 тип Boolean был нарушен в том плане, что принуждение к булевым значениям через bool() происходило для бэкендов, не имеющих функции «native boolean», но не происходило для бэкендов с «native boolean», то есть строка "0" теперь вела себя непоследовательно. После опроса было решено, что небулевые значения должны вызывать ошибку, особенно в неоднозначном случае строки "0"; поэтому тип данных Boolean теперь будет вызывать ошибку ValueError, если входящее значение не находится в диапазоне None, True, False, 1, 0.

    References: #4102

  • [sql] [bug]

    Уточнено поведение оператора Operators.op(), в результате чего во всех случаях, если флаг Operators.op.is_comparison установлен в True, возвращаемый тип результирующего выражения будет Boolean, а если флаг False, то возвращаемый тип результирующего выражения будет соответствовать типу выражения, стоящего слева, что является типичным поведением по умолчанию для других операторов. Также добавлен новый параметр Operators.op.return_type, а также вспомогательный метод Operators.bool_op().

    References: #4063

  • [sql] [bug]

    Внутренние усовершенствования типов Enum, Interval и Boolean, которые теперь расширяют общий миксин Emulated, указывающий на тип, обеспечивающий эмуляцию нативного типа БД на стороне Python и переходящий на нативный тип БД при использовании поддерживающего бэкенда. Тип PostgreSQL INTERVAL при непосредственном использовании теперь будет включать корректные правила приведения типов для SQL-выражений, которые также действуют для Interval (например, добавление даты к интервалу дает datetime).

    References: #4088

postgresql

  • [postgresql] [feature]

    В диалект psycopg2 добавлен новый флаг use_batch_mode. Этот флаг позволяет использовать расширение psycopg2 psycopg2.extras.execute_batch при обращении Engine к cursor.executemany(). Это расширение обеспечивает критический прирост производительности более чем на порядок при пакетном выполнении операторов INSERT. По умолчанию флаг равен False, так как пока он считается экспериментальным.

    References: #4109

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4006

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4107

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4074

  • [postgresql] [bug]

    Исправлена ошибка, при которой драйвер pg8000 терпел неудачу при использовании MetaData.reflect() с именем схемы, так как имя схемы передавалось в виде объекта «quoted_name», являющегося подклассом string, который pg8000 не распознает. Тип quoted_name добавляется в коллекцию py_types pg8000 при подключении.

    References: #4041

  • [postgresql] [bug]

    Включена поддержка UUID для драйвера pg8000, который поддерживает встроенные в Python обходные пути uuid для этого типа данных. Однако массивы UUID по-прежнему не поддерживаются.

    References: #4016

mysql

  • [mysql] [bug]

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

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

    This change is also backported to: 1.1.15

    References: #4097

  • [mysql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4096

  • [mysql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4098

  • [mysql] [bug]

    Изменено название атрибута .values новой конструкции MySQL INSERT…ON DUPLICATE KEY UPDATE на .inserted, так как Insert уже имеет метод Insert.values(). Атрибут .inserted в конечном итоге представляет собой функцию MySQL VALUES().

    References: #4072

sqlite

  • [sqlite] [bug]

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

    This change is also backported to: 1.1.15

    References: #4099

mssql

  • [mssql] [feature]

    Добавлен новый тип данных TIMESTAMP, который корректно работает как двоичный тип данных для SQL Server, а не как тип datetime, поскольку SQL Server здесь нарушает стандарт SQL. Также добавлен тип ROWVERSION, поскольку тип «TIMESTAMP» в SQL Server устарел в пользу ROWVERSION.

    References: #4086

  • [mssql] [feature]

    В диалекты PyODBC и pymssql добавлена поддержка уровня изоляции «AUTOCOMMIT», устанавливаемого через Connection.execution_options(). Этот уровень изоляции устанавливает соответствующие флаги, специфичные для DBAPI, на базовом объекте соединения.

    References: #4058

  • [mssql] [bug]

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

    This change is also backported to: 1.1.15

    References: #4095

  • [mssql] [bug]

    SQL Server поддерживает то, что в SQLAlchemy называют «родным булевым» типом BIT, поскольку этот тип принимает только 0 или 1, а DBAPI возвращают его значение как True/False. Таким образом, диалекты SQL Server теперь поддерживают «родную булеву», поскольку для типа данных Boolean не генерируется ограничение CHECK. Единственным отличием от других «родных» булевых является отсутствие констант «true» / «false», поэтому здесь по-прежнему отображаются «1» и «0».

    References: #4061

  • [mssql] [bug]

    Исправлен диалект pymssql таким образом, что знаки процента в тексте SQL, например, в выражениях с модулями или в буквальных текстовых значениях, не удваиваются, как это, по-видимому, ожидает pymssql. Это происходит несмотря на то, что в pymssql DBAPI используется стиль параметра «pyformat», который сам считает знак процента значимым.

    References: #4057

  • [mssql] [bug]

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

    References: #4060

  • [mssql] [bug] [orm]

    Добавлен новый класс «rowcount support» для диалектов, специфичный для случаев, когда используется «RETURNING», что на SQL Server выглядит как «OUTPUT inserted», поскольку бэкенд PyODBC не может дать нам rowcount в операциях UPDATE или DELETE, когда действует OUTPUT. В первую очередь это влияет на ORM, когда при обновлении строки, содержащей вычисленные сервером значения, возникает ошибка, если бэкенд не возвращает ожидаемое количество строк. Теперь PyODBC заявляет, что он поддерживает подсчет строк, за исключением случаев, когда присутствует OUTPUT.inserted, что учитывается ORM при выполнении операции flush для определения того, будет ли он искать подсчет строк.

    References: #4062

  • [mssql] [bug] [orm]

    Включен флаг «sane_rowcount» для диалекта pymssql, что означает, что DBAPI теперь сообщает корректное количество строк, затронутых операциями UPDATE или DELETE. Это в основном влияет на функцию версионности ORM, поскольку теперь она может проверять количество затронутых строк на целевой версии.

  • [mssql] [bug]

    В отражение индексов SQL Server добавлено правило, игнорирующее так называемый «кучный» индекс, который неявно присутствует в таблице, в которой не указан кластеризованный индекс.

    References: #4059

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.1.13, 1.0.19

    References: #4035

  • [oracle] [bug]

    Частичная поддержка сохранения и получения значения Oracle «бесконечность» реализована в cx_Oracle, при этом используются только плавающие значения Python, например, float("inf"). Поддержка десятичных дробей в драйвере cx_Oracle DBAPI пока не реализована.

    References: #4064

  • [oracle] [bug]

    Диалект cx_Oracle был переработан и модернизирован для использования новых паттернов, которых не было в старой версии cx_Oracle 4.x. В частности, минимальной версией cx_Oracle является серия 5.x, а cx_Oracle 6.x теперь полностью протестирован. Наиболее существенные изменения касаются преобразования типов, в первую очередь числовых / с плавающей точкой и LOB, что позволяет более эффективно использовать хуки обработки типов cx_Oracle для упрощения обработки параметров привязки и результатов.

  • [oracle] [bug]

    двухфазная поддержка cx_Oracle была полностью удалена для всех версий cx_Oracle, тогда как в версии 1.2.0b1 это изменение вступило в силу только для серии cx_Oracle 6.x. Эта функция никогда не работала корректно ни в одной версии cx_Oracle, а в cx_Oracle 6.x был удален API, на который опиралась SQLAlchemy.

    References: #3997

  • [oracle] [bug]

    Ключи столбцов, присутствующие в наборе результатов при использовании Insert.returning() с бэкендом cx_Oracle, теперь используют правильные имена столбцов / меток, как и во всех других диалектах. Ранее они отображались как ret_nnn.

  • [oracle] [bug]

    Несколько параметров диалекта cx_Oracle теперь устарели и не будут иметь никакого значения: auto_setinputsizes, exclude_setinputsizes, allow_twophase.

  • [oracle] [bug]

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

    References: #4042

  • [oracle] [bug]

    Исправлено большее количество регрессий, вызванных cx_Oracle 6.0; на данный момент единственным изменением в поведении пользователей является то, что обнаружение разъединения теперь происходит при ошибке cx_Oracle.DatabaseError в дополнение к cx_Oracle.InterfaceError, поскольку это поведение, по-видимому, изменилось. Другие проблемы, связанные с точностью числовых значений и незакрываемыми соединениями, находятся на рассмотрении в трекере проблем cx_Oracle.

    References: #4045

  • [oracle] [bug]

    Исправлена ошибка, при которой режим объединения Oracle 8 «non ansi» не добавлял оператор (+) к выражениям, в которых использовался оператор, отличный от оператора =. Оператор (+) должен быть во всех столбцах, входящих в правую часть.

    References: #4076

1.2.0b2

Released: July 24, 2017

orm

  • [orm] [bug]

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

    This change is also backported to: 1.1.12

    References: #4033

  • [orm] [bug]

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

    This change is also backported to: 1.1.12

    References: #4031

  • [orm] [bug]

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

    This change is also backported to: 1.1.12

    References: #4030

tests

  • [tests] [bug] [py3k]

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

    This change is also backported to: 1.1.12, 1.0.18

    References: #4034

1.2.0b1

Released: July 10, 2017

orm

  • [orm] [feature]

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

    This change is also backported to: 1.1.7

    References: #3933

  • [orm] [feature]

    Добавлен атрибут .autocommit для scoped_session, проксирующий атрибут .autocommit для нижестоящего Session, назначенного в данный момент потоку. Pull request любезно предоставлен Беном Фейгином.

  • [orm] [feature]

    Добавлена новая функция with_expression(), позволяющая добавлять специальное SQL-выражение к определенной сущности в запросе во время получения результата. Это альтернатива тому, что SQL-выражение передается в виде отдельного элемента в кортеже результатов.

    References: #3058

  • [orm] [feature]

    Добавлен новый стиль загрузки наследования на уровне маппера «полиморфный селектин». При таком стиле загрузки после загрузки базового типа объекта формируются запросы для каждого подкласса в иерархии наследования, используя IN для указания нужных значений первичных ключей.

    References: #3948

  • [orm] [feature]

    Добавлена новая разновидность ускоренной загрузки под названием «selectin». Этот стиль загрузки очень похож на «подзапросную» загрузку, за исключением того, что в нем используется выражение IN, заданное списком значений первичных ключей из загружаемых родительских объектов, а не повторная формулировка исходного запроса. В результате получается более эффективный запрос, который «запекается» (например, SQL-строка кэшируется) и также работает в контексте Query.yield_per().

    References: #3944

  • [orm] [feature]

    Стратегия загрузчика lazy="select" теперь во всех случаях использует систему кэширования запросов BakedQuery. Это устраняет большую часть накладных расходов, связанных с генерацией объекта Query и запуском его в select(), а затем строкового SQL-запроса, из процесса ленивой загрузки связанных коллекций и объектов. «Запеченный» ленивый загрузчик также был улучшен, теперь он может кэшировать в большинстве случаев, когда используются опции загрузки запросов.

    References: #3954

  • [orm] [feature] [ext]

    Метод Query.update() теперь может использовать в качестве источника ключа, помещаемого в предложение SET, как гибридные атрибуты, так и составные атрибуты. Для гибридных атрибутов предусмотрен дополнительный декоратор hybrid_property.update_expression(), для которого пользователь задает функцию, возвращающую кортеж.

    References: #3229

  • [orm] [feature]

    Добавлено новое событие атрибута AttributeEvents.bulk_replace(). Это событие срабатывает при присвоении коллекции отношения, до того, как входящая коллекция будет сравнена с существующей. Это раннее событие позволяет преобразовывать и входящие неORM-объекты. Событие интегрировано с декоратором @validates.

    References: #3896

  • [orm] [feature]

    Добавлен новый обработчик события AttributeEvents.modified(), который срабатывает при вызове функции func:.attributes.flag_modified, что часто встречается при использовании модуля расширения sqlalchemy.ext.mutable.

    References: #3303

  • [orm] [bug]

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

    This change is also backported to: 1.1.11

    References: #4011

  • [orm] [bug]

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

    This change is also backported to: 1.1.10

    References: #3986

  • [orm] [bug]

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

    This change is also backported to: 1.1.7

    References: #3947

  • [orm] [bug]

    UPDATE, выполняемый в результате использования функции relationship.post_update, теперь будет интегрироваться с функцией версионирования, чтобы как выводить идентификатор версии строки, так и утверждать, что был найден номер существующей версии.

    References: #3496

  • [orm] [bug]

    Исправлено несколько ситуаций, связанных с использованием функции relationship.post_update в сочетании с колонкой, имеющей значение «onupdate». Теперь при выполнении UPDATE соответствующий атрибут объекта истекает или обновляется, чтобы в нем появилось новое значение «onupdate»; ранее оставалось неактуальное значение. Кроме того, если атрибут target был установлен в Python для INSERT объекта, то теперь это значение будет повторно отправлено во время UPDATE, чтобы «onupdate» не перезаписал его (обратите внимание, что это работает также и для генерируемых сервером onupdate). Наконец, событие SessionEvents.refresh_flush() теперь выдается для этих атрибутов при обновлении внутри flush.

    References: #3471, #3472

  • [orm] [bug]

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

    References: #3996

  • [orm] [bug]

    Функция версионирования не поддерживает NULL для счетчика версий. Теперь будет возникать исключение, если идентификатор версии является программным и был установлен в NULL для UPDATE. Pull request любезно предоставлен Дианой Кларк.

    References: #3673

  • [orm] [bug]

    Из scoped_session удалено очень старое ключевое слово-аргумент scope. Это ключевое слово никогда не было документировано и представляло собой раннюю попытку обеспечить возможность использования переменных диапазонов.

    References: #3796

  • [orm] [bug]

    Исправлена ошибка, из-за которой при комбинировании нагрузки «with_polymorphic» с отношениями, связанными с подклассами, в которых указана нагрузка joinedload с innerjoin=True, эти «innerjoins» не понижались до «outerjoins», чтобы соответствовать другим полиморфным классам, не поддерживающим это отношение. Это относится как к полиморфной нагрузке с одиночным, так и с объединенным наследованием.

    References: #3988

  • [orm] [bug]

    В метод Session.refresh() добавлен новый аргумент with_for_update. Когда метод Query.with_lockmode() был упразднен в пользу Query.with_for_update(), метод Session.refresh() так и не был обновлен для отражения новой опции.

    References: #3991

  • [orm] [bug]

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

    References: #3984

  • [orm] [bug]

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

    References: #3967

  • [orm] [bug]

    В «скомпилированный кэш» LRU, используемый в Mapper (и, в конечном счете, в другие LRU-кэши на базе ORM), добавлены предупреждения о том, что когда кэш начинает достигать предельного размера, приложение выдает предупреждение о том, что это снижает производительность и может потребовать внимания. LRU-кэши могут достигать предельного размера в первую очередь в том случае, если приложение использует неограниченное количество объектов Engine, что является антипаттерном. В противном случае это может свидетельствовать о проблеме, на которую следует обратить внимание разработчика SQLAlchemy.

  • [orm] [bug]

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

    References: #3963

  • [orm] [bug]

    Функция flag_modified() теперь вызывает ошибку InvalidRequestError, если именованный атрибут key не присутствует в объекте, так как предполагается, что он будет присутствовать в процессе flush. Для того чтобы пометить объект «грязным» для промывки без обращения к какому-либо конкретному атрибуту, можно использовать функцию flag_dirty().

    References: #3753

  • [orm] [bug]

    Стратегия «evaluate», используемая Query.update() и Query.delete(), теперь может выполнять простое сравнение объектов из отношения «многие-к-одному» с экземпляром, когда имена атрибутов столбцов первичного ключа / внешнего ключа не совпадают с реальными именами столбцов. Ранее при этом выполнялось простое сравнение по имени и выдавалась ошибка AttributeError.

    References: #3366

  • [orm] [bug]

    Декоратор @validates теперь позволяет декорируемому методу получать объекты из операции «bulk collection set», которые еще не были сопоставлены с существующей коллекцией. Это позволяет преобразовывать входящие значения в совместимые объекты ORM, как это уже разрешено в событии «append». Обратите внимание, что это означает, что метод @validates вызывается для всех значений во время присваивания коллекции, а не только для тех, которые являются новыми.

    References: #3896

  • [orm] [bug]

    Исправлена ошибка при наследовании одной таблицы, когда аргумент select_from() не учитывался при ограничении строк в подклассе. Ранее учитывались только выражения в запрашиваемых столбцах.

    См.также

    ``select_from()``F

    References: #3891

  • [orm] [bug]

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

    References: #3913

  • [orm] [bug]

    Теперь состояние Session присутствует в момент испускания события SessionEvents.after_rollback(), то есть состояние атрибутов объектов до истечения срока их действия. Это согласуется с поведением события SessionEvents.after_commit(), которое также испускается до истечения срока действия состояния атрибутов объектов.

    References: #3934

  • [orm] [bug]

    Исправлена ошибка, при которой функция Query.with_parent() не работала, если Query была обращена к конструкции aliased(), а не к обычному сопоставленному классу. Также добавлен новый параметр with_parent.from_entity к автономной функции with_parent(), а также Query.with_parent().

    References: #3607

orm declarative

  • [orm] [declarative] [bug]

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

    References: #3848

engine

  • [engine] [feature]

    В объект Pool добавлена встроенная обработка «пессимистического разрыва соединения». Новый параметр Pool.pre_ping, доступный в движке как create_engine.pool_pre_ping, применяет эффективную форму рецепта «pre-ping», описанного в документации по пулингу, который при каждой проверке соединения выдает простой оператор, обычно «SELECT 1», для проверки соединения на жизнеспособность. Если существующее соединение больше не способно отвечать на команды, то оно прозрачно утилизируется, а все остальные соединения, созданные до текущей метки времени, аннулируются.

    References: #3919

  • [engine] [bug]

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

    This change is also backported to: 1.1.7

    References: #3946

  • [engine] [bug]

    Исправлена ошибка, когда в необычном случае передачи объекта Compiled непосредственно в Connection.execute(), диалект, в котором был сгенерирован объект Compiled, не обращался к параметру paramstyle строкового оператора, вместо этого предполагалось, что он будет соответствовать параметру paramstyle на уровне диалекта, что приводило к возникновению несоответствий.

    References: #3938

sql

  • [sql] [feature]

    Добавлен новый вид bindparam(), называемый «расширяющимся». Он предназначен для использования в выражениях IN, в которых список элементов преобразуется в отдельные связанные параметры во время выполнения оператора, а не во время его компиляции. Это позволяет связать одно имя связанного параметра с IN-выражением, состоящим из нескольких элементов, а также использовать кэширование запросов в IN-выражениях. Новая возможность позволяет связанным с ней функциям загрузки «select in» и загрузки «polymorphic in» использовать расширение baked query для снижения накладных расходов на вызов. Данную возможность следует рассматривать как экспериментальную для версии 1.2.

    References: #3953

  • [sql] [feature] [mysql] [oracle] [postgresql]

    Добавлена поддержка SQL-комментариев к объектам Table и Column с помощью новых аргументов Table.comment и Column.comment. Комментарии включаются в DDL при создании таблицы, либо в строку, либо через соответствующий оператор ALTER, а также отражаются обратно в отражении таблицы, а также через аргумент Inspector. В настоящее время поддерживаются такие бэкенды, как MySQL, PostgreSQL и Oracle. Большое спасибо Фрейзеру МакЛину (Frazer McLean) за большую работу над этим проектом.

    References: #1546

  • [sql] [feature]

    Давнее поведение операторов ColumnOperators.in_() и ColumnOperators.notin_(), выдающих предупреждение, когда правое условие является пустой последовательностью, было изменено; теперь простое «статическое» выражение «1 != 1» или «1 = 1» выводится по умолчанию, а не подтягивается к исходному левому выражению. В результате результат сравнения столбца NULL с пустым набором меняется с NULL на true/false. Это поведение является настраиваемым, и старое поведение можно включить с помощью параметра create_engine.empty_in_strategy к create_engine().

    References: #3907

  • [sql] [feature]

    В классы компараторов «startswith» и «endswith» добавлена новая опция autoescape, которая предоставляет управляющий символ и автоматически применяет его ко всем вхождениям символов подстановки «%» и «_». Pull request любезно предоставлен Дианой Кларк.

    Примечание

    В версии 1.2.0 эта функция была изменена по сравнению с первоначальной реализацией в версии 1.2.0b2: теперь autoescape передается как булево значение, а не как конкретный символ, который должен использоваться в качестве управляющего символа.

    References: #2694

  • [sql] [bug]

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

    This change is also backported to: 1.1.11

    References: #4012

  • [sql] [bug]

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

    This change is also backported to: 1.1.9

    References: #3952

  • [sql] [bug] [postgresql]

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

    This change is also backported to: 1.1.9

    References: #3955

  • [sql] [bug]

    Правила согласования типов Numeric, Integer и типов, связанных с датой, теперь включают дополнительную логику, которая будет пытаться сохранить параметры входящего типа на «разрешенном» типе. В настоящее время для этого используется флаг asdecimal, так что при выполнении математической операции между Numeric или Float и Integer будет сохранен флаг «asdecimal», а также то, должен ли тип быть подклассом Float.

    References: #4018

  • [sql] [bug] [mysql]

    Процессор результатов для типа Float теперь безоговорочно прогоняет значения через процессор float(), если диалект указывает, что он также поддерживает режим «native decimal». В то время как большинство бэкендов будут предоставлять объекты Python float для типа данных с плавающей точкой, бэкенды MySQL в некоторых случаях не имеют информации о типе, чтобы обеспечить это, и возвращают Decimal, если не выполнено преобразование float.

    References: #4020

  • [sql] [bug]

    Добавлена дополнительная строгость в обработку значений Python «float», передаваемых в операторы SQL. Значение «float» будет ассоциировано с типом данных Float, а не с типом данных Numeric, как это было раньше, что устраняет путаное предупреждение, выдаваемое на SQLite, а также ненужное приведение к Decimal.

    References: #4017

  • [sql] [bug]

    Приоритет операторов сравнения, таких как LIKE, IS, IN, MATCH, equals, greater than, less than и т.д., был объединен на одном уровне, поэтому в выражениях, использующих эти операторы по отношению друг к другу, между ними будут ставиться круглые скобки. Это соответствует заявленному приоритету операторов в таких базах данных, как Oracle, MySQL и других, в которых все эти операторы имеют равный приоритет, а также в PostgreSQL начиная с версии 9.5, в которой приоритет операторов также уплощен.

    References: #3999

  • [sql] [bug]

    Исправлена проблема, при которой тип выражения, использующего ColumnOperators.is_() или аналогичный ему, не был типом «boolean», а имел тип «nulltype», а также при использовании пользовательских операторов сравнения с нетипизированным выражением. Такая типизация может повлиять на поведение выражения в больших контекстах, а также на обработку строк результатов.

    References: #3873

  • [sql] [bug]

    Исправлено отрицание конструкции Label, чтобы внутренний элемент корректно отрицался, когда к маркированному выражению применяется модификатор not_().

    References: #3969

  • [sql] [bug]

    Уточнена система «удвоения» знаков процента в SQL-операторах для целей экранирования. Теперь «удвоение» знаков процента, в основном связанное с конструкцией literal_column, а также операторами типа ColumnOperators.contains(), происходит в зависимости от заявленного параметрического стиля используемого DBAPI; для параметрических стилей, чувствительных к процентам, как это принято в драйверах PostgreSQL и MySQL, удвоение будет происходить, а для других, таких как SQLite, - нет. Это позволяет использовать конструкцию literal_column в зависимости от базы данных.

    References: #3740

  • [sql] [bug]

    Исправлена ошибка, из-за которой при использовании CheckConstraint на уровне столбцов не компилировалось SQL-выражение с помощью компилятора базового диалекта, а также не применялись соответствующие флаги для генерации литеральных значений как inline, в случае если sqltext является выражением Core, а не простой строкой. Это было давно исправлено для контрольных ограничений на уровне таблиц в 0.9 в рамках #2742, в которых чаще используются выражения Core SQL, а не обычные строковые выражения.

    References: #3957

  • [sql] [bug]

    Исправлена ошибка, из-за которой SQL-ориентированный столбец по умолчанию на стороне Python мог не выполняться при INSERT в коде «pre-execute», если сам SQL представлял собой нетипизированное выражение, например, обычный текст. Кодовый путь «pre-execute» встречается довольно редко, однако может применяться к столбцам с нецелыми первичными ключами с SQL-установками по умолчанию, когда RETURNING не используется.

    References: #3923

  • [sql] [bug]

    Выражение, используемое для COLLATE на уровне столбцов collate() и ColumnOperators.collate(), теперь берется в кавычки как идентификатор, если имя чувствительно к регистру, например, содержит заглавные символы. Обратите внимание, что это не влияет на collation на уровне типа, который уже заключен в кавычки.

    References: #3785

  • [sql] [bug]

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

    References: #3939

schema

  • [schema] [bug]

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

    This change is also backported to: 1.1.10

    References: #3949

postgresql

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.11

    References: #4005

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.11

    References: #4006

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.10

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.8

  • [postgresql] [bug]

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

    References: #3964

  • [postgresql] [bug]

    Добавлена поддержка всех возможных идентификаторов «полей» при отражении типа данных PostgreSQL INTERVAL, например, «ГОД», «МЕСЯЦ», «ДЕНЬ-МИНУТА» и т.д.. Кроме того, сам тип данных INTERVAL теперь содержит новый параметр INTERVAL.fields, в котором можно указать эти идентификаторы; при отражении / проверке идентификатор также отражается в результирующем типе данных.

    References: #3959

mysql

  • [mysql] [feature]

    Добавлена поддержка специфического для MySQL объекта ON DUPLICATE KEY UPDATE Insert. Pull request любезно предоставлен Михаилом Дорониным.

    References: #4009

  • [mysql] [bug]

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

    This change is also backported to: 1.1.11

    References: #4007

  • [mysql] [bug]

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

    This change is also backported to: 1.1.10

    References: #3966

  • [mysql] [bug]

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

    This change is also backported to: 1.1.10

    References: #3961

  • [mysql] [bug]

    Добавлена поддержка неотражаемых представлений из-за устаревших определений таблиц при вызове MetaData.reflect(); выдается предупреждение для таблицы, которая не может ответить на DESCRIBE, но операция проходит успешно.

    References: #3871

mssql

  • [mssql] [bug]

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

    This change is also backported to: 1.1.11

    References: #3994

  • [mssql] [bug]

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

    This change is also backported to: 1.1.11

    References: #3973

  • [mssql] [bug]

    Диалект SQL Server теперь позволяет передавать имя базы данных и/или владельца с точкой внутри, явно используя скобки в строке вокруг владельца и, опционально, имени базы данных. Кроме того, при передаче конструкции quoted_name для имени схемы точка не будет разделяться, и в качестве «владельца» будет передаваться полная строка. quoted_name теперь также доступен из пространства импорта sqlalchemy.sql.

    References: #2626

oracle

  • [oracle] [feature] [postgresql]

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

    This change is also backported to: 1.1.12

  • [oracle] [feature]

    Диалект Oracle теперь проверяет уникальные и проверочные ограничения при использовании Inspector.get_unique_constraints(), Inspector.get_check_constraints(). Поскольку в Oracle нет уникальных ограничений, которые были бы отделены от уникального Index, отраженный Table по-прежнему не будет иметь связанных с ним объектов UniqueConstraint. Pull requests courtesy Eloy Felix.

    References: #4003

  • [oracle] [bug]

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

    This change is also backported to: 1.1.11

    References: #3997

  • [oracle] [bug]

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

    This change is also backported to: 1.1.10

    References: #3975

  • [oracle] [bug]

    Диалект cx_Oracle теперь поддерживает «sane multi rowcount», то есть при выполнении серии наборов параметров через DBAPI cursor.executemany() мы можем использовать cursor.rowcount для проверки количества совпавших строк. Это влияет на работу ORM при обнаружении сценариев одновременной модификации, так как некоторые простые условия теперь могут быть обнаружены даже при пакетной обработке операторов, а также при использовании более строгой функции версионности ORM может по-прежнему использовать пакетную обработку операторов. Флаг включен для cx_Oracle, предполагающего, по крайней мере, версию 5.0, которая сейчас является общепринятой.

    References: #3932

  • [oracle] [bug]

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

    References: #3276

misc

  • [feature] [ext]

    В Session добавлен новый флаг Session.enable_baked_queries, позволяющий отключать запеченные запросы в масштабах всей сессии, что уменьшает потребление памяти. Также добавлена новая обертка Bakery, чтобы можно было проверять запеченные запросы, возвращаемые BakedQuery.bakery.

  • [bug] [ext]

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

    This change is also backported to: 1.1.10

    References: #3980

  • [bug] [ext]

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

    This change is also backported to: 1.1.8

    References: #3950

  • [bug] [ext]

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

    This change is also backported to: 1.1.8

  • [bug] [ext]

    Методы сравнения AssociationProxy.any(), AssociationProxy.has() и AssociationProxy.contains() теперь поддерживают рекурсивную связь с атрибутом, который сам является атрибутом AssociationProxy.

    References: #3769

  • [bug] [ext]

    Реализованы операторы мутации in-place __ior__, __iand__, __ixor__ и __isub__ для MutableSet и __iadd__ для MutableList, чтобы при использовании этих методов мутатора для изменения коллекции срабатывали события изменения.

    References: #3853

  • [bug] [declarative]

    Предупреждение выдается, если модификатор declared_attr.cascading используется с декларативным атрибутом, который сам объявлен в сопоставляемом классе, в отличие от декларативного класса-миксина или класса __abstract__. Модификатор declared_attr.cascading в настоящее время применяется только к классам mixin/abstract.

    References: #3847

  • [bug] [ext]

    Улучшена коллекция списков прокси ассоциаций, чтобы предотвратить преждевременную автозагрузку только что созданного объекта ассоциации в случае, когда используется list.append(), а при обращении прокси ассоциации к коллекции конечных точек вызывается ленивая загрузка. Теперь обращение к коллекции конечных точек происходит сначала, а затем вызывается создатель для создания объекта ассоциации.

    References: #3941

  • [bug] [ext]

    Класс sqlalchemy.ext.hybrid.hybrid_property теперь поддерживает многократный вызов мутаторов типа @setter, @expression и т.д. в подклассах, а также предоставляет мутатор @getter, чтобы можно было использовать определенный гибрид в подклассах или других классах. Теперь это соответствует поведению @property в стандартном Python.

    References: #3911, #3912

  • [bug] [ext]

    Исправлена ошибка в расширении sqlalchemy.ext.serializer, из-за которой «аннотированный» SQL-элемент (как это делает ORM для многих типов SQL-выражений) не мог быть надежно сериализован. Также изменен уровень pickle по умолчанию для сериализатора на «HIGHEST_PROTOCOL».

    References: #3918

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