1.2 Changelog

1.2.19

Released: April 15, 2019

orm

  • [orm] [bug]

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

    References: #4507

examples

  • [examples] [bug]

    Исправлена ошибка в примере с big_resultsets, когда переименованная переменная «id» из-за переформатирования кода приводила к неудаче теста. Pull request любезно предоставлен Мэттом Шучхардтом.

    References: #4528

engine

  • [engine] [bug]

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

    References: #4406

mssql

  • [mssql] [bug]

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

    References: #4536

oracle

  • [oracle] [bug]

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

    References: #4506

1.2.18

Released: February 15, 2019

orm

  • [orm] [bug]

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

    References: #4468

  • [orm] [bug]

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

    References: #4489

sql

  • [sql] [bug]

    Исправлена проблема, когда тип JSON имел атрибут JSON.should_evaluate_none, доступный только для чтения, что приводило к сбоям при использовании метода TypeEngine.evaluates_none() в сочетании с этим типом. Pull request любезно предоставлен 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 устаревает. Спасибо John A Stevenson за подсказку.

    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 вводил некорректное приведение сообщения простой строки к Юникоду под python 2k, что не обрабатывается интерпретатором Python для символов вне кодировки платформы (обычно ascii). Класс SQLAlchemyError теперь передает байтовую строку под Py2K для __str__(), как и поведение объектов исключений в целом под Py2K, делает безопасную кодировку в юникод utf-8 с обратным слешем для __unicode__(). Для Py3K сообщение обычно уже имеет юникод, но если это не так, то оно снова безопасно кодируется в utf-8 с обратным слэшем для метода __str__().

    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]

    Исправлена проблема в функции «expanding 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]

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

    References: #4400

orm declarative

  • [orm] [declarative] [bug]

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

    References: #4374

misc

  • [no_tags]

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

    References: #4381

  • [no_tags]

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

    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]

    Техника разрешения конфликта столбцов, рассмотренная в Разрешение конфликтов колонок, теперь работает для столбца 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]

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

    References: #4348

  • [mysql] [bug]

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

    References: #4344

misc

  • [misc] [bug]

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

  • [misc] [bug] [py3k]

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

    References: #4339

  • [bug] [ext]

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

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» в контексте операции после обновления происходила и для строки, которая должна быть удалена после обновления, что означало, что столбец с генератором значений на стороне Python показывал теперь удаленное значение, которое было выдано для UPDATE перед DELETE (что не соответствовало предыдущему поведению), а также то, что генератор значений, выдаваемый на SQL, будет иметь атрибут expired, что означает, что предыдущее значение будет недоступно из-за того, что строка была удалена, а объект отсоединен от сессии. Логика «postfetch», которая была добавлена в #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]

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

    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, когда выражение, отображаемое в булевом контексте на неродном булевом бэкенде, сравнивалось с 1/0, даже если оно уже является неявно булевым выражением, при использовании ColumnElement.self_group(). Хотя это не влияет на дружественные бэкенды (MySQL, SQLite), это не было обработано Oracle (и, возможно, SQL Server). Является ли выражение неявно булевым или нет в любой базе данных, теперь определяется заранее в качестве дополнительной проверки, чтобы не генерировать целочисленное сравнение в процессе компиляции оператора.

    References: #4320

  • [sql] [bug]

    Добавлены недостающие параметры оконных функций WithinGroup.over.range_ и WithinGroup.over.rows к методам WithinGroup.over() и FunctionFilter.over(), чтобы соответствовать функции 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, а также изменять поведение типов данных, передаваемых этому методу.

    См.также

    cx_oracle_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() на vendored версию, скопированную из стандартной библиотеки 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 с доступностью методов класса, в отличие от произвольной вызываемой функции. В частности, пример кэширования dogpile иллюстрирует query_cls как функцию, а не как подкласс Query.

    References: #4256

  • [orm] [bug]

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

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

    References: #4128

  • [orm] [bug]

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

  • [orm] [bug]

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

    References: #4258

engine

  • [engine] [bug]

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

    References: #4252

  • [engine] [bug]

    Исправлена проблема утечки ссылок, когда значения словаря параметров, используемого при выполнении оператора, оставались ссылочными в «скомпилированном кэше», в результате хранения представления ключей, используемого Python 3 dictionary 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 возвращается к неродному булевому значению, но с дополнительным флагом, который все еще позволяет избежать создания ограничения 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 в функции шардированных запросов, когда новый элемент «identity_token» не учитывался корректно в рамках операции ленивой загрузки при поиске в карте идентификации связанного элемента «многие-к-одному». Новое поведение позволит использовать «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]

    Исправлена ошибка в новой загрузке «polymorphic selectin», когда выборка полиморфных объектов частично загружалась из ленивого загрузчика отношений, что приводило к условию «пустой 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]

    Исправлена ошибка в корректировке PostgreSQL COLLATE / ARRAY, впервые представленная в #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.inititator к функции set_attribute(), позволяющий распространять маркер события, полученный от функции-слушателя, на последующие события набора.

  • [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 любезно предоставлен Андре Крузом.

    This change is also backported to: 1.1.16

  • [postgresql] [bug]

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

    This change is also backported to: 1.1.16

sqlite

  • [sqlite] [bug]

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

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 в диалект MySQL для целей цитирования. Pull request любезно предоставлен Riccardo Magliocchetti.

mssql

  • [mssql] [bug]

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

    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(), когда использование формата «multi-values» в сочетании с объектами Column в качестве ключей, а не строк, приводило к ошибке. Pull request любезно предоставлен Обри Старк-Толлером.

    This change is also backported to: 1.1.16

    References: #4162

mssql

  • [mssql] [bug]

    Исправлена регрессия в версии 1.2, при которой вновь исправленное цитирование имен раскладки в #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, который ссылается на более чем одну таблицу, переключится в режим «multi-table» и выдаст соответствующий пункт «USING» или «FROM» для нескольких таблиц, как это понимает база данных. Pull request любезно предоставлен Питером Малдером.

    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]

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

    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]

    Добавлены методы __next__() и next() к ResultProxy, чтобы встроенная функция 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]

    Добавлен новый флаг use_batch_mode в диалект psycopg2. Этот флаг позволяет использовать расширение 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 называет «родным boolean» с его типом BIT, поскольку этот тип принимает только 0 или 1, а DBAPI возвращают его значение как True/False. Таким образом, диалекты SQL Server теперь поддерживают «родную булеву», т.е. ограничение CHECK не генерируется для типа данных Boolean. Единственное отличие от других нативных boolean заключается в том, что здесь нет констант «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 не может предоставить нам подсчет рядов в операторе UPDATE или DELETE, когда действует OUTPUT. Это в первую очередь влияет на ORM, когда при обновлении строки, содержащей вычисленные сервером значения, возникает ошибка, если бэкенд не возвращает ожидаемое количество строк. PyODBC теперь заявляет, что он поддерживает подсчет рядов, кроме случаев, когда присутствует OUTPUT.inserted, что учитывается ORM во время флеша, чтобы определить, будет ли он искать подсчет рядов.

    References: #4062

  • [mssql] [bug] [orm]

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

  • [mssql] [bug]

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

    References: #4059

oracle

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

    Исправлена регрессия производительности, вызванная исправлением для #3937, когда cx_Oracle в версии 5.3 удалил символ .UNICODE из своего пространства имен, что было интерпретировано как включение режима «WITH_UNICODE» в cx_Oracle, который вызывает функции на стороне SQLAlchemy, преобразующие все строки в юникод, что приводит к снижению производительности. На самом деле, по словам автора cx_Oracle, режим «WITH_UNICODE» был полностью удален в версии 5.1, поэтому дорогостоящие функции преобразования юникода больше не нужны и отключаются, если 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]

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

    This change is also backported to: 1.1.12, 1.0.18

    References: #4034

1.2.0b1

Released: July 10, 2017

orm

  • [orm] [feature]

    Теперь конструкция aliased() может быть передана методу Query.select_entity_from(). Сущности будут извлечены из selectable, представленного конструкцией 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» могло заполнить объект; ранее оставалось несвежее значение. Кроме того, если целевой атрибут был установлен в 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» в сочетании с отношениями, связанными с подклассами, которые указывают joinload с innerjoin=True, не приводило к понижению этих «innerjoins» до «outerjoins», чтобы соответствовать другим полиморфным классам, которые не поддерживают эти отношения. Это относится как к полиморфной нагрузке с одиночным, так и с объединенным наследованием.

    References: #3988

  • [orm] [bug]

    Добавлен новый аргумент with_for_update к методу Session.refresh(). Когда метод 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() не учитывался при ограничении строк в подклассе. Ранее учитывались только выражения в запрашиваемых столбцах.

    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» использовать расширение запеченных запросов для снижения накладных расходов на вызов. Эту возможность следует считать экспериментальной для версии 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]

    Добавлена новая опция autoescape к классам компараторов «startswith» и «endswith»; она предоставляет символ экранирования и автоматически применяет его ко всем вхождениям символов подстановки «%» и «_». 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 в тех случаях, когда мы делаем, чтобы тип левой стороны передавался непосредственно в правую сторону, чтобы к аргументу выражения можно было применить правила уровня bind.

    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, а также ненужное приведение к десятичному типу.

    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-выражение с помощью компилятора базового диалекта, а также применить соответствующие флаги для генерации литеральных значений как встроенных, в случае, если 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]

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

    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 с типом строки, имеющим коллизию, не приводило к правильному синтаксису в 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’s ON DUPLICATE KEY UPDATE MySQL-специфического объекта 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]

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

    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]

    Исправлена ошибка, когда изоляция транзакций SQL Server должна быть получена из другого представления при использовании хранилища данных Azure. Теперь запрос выполняется к обоим представлениям, а затем безоговорочно выдается 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.cache и Sequence.order в Sequence, чтобы обеспечить рендеринг параметра 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 любезно предоставлены Элоем Феликсом.

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

    References: #3932

  • [oracle] [bug]

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

    References: #3276

misc

  • [feature] [ext]

    Добавлен новый флаг Session.enable_baked_queries к Session, позволяющий отключать запеченные запросы в масштабах всей сессии, что уменьшает использование памяти. Также добавлена новая обертка 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]

    В метод Query.params() добавлена поддержка связанных параметров, например, тех, которые обычно задаются через Result.count(). Ранее поддержка параметров была опущена. 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 в настоящее время применяется только к смешиваемым/абстрактным классам.

    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

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