1.2 Changelog¶
1.2.19¶
Released: April 15, 2019orm¶
Исправлена регрессия в версии 1.2, связанная с внедрением запеченных запросов для ленивых загрузчиков отношений, когда во время генерации «ленивого предложения», возникающего внутри мемоизированного атрибута, создавалось условие гонки. Если два потока одновременно инициализируют мемоизированный атрибут, запеченный запрос может быть сгенерирован с ключами параметров связывания, которые затем заменяются новыми ключами при следующем запуске, что приводит к ленивому запросу загрузки, который определяет критерии связи как
None
. Исправление устанавливает, что имена параметров фиксируются до генерации нового пункта и объектов параметров, так что имена каждый раз будут одинаковыми.References: #4507
examples¶
Исправлена ошибка в примере с big_resultsets, когда переименованная переменная «id» из-за переформатирования кода приводила к неудаче теста. Pull request любезно предоставлен Мэттом Шучхардтом.
References: #4528
engine¶
При сравнении двух объектов
URL
с помощью__eq__()
не учитывался номер порта, два объекта, отличающиеся только номером порта, считались равными. Сравнение портов теперь добавлено в метод__eq__()
вURL
, объекты, отличающиеся номером порта, теперь не равны. Кроме того,__ne__()
не был реализован дляURL
, что приводило к неожиданному результату при использовании!=
в Python2, так как в Python2 нет подразумеваемых отношений между операторами сравнения.References: #4406
mssql¶
Коммит() выполняется после изменения уровня изоляции на SNAPSHOT, поскольку и pyodbc, и pymssql открывают неявную транзакцию, которая блокирует последующий SQL от выполнения в текущей транзакции.
References: #4536
oracle¶
В диалект Oracle добавлена поддержка отражения типа данных
NCHAR
, а также добавленоNCHAR
в список типов, экспортируемых диалектом Oracle.References: #4506
1.2.18¶
Released: February 15, 2019orm¶
Исправлена регрессия в 1.2, когда опция загрузчика wildcard/load_only не работала корректно в отношении пути загрузчика, где of_type() использовались для ограничения определенным подклассом. Пока исправление работает только для of_type() простого подкласса, а не для сущности с_полиморфизмом, которая будет рассмотрена в отдельном выпуске; маловероятно, что этот последний случай работал ранее.
References: #4468
Исправлена довольно простая, но критическая проблема, когда событие
SessionEvents.pending_to_persistent()
вызывалось для объектов не только когда они переходили из состояния ожидания в состояние постоянного, но и когда они уже были постоянными и только обновлялись, что приводило к вызову события для всех объектов при каждом обновлении.References: #4489
sql¶
Исправлена проблема, когда тип
JSON
имел атрибутJSON.should_evaluate_none
, доступный только для чтения, что приводило к сбоям при использовании методаTypeEngine.evaluates_none()
в сочетании с этим типом. Pull request любезно предоставлен Sanjana S.References: #4485
mysql¶
Исправлена вторая регрессия, вызванная #4344 (первая была #4361), которая работает вокруг проблемы MySQL 88718, где используемая функция нижнего регистра была некорректна для Python 2 с соглашениями о регистрах OSX/Windows, что приводило к возникновению
TypeError
. К этой логике было добавлено полное покрытие, так что каждый кодовый путь отрабатывается в макетном стиле для всех трех соглашений о кешировании на всех версиях Python. В MySQL 8.0 тем временем была исправлена проблема 88718, поэтому обходной путь применим только к определенному диапазону версий MySQL 8.0.References: #4492
sqlite¶
Исправлена ошибка в SQLite DDL, когда использование выражения в качестве значения по умолчанию на стороне сервера требовало, чтобы оно содержалось в круглых скобках, чтобы быть принятым парсером sqlite. Pull request любезно предоставлен Bartlomiej Biernacki.
References: #4474
mssql¶
Исправлена ошибка, при которой логика SQL Server «IDENTITY_INSERT», позволяющая выполнить INSERT с явным значением в столбце IDENTITY, не обнаруживала случай, когда
Insert.values()
использовались со словарем, содержащимColumn
в качестве ключа и SQL-выражение в качестве значения.References: #4499
1.2.17¶
Released: January 25, 2019orm¶
Добавлены новые крючки событий
QueryEvents.before_compile_update()
иQueryEvents.before_compile_delete()
, которые дополняютQueryEvents.before_compile()
в случае методовQuery.update()
иQuery.delete()
.References: #4461
Исправлена проблема, когда при использовании однотабличного наследования в сочетании с объединенной иерархией наследования, использующей загрузку «с полиморфизмом», «критерии одной таблицы» для сущности с одной таблицей могли быть перепутаны с критериями других сущностей из той же иерархии, используемых в том же запросе. Адаптация «критериев одной таблицы» сделана более специфичной для целевой сущности, чтобы избежать случайной адаптации к другим таблицам в запросе.
References: #4454
postgresql¶
Пересмотрен запрос, используемый при отражении ограничений CHECK, чтобы использовать функцию
pg_get_constraintdef
, поскольку столбецconsrc
в PG 12 устаревает. Спасибо John A Stevenson за подсказку.References: #4463
oracle¶
Исправлена регрессия в логике целочисленной точности из-за рефакторинга диалекта cx_Oracle в версии 1.2. Теперь мы больше не применяем тип cx_Oracle.NATIVE_INT к столбцам результатов, передающим целочисленные значения (определяемые как положительная точность с масштабом ==0), что приводит к проблемам целочисленного переполнения при значениях, выходящих за границы 32 бит. Вместо этого выходная переменная остается нетипизированной, чтобы cx_Oracle мог выбрать наилучший вариант.
References: #4457
1.2.16¶
Released: January 11, 2019engine¶
Исправлена регрессия, появившаяся в версии 1.2, когда рефактор базового класса исключений
SQLAlchemyError
вводил некорректное приведение сообщения простой строки к Юникоду под python 2k, что не обрабатывается интерпретатором Python для символов вне кодировки платформы (обычно ascii). КлассSQLAlchemyError
теперь передает байтовую строку под Py2K для__str__()
, как и поведение объектов исключений в целом под Py2K, делает безопасную кодировку в юникод utf-8 с обратным слешем для__unicode__()
. Для Py3K сообщение обычно уже имеет юникод, но если это не так, то оно снова безопасно кодируется в utf-8 с обратным слэшем для метода__str__()
.References: #4429
sql¶
Исправлена проблема, при которой DDL, создаваемый для
DropTableComment
, который будет использоваться в будущей версии Alembic, был некорректен для баз данных MySQL и Oracle.References: #4436
postgresql¶
Исправлена проблема, при которой
ENUM
или пользовательский домен, присутствующий в удаленной схеме, не распознавался в отражении столбцов, если имя перечисления/домена или имя схемы требовало кавычек. Новая схема разбора теперь полностью разбирает лексемы, заключенные или не заключенные в кавычки, включая поддержку кавычек в формате SQL.References: #4416
Исправлена проблема, при которой несколько объектов
ENUM
, на которые ссылался один и тот же объектMetaData
, не создавались, если несколько объектов имели одинаковое имя при разных именах схем. Внутренняя мемоизация, используемая диалектом PostgreSQL для отслеживания создания конкретногоENUM
в базе данных во время последовательности создания DDL, теперь учитывает имя схемы.
sqlite¶
Отражение индекса, основанного на SQL-выражениях, теперь пропускается с предупреждением, так же как и в диалекте Postgresql, где мы в настоящее время не поддерживаем отражение индексов, содержащих SQL-выражения. Ранее создавался индекс с колонками None, что нарушало работу таких инструментов, как Alembic.
References: #4431
misc¶
Исправлена проблема в функции «expanding IN», когда использование одного и того же имени связанного параметра более одного раза в запросе приводило к KeyError в процессе перезаписи параметров в запросе.
References: #4394
1.2.15¶
Released: December 11, 2018orm¶
Исправлена ошибка, при которой аннотации ORM могли быть неверными для отношений primaryjoin/secondaryjoin, если в декларативных связях использовался шаблон
ForeignKey(SomeClass.id)
. Этот шаблон пропускал нежелательные аннотации в условия присоединения, что могло нарушить операции алиасинга, выполняемые внутриQuery
, которые не должны были влиять на элементы в этом условии присоединения. Теперь эти аннотации удаляются заранее, если они присутствуют.References: #4367
Продолжая тему, схожую с той, что была в совсем недавнем #4349, отремонтировал проблему с
Comparator.any()
иComparator.has()
, где «вторичный» selectable должен быть явно частью предложения FROM в подзапросе EXISTS для случая, когда этот «вторичный» является объектомJoin
.References: #4366
Исправлена регрессия, вызванная #4349, когда добавление «вторичной» таблицы в предложение FROM для динамического загрузчика влияло на способность
Query
выполнить последующее присоединение к другой сущности. Исправление добавляет первичную сущность в качестве первого элемента списка FROM, посколькуQuery.join()
хочет перейти от нее. Версия 1.3 будет иметь более полное решение этой проблемы (#4365).References: #4363
Исправлена ошибка, при которой цепочка опций маппера с использованием
RelationshipProperty.of_type()
в сочетании с цепочкой опций, ссылающихся на имя атрибута только по строке, не находила атрибут.References: #4400
orm declarative¶
Предупреждение выдается в случае, когда объект
column()
применяется к декларативному классу, так как, вероятно, он должен быть объектомColumn
.References: #4374
misc¶
Добавлена поддержка флага
write_timeout
, принимаемого mysqlclient и pymysql, для передачи в строке URL.References: #4381
Исправлена проблема, при которой отражение домена PostgreSQL, выраженного в виде массива, не распознавалось. Pull request любезно предоставлен Якубом Синовцом.
1.2.14¶
Released: November 10, 2018orm¶
Исправлена ошибка в
Session.bulk_update_mappings()
, когда альтернативные сопоставленные имена атрибутов приводили к тому, что столбец первичного ключа оператора UPDATE включался в предложение SET, а также в предложение WHERE; хотя обычно это безвредно, для SQL Server это может вызвать ошибку из-за столбца IDENTITY. Это продолжение той же ошибки, которая была исправлена в #3849, где тестирование было недостаточным для выявления этого дополнительного недостатка.References: #4357
Исправлена незначительная проблема производительности, которая в некоторых случаях могла добавить ненужные накладные расходы на выборку результата, связанная с использованием колонок ORM и сущностей, включающих эти же колонки одновременно в запросе. Проблема связана с накладными расходами на хэш / eq при обращении к столбцу разными способами.
References: #4347
mysql¶
Исправлена регрессия, вызванная выпуском #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, 2018orm¶
Исправлена ошибка, при которой «динамический» загрузчик должен явно устанавливать «вторичную» таблицу в предложении FROM запроса, для случая, когда вторичной является объект join, который иначе не подтягивается в запрос только из своих столбцов.
References: #4349
orm declarative¶
Исправлена регрессия, вызванная #4326 в версии 1.2.12, когда использование
declared_attr
с миксином в сочетании сsynonym()
приводило к тому, что синоним не отображался должным образом на наследуемый подкласс.References: #4350
Техника разрешения конфликта столбцов, рассмотренная в Разрешение конфликтов колонок, теперь работает для столбца
Column
, который также является столбцом первичного ключа. Ранее проверка столбцов первичного ключа, объявленных в подклассе с одним наследованием, происходила до того, как копия столбца была разрешена.References: #4352
sql¶
Рефакторинг
SQLCompiler
для выставления методаSQLCompiler.group_by_clause()
, аналогичного методамSQLCompiler.order_by_clause()
иSQLCompiler.limit_clause()
, который может быть переопределен диалектами для настройки отображения GROUP BY. Pull request любезно предоставлен Samuel Chou.Исправлена ошибка, при которой флаг
Enum.create_constraint
на типе данныхEnum
не распространялся на копии типа, что влияет на такие случаи использования, как декларативные миксины и абстрактные базы.References: #4341
postgresql¶
Добавлена поддержка функции
aggregate_order_by
для приема нескольких элементов ORDER BY, ранее принимался только один элемент.References: #4337
mysql¶
Добавлено слово
function
в список зарезервированных слов для MySQL, которое теперь является ключевым словом в MySQL 8.0References: #4348
Добавлено обходное решение для ошибки MySQL #88718, появившейся в серии 8.0, когда отражение ограничения внешнего ключа не сообщает о правильной чувствительности регистра для ссылающегося столбца, что приводит к ошибкам при использовании отраженного ограничения, например, при использовании расширения automap. Обходной путь предусматривает дополнительный запрос к таблицам information_schema для получения правильного имени с учетом регистра.
References: #4344
misc¶
Исправлена проблема, из-за которой часть внутренних функций помощника языка утилит передавала неверный тип аргумента встроенному модулю Python
__import__
в качестве списка импортируемых модулей. Проблема не вызывала никаких симптомов в основной библиотеке, но могла вызвать проблемы во внешних приложениях, которые переопределяют встроенный модуль__import__
или иным образом используют его. Pull request любезно предоставлен Джо Урсиуоли.Исправлены дополнительные предупреждения, генерируемые Python 3.7 из-за изменений в организации пакетов Python
collections
иcollections.abc
. Предыдущие предупрежденияcollections
были исправлены в версии 1.2.11. Pull request courtesy xtreak.References: #4339
Добавлен недостающий метод
.index()
к коллекциям ассоциаций на основе списка в расширении прокси ассоциаций.
1.2.12¶
Released: September 19, 2018orm¶
Добавлена проверка в рамках очистки weakref для объекта
InstanceState
для проверки наличия встроенного модуляdict
, в попытке уменьшить количество сообщений об ошибках, генерируемых, когда эти очистки происходят во время закрытия интерпретатора. Pull request любезно предоставлен Romuald Brunet.Исправлена ошибка, при которой использование конструкции
Lateral
в сочетании сQuery.join()
, а такжеQuery.select_entity_from()
не применяло адаптацию клаузы к правой стороне соединения. «Боковой» вводит случай использования правой части присоединения как корреляционной. Ранее адаптация этого пункта не рассматривалась. Обратите внимание, что только в версии 1.2, selectable, введенный функциейQuery.subquery()
, все еще не адаптирован из-за #4304; selectable должен быть произведен функциейselect()
, чтобы быть правой стороной «бокового» соединения.References: #4334
Исправлена 1. 2 регрессия, вызванная #3472, когда обработка столбца в стиле «updated_at» в контексте операции после обновления происходила и для строки, которая должна быть удалена после обновления, что означало, что столбец с генератором значений на стороне Python показывал теперь удаленное значение, которое было выдано для UPDATE перед DELETE (что не соответствовало предыдущему поведению), а также то, что генератор значений, выдаваемый на SQL, будет иметь атрибут expired, что означает, что предыдущее значение будет недоступно из-за того, что строка была удалена, а объект отсоединен от сессии. Логика «postfetch», которая была добавлена в #3472, теперь полностью пропущена для объекта, который в конечном итоге будет удален.
References: #4327
orm declarative¶
Исправлена ошибка, при которой декларативное сканирование атрибутов получало прокси выражения, передаваемого гибридным атрибутом на уровне класса, а не сам гибридный атрибут, при получении дескриптора через вызываемый
@declared_attr
на подклассе уже отображенного класса. Это привело бы к тому, что атрибут не сообщал бы о себе как о гибридном при просмотре вMapper.all_orm_descriptors
.References: #4326
postgresql¶
Исправлена ошибка в диалекте PostgreSQL, когда аргументы ключевых слов компилятора, такие как
literal_binds=True
, не распространялись на выражение DISTINCT ON.References: #4325
Исправлена функция
array_agg()
, которая является слегка измененной версией обычной функцииarray_agg()
, чтобы также принимать входящий аргумент «тип» без принудительного создания ARRAY вокруг него, по существу то же самое, что было исправлено для функции generic в версии 1.1 в #4107.References: #4324
Исправлена ошибка в отражении PostgreSQL ENUM, когда имя, чувствительное к регистру и заключенное в кавычки, сообщалось запросом с учетом кавычек, что не соответствовало целевому столбцу при отражении таблицы, поскольку кавычки должны были быть удалены.
References: #4323
oracle¶
Исправлена проблема для 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¶
Исправлена проблема, при которой
BakedQuery
не включал конкретный класс запроса, используемыйSession
, как часть ключа кэша, что приводило к несовместимости при использовании пользовательских классов запросов, в частностиShardedQuery
, который имеет несколько различных сигнатур аргументов.References: #4328
1.2.11¶
Released: August 20, 2018orm declarative¶
Исправлена проблема в ранее непроверенном варианте использования, позволяющая декларативному сопоставленному классу наследоваться от классически сопоставленного класса вне декларативной базы, включая то, что он учитывает несопоставленные промежуточные классы. Не отображенный промежуточный класс может указывать
__abstract__
, что теперь интерпретируется правильно, или промежуточный класс может оставаться не обозначенным, и классически отображенный базовый класс будет обнаружен в иерархии независимо от этого. Для того чтобы предусмотреть существующие сценарии, в которых классические отображения могут смешиваться с существующими декларативными иерархиями, теперь выдается ошибка, если для данного класса обнаружено несколько отображенных баз.References: #4321
sql¶
Исправлена проблема, тесно связанная с #3639, когда выражение, отображаемое в булевом контексте на неродном булевом бэкенде, сравнивалось с 1/0, даже если оно уже является неявно булевым выражением, при использовании
ColumnElement.self_group()
. Хотя это не влияет на дружественные бэкенды (MySQL, SQLite), это не было обработано Oracle (и, возможно, SQL Server). Является ли выражение неявно булевым или нет в любой базе данных, теперь определяется заранее в качестве дополнительной проверки, чтобы не генерировать целочисленное сравнение в процессе компиляции оператора.References: #4320
Добавлены недостающие параметры оконных функций
WithinGroup.over.range_
иWithinGroup.over.rows
к методамWithinGroup.over()
иFunctionFilter.over()
, чтобы соответствовать функции range/rows, добавленной к методу «over» функций SQL как часть #3049 в версии 1.1.References: #4322
Исправлена ошибка, при которой поддержка многотабличных операторов UPDATE и DELETE не рассматривала дополнительные элементы FROM как цели для корреляции, когда с оператором также сочетался коррелированный SELECT. Это изменение теперь включает, что оператор SELECT в предложении WHERE для такого оператора будет пытаться автокоррелировать обратно к этим дополнительным таблицам в родительском UPDATE/DELETE или безусловно коррелировать, если используется
Select.correlate()
. Обратите внимание, что автокорреляция приводит к ошибке, если в результате оператора SELECT не будет ни одного пункта FROM, что теперь может произойти, если родительский UPDATE/DELETE указывает те же таблицы в своем дополнительном наборе таблиц; для решения этой проблемы явно укажитеSelect.correlate()
.References: #4313
oracle¶
Для cx_Oracle типы данных Integer теперь будут привязываться к «int», согласно рекомендациям разработчиков cx_Oracle. Ранее использование cx_Oracle.NUMBER приводило к потере точности в серии cx_Oracle 6.x.
References: #4309
misc¶
Начал импортировать «collections» из «collections.abc» в Python 3.3 и выше для совместимости с Python 3.8. Pull request любезно предоставлен Натаниэлем Найтом.
Исправлена проблема, при которой имя «schema», используемое для базы данных SQLite в отражении таблицы, не приводило к корректному отражению имени схемы. Pull request любезно предоставлен Phillip Cloud.
1.2.10¶
Released: July 13, 2018orm¶
Исправлена ошибка в конструкции
Bundle
, когда размещение двух столбцов с одинаковым именем де-дублировалось, когдаBundle
использовались как часть визуализированного SQL, например, в ORDER BY или GROUP BY оператора.References: #4295
Исправлена регрессия в версии 1.2.9, связанная с #4287, когда использование опции
Load
в сочетании с подстановочным знаком строки приводило к ошибке TypeError.References: #4298
sql¶
Исправлена ошибка, при которой последовательность
Sequence
сбрасывалась явно перед любойTable
, ссылающейся на нее, что нарушало работу в случае, когда последовательность также участвует в серверном дефолте для этой таблицы при использованииMetaData.drop_all()
. Шаг, обрабатывающий последовательности, которые должны быть удалены с помощью не серверных функций умолчания столбцов, теперь вызывается после удаления самой таблицы.References: #4300
1.2.9¶
Released: June 29, 2018orm¶
Исправлена проблема, из-за которой цепочка из нескольких элементов join внутри
Query.join()
могла неправильно адаптироваться к предыдущей левой стороне, когда цепочка объединяла классы наследования, имеющие один и тот же базовый класс.References: #3505
Исправлена ошибка в генерации ключей кэша для запеченных запросов, которая могла привести к генерации слишком короткого ключа кэша в случае нетерпеливой загрузки подклассов. Это, в свою очередь, могло привести к тому, что запрос с нетерпеливой нагрузкой кэшировался вместо запроса без нетерпеливой нагрузки, или наоборот, для полиморфной нагрузки «selectin», или, возможно, для ленивой нагрузки или нагрузки selectin.
References: #4287
Исправлена ошибка в новой полиморфной загрузке селектинов, когда BakedQuery, используемый внутри, изменялся заданными опциями загрузчика, что приводило к неуместному изменению запроса подкласса, а также переносило эффект на последующие запросы.
References: #4286
Исправлена регрессия, вызванная #4256 (сама по себе являющаяся исправлением регрессии для #4228), которая нарушает недокументированное поведение, которое преобразовывало для не-последовательности сущностей, переданных непосредственно в конструктор
Query
, в одноэлементную последовательность. Хотя это поведение никогда не поддерживалось и не документировалось, оно уже используется, поэтому было добавлено в качестве поведенческого контракта вQuery
.References: #4269
Исправлена проблема, которая была как регрессом производительности в 1.2, так и неправильным результатом в отношении «запеченного» ленивого загрузчика, связанным с генерацией ключей кэша из опций загрузчика исходного объекта
Query
. Если опции загрузчика были построены в «разветвленном» стиле с использованием общих базовых элементов для нескольких опций, то одни и те же опции неоднократно выводились в ключ кэша, вызывая как проблемы с производительностью, так и генерацию неправильного ключа кэша. Это исправлено, а также улучшена производительность, когда такие «разветвленные» опции применяются черезQuery.options()
, чтобы предотвратить повторное применение одних и тех же объектов опций.References: #4270
sql¶
Исправлена регрессия в 1.2, связанная с #4147, когда у
Table
, у которого некоторые из его индексированных столбцов были переопределены новыми, как это происходит при переопределении столбцов во время отражения или при использованииTable.extend_existing
, методTable.tometadata()
при попытке скопировать эти индексы терпел неудачу, поскольку они по-прежнему ссылались на замененный столбец. Теперь логика копирования учитывает это условие.References: #4279
mysql¶
Исправлено удвоение знаков процента в диалекте mysql-connector-python, который не требует удвоения знаков процента. Кроме того, драйвер mysql-connector-python непоследователен в передаче имен столбцов в cursor.description, поэтому был добавлен обходной декодер для условного декодирования этих случайных иногда байтовых значений в юникод только при необходимости. Также улучшена тестовая поддержка mysql-connector-python, однако следует отметить, что этот драйвер все еще имеет проблемы с юникодом, которые до сих пор не решены.
Исправлена ошибка в отражении индекса, когда на MySQL 8.0 индекс, включающий ASC или DESC в спецификации индексированного столбца, не отражался корректно, так как MySQL 8.0 ввел поддержку возврата этой информации в строке определения таблицы.
References: #4293
Исправлена ошибка в диалекте MySQLdb и вариантах, таких как PyMySQL, когда дополнительная проверка «unicode returns» при подключении явно использует набор символов «utf8», что в MySQL 8.0 выдает предупреждение о том, что следует использовать utf8mb4. Теперь оно заменено на эквивалент utf8mb4. Документация также обновлена для диалекта MySQL, чтобы указать utf8mb4 во всех примерах. Дополнительные изменения были внесены в тестовый пакет для использования кодовых таблиц и баз данных utf8mb3 (в некоторых случаях с utf8mb4 возникают проблемы с кодировкой), а также для поддержки изменений конфигурации по умолчанию, внесенных в MySQL 8.0, таких как explicit_defaults_for_timestamp, а также новых ошибок, возникающих при недействительных индексах MyISAM.
References: #4283
Конструкция
Update
теперь вмещает объектJoin
, поддерживаемый MySQL для UPDATE..FROM. Поскольку конструкция уже принимает объект alias для аналогичной цели, возможность UPDATE против не-таблицы уже подразумевалась, поэтому она была добавлена.References: #3645
sqlite¶
Исправлена проблема в тестовом наборе, когда SQLite 3.24 добавлял новое зарезервированное слово, которое конфликтовало с использованием в TypeReflectionTest. Pull request любезно предоставлен Nils Philippsen.
mssql¶
Исправлена ошибка в отражении MSSQL, когда две одноименные таблицы в разных схемах имели одноименные ограничения первичного ключа, ограничения внешнего ключа, ссылающиеся на одну из таблиц, имели удвоенные столбцы, что приводило к ошибкам. Pull request любезно предоставлен Шоном Данном.
References: #4288
Исправлена проблема в диалекте SQL Server под Python 3, когда при запуске с нестандартной базой данных SQL сервера, не содержащей представлений «sys.dm_exec_sessions» или «sys.dm_pdw_nodes_exec_sessions», что приводило к сбою при получении уровня изоляции, повышение ошибки не происходило из-за UnboundLocalError.
References: #4273
oracle¶
Добавлено новое событие, используемое в настоящее время только диалектом cx_Oracle,
DialectEvents.setiputsizes()
. Это событие передает словарь объектовBindParameter
в объекты типов, специфичных для DBAPI, которые после преобразования в имена параметров будут переданы методу cx_Oraclecursor.setinputsizes()
. Это позволяет наблюдать за процессом setinputsizes, а также изменять поведение типов данных, передаваемых этому методу.См.также
cx_oracle_setinputsizes
References: #4290
Исправлен INSERT FROM SELECT с CTE для диалектов Oracle и MySQL, где CTE располагался над всем оператором, как это типично для других баз данных, однако Oracle и MariaDB 10.2 хотят, чтобы CTE находился под сегментом «INSERT». Обратите внимание, что диалекты Oracle и MySQL пока не работают, когда CTE применяется к подзапросу внутри оператора UPDATE или DELETE, поскольку CTE по-прежнему применяется сверху, а не внутри подзапроса.
References: #4275
misc¶
Добавлен новый атрибут
Query.lazy_loaded_from
, который заполняетсяInstanceState
, использующим этотQuery
для ленивой загрузки отношения. Смысл этого в том, что он служит подсказкой для использования функции горизонтального шардинга, так что идентификационный токен состояния может быть использован в качестве идентификационного токена по умолчанию для запроса в id_chooser().References: #4243
Заменили использование inspect.formatargspec() на vendored версию, скопированную из стандартной библиотеки Python, поскольку inspect.formatargspec() устарел и начиная с Python 3.7.0 выдает предупреждение.
References: #4291
1.2.8¶
Released: May 28, 2018orm¶
Исправлена регрессия в версии 1.2.7, вызванная #4228, которая сама по себе исправляла регрессию уровня 1.2, когда вызываемая функция
query_cls
, передаваемая вSession
, считалась подклассомQuery
с доступностью методов класса, в отличие от произвольной вызываемой функции. В частности, пример кэширования dogpile иллюстрируетquery_cls
как функцию, а не как подклассQuery
.References: #4256
Исправлена давняя регрессия, возникшая в версии 1.0, которая не позволяла использовать пользовательский
MapperOption
, изменяющий _параметры объектаQuery
для ленивой загрузки, поскольку сам ленивый загрузчик перезаписывал эти параметры. Это относится к примеру «временного диапазона» в вики. Однако обратите внимание, что методQuery.populate_existing()
теперь необходим для того, чтобы переписать параметры отображения, связанные с объектом, уже загруженным в карту идентичности.В рамках этого изменения пользовательское определение
MapperOption
теперь заставит ленивые загрузчики, связанные с целевым объектом, использовать по умолчанию непеченый запрос, если не реализован методMapperOption._generate_cache_key()
. В частности, это устраняет одну регрессию, возникшую при использовании примера dogpile.cache «advanced», который не возвращал кэшированные результаты и вместо этого выдавал SQL из-за несовместимости с загрузчиком запеченных запросов; с этим изменением опцияRelationshipCache
, включенная для многих релизов в пример dogpile, будет полностью отключать «запеченные» запросы. Обратите внимание, что пример dogpile также модернизирован, чтобы избежать обеих этих проблем в рамках выпуска #4258.References: #4128
Исправлена ошибка, при которой новый метод
Result.with_post_criteria()
некорректно взаимодействовал с загрузчиком подзапросов, в том смысле, что «критерии после» не применялись к встроенным загрузчикам подзапросов. Это связано с #4128 в том, что функция post criteria теперь используется ленивым загрузчиком.Обновлен пример dogpile.caching для включения новых структур, учитывающих систему запросов «baked», которая используется по умолчанию в ленивых загрузчиках и некоторых нетерпеливых загрузчиках отношений. Примеры dogpile.caching «relationship_caching» и «advanced» также были сломаны из-за #4256. Проблема здесь также решена исправлением в #4128.
References: #4258
engine¶
Исправлена проблема пула соединений, из-за которой, если ошибка разъединения возникала во время последовательности «сброса при возврате» пула соединений в сочетании с явной транзакцией, открытой против охватывающего объекта
Connection
(например, при вызовеSession.close()
без отката или фиксации, или при вызовеConnection.close()
без предварительного закрытия транзакции, объявленной с помощьюConnection.begin()
), возникала двойная проверка, что могло привести к параллельным проверкам одного и того же соединения. Теперь условие двойной проверки в целом предотвращается утверждением, а также исправлен конкретный сценарий двойной проверки.References: #4252
Исправлена проблема утечки ссылок, когда значения словаря параметров, используемого при выполнении оператора, оставались ссылочными в «скомпилированном кэше», в результате хранения представления ключей, используемого Python 3 dictionary keys(). Pull request любезно предоставлен Оливье Гризелем.
sql¶
Исправлена проблема, при которой сообщение об ошибке «неоднозначный литерал», используемое при интерпретации литеральных значений как значений SQL-выражения, встречало значение кортежа и не могло правильно отформатировать сообщение. Pull request любезно предоставлен Мигелем Вентурой.
mssql¶
Исправлена регрессия версии 1.2, вызванная использованием #4061, когда тип SQL Server «BIT» считался «родным булевым». Целью здесь было избежать создания ограничения CHECK для столбца, однако более серьезной проблемой является то, что значение BIT не ведет себя как константа true/false и не может быть интерпретировано как отдельное выражение, например, «WHERE <column>». Теперь диалект SQL Server возвращается к неродному булевому значению, но с дополнительным флагом, который все еще позволяет избежать создания ограничения CHECK.
References: #4250
oracle¶
Типы данных Oracle BINARY_FLOAT и BINARY_DOUBLE теперь участвуют в cx_Oracle.setinputsizes(), передавая NATIVE_FLOAT, чтобы поддерживать значение NaN. Кроме того,
BINARY_FLOAT
,BINARY_DOUBLE
иDOUBLE_PRECISION
теперь подклассFloat
, поскольку это типы данных с плавающей точкой, а не десятичные. Эти типы данных уже устанавливали флагFloat.asdecimal
по умолчанию в False в соответствии с тем, что уже делаетFloat
.References: #4264
Добавлены возможности отражения для типов данных
BINARY_FLOAT
,BINARY_DOUBLE
.Изменен диалект Oracle таким образом, что когда используется тип
Integer
, для setinputsizes() устанавливается тип cx_Oracle.NUMERIC. В SQLAlchemy 1.1 и более ранних версиях, cx_Oracle.NUMERIC передавался для всех числовых типов безусловно, а в 1.2 это было убрано, чтобы обеспечить лучшую точность чисел. Однако для целых чисел некоторые базы данных/клиенты не смогут преобразовать булевы значения True/False в целые числа, что приводит к регрессивному поведению при использовании SQLAlchemy 1.2. В целом, логика setinputsizes кажется более гибкой в будущем, так что это начало для этого.References: #4259
tests¶
Исправлена ошибка в тестовом наборе, когда если внешний диалект возвращал
None
дляserver_version_info
, логика исключения выдавалаAttributeError
.References: #4249
misc¶
Расширение горизонтального шардинга теперь использует маркер идентификации, добавляемый к ключам идентификации ORM как часть #4137, когда происходит обновление объекта или операция отложенной загрузки или удаления на основе столбцов. Поскольку мы знаем, из какого «шарда» был создан объект, мы используем это значение при обновлении, тем самым избегая запросов к другим шардам, которые в любом случае не соответствуют идентификатору этого объекта.
References: #4247
Исправлено состояние гонки, которое могло возникнуть, если automap
AutomapBase.prepare()
использовался в многопоточном контексте против других потоков, которые могли вызватьconfigure_mappers()
в результате использования других мапперов. Незавершенная работа automap над отображением особенно чувствительна к тому, что она может быть втянута шагомconfigure_mappers()
, приводящим к ошибкам.References: #4266
1.2.7¶
Released: April 20, 2018orm¶
Исправлена ошибка в версии 1.2 в функции шардированных запросов, когда новый элемент «identity_token» не учитывался корректно в рамках операции ленивой загрузки при поиске в карте идентификации связанного элемента «многие-к-одному». Новое поведение позволит использовать «id_chooser» для определения лучшего ключа идентификации для извлечения из карты идентификации. Для достижения этой цели рефакторинг подхода «identity_token» версии 1.2 внес некоторые незначительные изменения в реализацию
ShardedQuery
, которые следует учитывать при использовании других производных этого класса.References: #4228
Исправлена проблема в загрузке с одним наследованием, когда использование псевдонизированной сущности против подкласса с одним наследованием в сочетании с методом
Query.select_from()
приводило к тому, что SQL отображался с непсевдонизированной таблицей, смешанной с запросом, что вызывало декартово произведение. В частности, это влияло на новый загрузчик «selectin», когда он использовался против подкласса с одним наследованием.References: #4241
sql¶
Исправлена проблема, при которой компиляция оператора INSERT с опцией «literal_binds», который также использует явную последовательность и генерацию «inline», как в PostgreSQL и Oracle, не учитывала дополнительный аргумент ключевого слова в процедуре обработки последовательности.
References: #4231
postgresql¶
Добавлен новый тип PG
REGCLASS
, который помогает приводить имена таблиц к значениям OID. Pull request любезно предоставлен Себастьяном Банком.References: #4160
Исправлена ошибка, при которой специальный оператор «not equals» для типов данных PostgreSQL «range», таких как DATERANGE, не отображал «IS NOT NULL» при сравнении со значением Python
None
.References: #4229
mssql¶
oracle¶
Тип данных Oracle NUMBER отражается как INTEGER, если точность равна NULL и масштаб равен нулю, так как именно таким образом значения INTEGER возвращаются при отражении из таблиц Oracle. Pull request любезно предоставлен Кентом Бауэром.
1.2.6¶
Released: March 30, 2018orm¶
Исправлена ошибка, при которой использование
Mutable.associate_with()
илиMutable.as_mutable()
в сочетании с классом, у которого не первичные отобразители настроены с альтернативно названными атрибутами, приводило к ошибке атрибута. Поскольку непервичные отобразители не используются для персистентности, расширение mutable теперь исключает непервичные отобразители из своих шагов инструментации.References: #4215
engine¶
Исправлена ошибка в пуле соединений, когда соединение могло присутствовать в пуле без вызова всех обработчиков события «connect», если предыдущий обработчик «connect» выбрасывал исключение; обратите внимание, что сами диалекты имеют обработчики соединения, которые выдают SQL, например, те, которые устанавливают изоляцию транзакций, что может привести к сбою, если база данных находится в недоступном состоянии, но все равно позволяет соединение. Теперь соединение сначала аннулируется, если любой из обработчиков подключения не сработал.
References: #4225
sql¶
postgresql¶
Добавлена поддержка «PARTITION BY» в определениях таблиц PostgreSQL, используя «postgresql_partition_by». Pull request любезно предоставлен Всеволодом Соловьевым.
mssql¶
Скорректировано определение версии SQL Server для pyodbc, чтобы разрешить только числовые лексемы, отфильтровывая нецелые числа, поскольку диалект выполняет сравнение кортежей с числовыми значениями. Обычно это справедливо для всех известных драйверов SQL Server / pyodbc в любом случае.
References: #4227
oracle¶
Минимальная поддерживаемая версия cx_Oracle - 5.2 (июнь 2015 года). Ранее диалект утверждал, что поддерживается версия 5.0, но начиная с версии 1.2.2 мы используем некоторые символы, которые появились только в версии 5.2.
References: #4211
misc¶
Устранено предупреждение, которое выдавалось при вызове методов
__table_args__
,__mapper_args__
, названных вместе с методом@declared_attr
, при вызове из не сопоставленного декларативного миксина. Вызов этих методов напрямую документирован как подход, который следует использовать при переопределении одного из этих методов в сопоставленном классе. Предупреждение по-прежнему выдается для обычных имен атрибутов.References: #4221
1.2.5¶
Released: March 6, 2018orm¶
Добавлена новая функция
Query.only_return_tuples()
. Заставляет объектQuery
безоговорочно возвращать объекты кортежей с ключами, даже если запрос выполняется к одной сущности. Pull request любезно предоставлен Эриком Аткином.Исправлена ошибка в новой загрузке «polymorphic selectin», когда выборка полиморфных объектов частично загружалась из ленивого загрузчика отношений, что приводило к условию «пустой IN» в загрузке, вызывающему ошибку для «inline» формы «IN».
References: #4199
Исправлена регрессия 1.2, когда опция маппера, содержащая объект
AliasedClass
, что типично при использовании методаQueryableAttribute.of_type()
, не могла быть замаринована. В версии 1.1 было принято опускать объекты псевдокласса из пути, поэтому это поведение восстановлено.References: #4209
sql¶
Исправлена ошибка в методе :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 theClauseElement.params()
.References: #4210
Исправлена ошибка в визуализации CTE, когда
CTE
, который также был превращен вAlias
, не отображал должным образом пункт «ctename AS aliasname», если в пункте FROM было более одной ссылки на CTE.References: #4204
Исправлена ошибка в новой функции «расширение IN параметра», когда процессоры привязки параметров для значений не работали вообще, тесты не смогли охватить этот довольно простой случай, который включает в себя то, что значения ENUM не работали.
References: #4198
postgresql¶
mysql¶
Диалекты 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, 2018orm¶
engine¶
sql¶
Исправлена ошибка, при которой выражения CTE не заключали свое имя или имя псевдонима в кавычки, если данное имя чувствительно к регистру или иным образом требует заключения в кавычки. Pull request любезно предоставлен Эриком Аткином.
References: #4197
1.2.3¶
Released: February 16, 2018orm¶
Добавлен новый аргумент
set_attribute.inititator
к функцииset_attribute()
, позволяющий распространять маркер события, полученный от функции-слушателя, на последующие события набора.Исправлена проблема в функции post_update, когда UPDATE выдавался, когда родительский объект был удален, но зависимый объект не был удален. Эта проблема существовала уже давно, однако с тех пор, как в версии 1.2 для функции post_update теперь утверждается, что строки совпадают, это приводило к ошибке.
This change is also backported to: 1.1.16
References: #4187
Исправлена регрессия, вызванная исправлением проблемы #4116, затрагивающей версии 1.2.2 и 1.1.15, которая приводила к неправильному вычислению «класса-владельца»
AssociationProxy
как классаNoneType
в некоторых ситуациях декларативного смешивания/наследования, а также если доступ к прокси ассоциации осуществлялся из не отображенного класса. Логика «выяснить владельца» была заменена глубокой процедурой, которая ищет по всей иерархии маппера, назначенной классу или подклассу, чтобы определить правильное (мы надеемся) соответствие; не будет назначать владельца, если соответствие не найдено. Если прокси используется против экземпляра, не отображенного на карте, то возникает исключение.This change is also backported to: 1.1.16
References: #4185
Исправлена ошибка, при которой объект
Bundle
некорректно сообщал о первичном объектеMapper
, представленном пучком, если таковой имеется. Непосредственным побочным эффектом этой проблемы было то, что новая стратегия загрузчика selectinload не работала с расширением горизонтального шардинга.References: #4175
Исправлена ошибка в отображении конкретного наследования, когда определяемые пользователем атрибуты, такие как гибридные свойства, которые отражают имена отображаемых атрибутов из классов-сестер, перезаписывались маппером как недоступные на уровне экземпляра. Дополнительно обеспечено, что привязанные к пользователю дескрипторы не вызываются неявно на уровне класса на этапе настройки отображения.
References: #4188
Исправлена ошибка, при которой помощник события
reconstructor()
не распознавался, если он применялся к методу__init__()
сопоставленного класса.References: #4178
engine¶
Исправлена ошибка, при которой события, связанные с
Engine
на уровне класса, удваивались при использовании методаEngine.execution_options()
. Для этого получастный классOptionEngine
больше не принимает события непосредственно на уровне класса и будет выдавать ошибку; класс распространяет события только на уровне класса от своего родителяEngine
. События на уровне экземпляра продолжают работать как и раньше.References: #4181
Объект
URL
теперь позволяет указывать ключи запроса несколько раз, где их значения будут объединены в список. Это сделано для поддержки функции plugins, документированной вCreateEnginePlugin
, где указано, что «plugin» можно передавать несколько раз. Кроме того, имена плагинов могут быть переданы вcreate_engine()
вне URL с помощью нового параметраcreate_engine.plugins
.References: #4170
sql¶
Добавлена поддержка
Enum
для сохранения значений перечисления, а не ключей, при использовании перечислимого объекта в стиле Python pep-435. Пользователь предоставляет вызываемую функцию, которая возвращает сохраняемые строковые значения. Это позволяет перечислениям для нестроковых значений также быть персистируемыми по значению. Pull request любезно предоставлен Джоном Снайдером.References: #3906
Исправлена ошибка, при которой тип
Enum
не мог корректно обрабатывать «псевдонимы» перечислений, когда более одного ключа ссылались на одно и то же значение. Pull request любезно предоставлен Даниэлем Кнеллом.References: #4180
postgresql¶
Добавлено сообщение «Ошибка SSL SYSCALL: Operation timed out» в список сообщений, вызывающих сценарий «disconnect» для драйвера psycopg2. Pull request любезно предоставлен Андре Крузом.
This change is also backported to: 1.1.16
Добавлено «TRUNCATE» в список ключевых слов, принимаемых диалектом PostgreSQL в качестве ключевых слов, запускающих «автокоммит». Pull request любезно предоставлен Джейкобом Хейсом.
This change is also backported to: 1.1.16
sqlite¶
Исправлена ошибка импорта, возникающая, когда на платформе не установлены ни pysqlite2, ни sqlite3, так что возникает ошибка импорта, связанная с sqlite3, а не с pysqlite2, которая не является фактической причиной сбоя. Pull request любезно предоставлен Робином.
oracle¶
Опции ON DELETE для внешних ключей теперь являются частью Oracle reflection. Oracle не поддерживает каскады ON UPDATE. Pull request любезно предоставлен Мирославом Шубернецким.
Исправлена ошибка в определении разъединения cx_Oracle, используемая pre_ping и другими функциями, когда ошибка могла быть вызвана как DatabaseError, включающая числовой код ошибки; ранее мы не проверяли в этом случае код разъединения.
References: #4182
tests¶
Тест, добавленный в 1.2, который должен был подтвердить поведение Python 2.7, как оказалось, подтверждает поведение только в Python 2.7.8. Ошибка Python #8743 все еще влияет на сравнение множеств в Python 2.7.7 и более ранних версиях, поэтому тест с участием AssociationSet больше не работает для этих старых версий Python 2.7.
References: #3265
misc¶
Исправлена довольно серьезная ошибка в пуле соединений, когда соединение, полученное после обновления в результате пользовательского
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, 2018orm¶
Исправлена регрессия 1.2, касающаяся нового события bulk_replace, когда обратная ссылка не могла удалить объект от предыдущего владельца, когда массовое назначение присваивало объект новому владельцу.
References: #4171
mysql¶
Добавлено больше зарезервированных слов MySQL 8.0 в диалект MySQL для целей цитирования. Pull request любезно предоставлен Riccardo Magliocchetti.
mssql¶
Добавлен код ошибки ODBC 10054 в список кодов ошибок, которые считаются отключением для ODBC / MSSQL сервера.
References: #4164
oracle¶
Диалект cx_Oracle теперь вызывает setinputsizes() с cx_Oracle.NCHAR безусловно, когда используется тип данных NVARCHAR2, в SQLAlchemy соответствующий sqltypes.Unicode(). По мнению автора cx_Oracle, это позволяет выполнять корректные преобразования в клиенте Oracle независимо от настройки NLS_NCHAR_CHARACTERSET.
References: #4163
1.2.1¶
Released: January 15, 2018orm¶
Исправлена ошибка, при которой объект, удаляемый при откате вложенной или подтранзакции, у которой также был изменен первичный ключ, не удалялся корректно из сессии, что вызывало последующие проблемы при использовании сессии.
This change is also backported to: 1.1.16
References: #4151
Исправлена регрессия, когда формат pickle объекта Load / _UnboundLoad (например, опции загрузчика) изменялся, и
__setstate__()
вызывал ошибку UnboundLocalError для объекта, полученного в устаревшем формате, несмотря на то, что была предпринята попытка сделать это. теперь добавлены тесты, чтобы убедиться, что это работает.References: #4159
Исправлена регрессия, вызванная новой схемой кэширования lazyload в #3954, когда запрос, использующий опции загрузчика с of_type, приводил к тому, что lazyload несвязанных путей завершался с ошибкой TypeError.
References: #4153
Исправлена ошибка в новом загрузчике отношений «selectin», когда загрузчик мог попытаться загрузить несуществующее отношение при загрузке коллекции полиморфных объектов, где только некоторые из отображателей включают это отношение, обычно при использовании
PropComparator.of_type()
.References: #4156
sql¶
Исправлена ошибка в
Insert.values()
, когда использование формата «multi-values» в сочетании с объектамиColumn
в качестве ключей, а не строк, приводило к ошибке. Pull request любезно предоставлен Обри Старк-Толлером.This change is also backported to: 1.1.16
References: #4162
mssql¶
Исправлена регрессия в версии 1.2, при которой вновь исправленное цитирование имен раскладки в #3785 нарушало работу SQL Server, который явно не понимает цитируемое имя раскладки. Вопрос о том, заключать ли имена collation в смешанном регистре в кавычки или нет, теперь отложен на уровень диалекта, так что каждый диалект может подготавливать эти идентификаторы напрямую.
References: #4154
oracle¶
Исправлена регрессия, когда удаление большинства правил setinputsizes из диалекта cx_Oracle влияло на способность типа данных TIMESTAMP извлекать дробные секунды.
References: #4157
Исправлена регрессия в импорте Oracle, когда пропущенная запятая приводила к появлению неопределенного символа. Pull request любезно предоставлен Мирославом Шубернецким.
tests¶
Удалено специфическое для oracle правило требований из публичного набора тестов, которое мешало работе наборов диалектов сторонних разработчиков.
Добавлено новое правило исключения group_by_complex_expression, которое отключает тесты, использующие «GROUP BY <expr>», что кажется нежизнеспособным, по крайней мере, для двух сторонних диалектов.
misc¶
Исправлена регрессия в ассоциативном прокси из-за #3769 (разрешение цепочки any() / has()), где contains() против ассоциативного прокси, соединенного в цепочку в форме (o2m relationship, associationproxy(m2o relationship, m2o relationship)), вызывал ошибку относительно повторного применения contains() на последнем звене цепочки.
References: #4150
1.2.0¶
Released: December 27, 2017orm¶
Добавлен новый член данных в кортеж ключей идентификации, используемый картой идентификации ORM, известный как «identity_token». По умолчанию этот токен равен None, но может использоваться схемами шардинга баз данных для различения объектов в памяти с одинаковым первичным ключом, которые происходят из разных баз данных. Расширение горизонтального шардинга интегрирует этот токен, применяя к нему идентификатор шардинга, что позволяет дублировать первичные ключи в бэкендах с горизонтальным шардингом.
References: #4137
Исправлена ошибка, при которой прокси ассоциации непреднамеренно связывался с объектом
AliasedClass
, если он был вызван первым сAliasedClass
в качестве родителя, что приводило к ошибкам при последующем использовании.This change is also backported to: 1.1.15
References: #4116
Исправлена ошибка в опции запроса
contains_eager()
, когда при использовании пути, использующегоPropComparator.of_type()
для ссылки на подкласс на более чем одном уровне объединений, требовалось, чтобы аргумент «alias» также имел тот же подтип, чтобы избежать добавления ненужных предложений FROM в запрос; кроме того, использованиеcontains_eager()
через подклассы, использующиеaliased()
объекты подклассов в качестве аргументаPropComparator.of_type()
, также будет отображаться корректно.References: #4130
Метод
Query.exists()
теперь будет отключать загрузчики нетерпеливой загрузки на время выполнения запроса. Раньше ненужным образом отображались джойны с нетерпеливой загрузкой, а также ненужным образом генерировались запросы с нетерпеливой загрузкой подзапросов. Новое поведение соответствует поведению методаQuery.subquery()
.References: #4032
orm declarative¶
Исправлена ошибка, при которой дескриптор, находящийся в другом месте сопоставленного столбца или отношения в иерархии, основанной на
AbstractConcreteBase
, ссылался на него во время операции обновления, вызывая ошибку, поскольку атрибут не сопоставлен как свойство маппера. Аналогичная проблема может возникнуть и для других атрибутов, таких как колонка «type», добавляемаяAbstractConcreteBase
, если класс не включит «concrete=True» в свой маппер, однако проверка здесь также должна предотвратить возникновение проблемы.This change is also backported to: 1.1.15
References: #4124
engine¶
Атрибутом «password» объекта
URL
теперь может быть любой определяемый пользователем или подклассифицированный пользователем строковый объект, отвечающий встроенному модулю Pythonstr()
. Переданный объект будет сохранен как член данныхURL.password_original
и будет использоваться при чтении атрибутаURL.password
для получения строкового значения.References: #4089
sql¶
Исправлена ошибка, при которой
__repr__
изColumnDefault
не выполнялось, если аргумент представлял собой кортеж. Pull request любезно предоставлен Nicolas Caniart.This change is also backported to: 1.1.15
References: #4126
Переработана новая функция «автоэскейп», представленная в Новая опция «autoescape» для startswith(), endswith() в версии 1.2.0b2, чтобы сделать ее полностью автоматической; теперь символ эскейпа по умолчанию - передняя косая черта
"/"
и применяется к процентам, подчеркиванию, а также к самому символу эскейпа для полностью автоматической эскейпизации. Символ также можно изменить с помощью параметра «escape».References: #2694
Исправлена ошибка, при которой метод
Table.tometadata()
не позволял правильно обрабатывать объектыIndex
, не состоящие из простых выражений столбцов, например, индексы против конструкцииtext()
, индексы, использующие SQL-выражения илиfunc
и т.д. Теперь процедура полностью копирует выражения в новый объектIndex
, заменяя все связанные с таблицей объектыColumn
на объекты целевой таблицы.References: #4147
Изменено «имя посещения»
ColumnElement
с «column» на «column_element», чтобы при использовании этого элемента в качестве основы для пользовательского элемента SQL, не предполагалось, что он будет вести себя как связанный с таблицейColumnClause
при обработке различными утилитами обхода SQL, обычно используемыми ORM.References: #4142
Исправлена проблема в типе данных
ARRAY
, которая по сути является той же проблемой, что и #3832, за исключением регрессии, когда события прикрепления колонок поверхARRAY
срабатывали некорректно, мешая работе систем, которые полагаются на это. Ключевым примером использования, который был нарушен из-за этого, является использование миксинов для объявления колонок, которые используютMutableList.as_mutable()
.References: #4141
Исправлена ошибка в новой функции «расширение параметра связывания», когда если в одном операторе использовалось несколько параметров, регулярное выражение не соответствовало имени параметра.
References: #4140
Реализован синтаксис «DELETE..FROM» для PostgreSQL, MySQL, MS SQL Server (а также в неподдерживаемом диалекте Sybase) аналогично тому, как работает «UPDATE..FROM». Оператор DELETE, который ссылается на более чем одну таблицу, переключится в режим «multi-table» и выдаст соответствующий пункт «USING» или «FROM» для нескольких таблиц, как это понимает база данных. Pull request любезно предоставлен Питером Малдером.
References: #959
postgresql¶
Добавлен новый тип данных
MONEY
. Pull request любезно предоставлен Cleber J Santos.
mysql¶
MySQL 5.7.20 теперь предупреждает об использовании переменной @tx_isolation; теперь выполняется проверка версии и вместо нее используется @transaction_isolation для предотвращения этого предупреждения.
This change is also backported to: 1.1.15
References: #4120
Исправлена регрессия из выпуска 1.2.0b3, когда сравнение версии «MariaDB» могло завершиться неудачей для некоторых определенных строк версии MariaDB под Python 3.
References: #4115
mssql¶
Исправлена ошибка, при которой типы данных sqltypes.BINARY и sqltypes.VARBINARY не включали корректные обработчики связанных значений для pyodbc, что позволяет передавать значение pyodbc.NullParam, которое помогает при работе с FreeTDS.
References: #4121
oracle¶
Добавлены некоторые дополнительные правила для полной обработки значений
Decimal('Infinity')
,Decimal('-Infinity')
с числовыми значениями cx_Oracle при использованииasdecimal=True
.References: #4064
misc¶
В документацию добавлен новый раздел ошибок с информацией об общих сообщениях об ошибках. Выбранные исключения в SQLAlchemy будут содержать ссылку в их строковом выводе на соответствующий раздел на этой странице.
Добавлен новый метод
Result.with_post_criteria()
в систему запеченных запросов, позволяющий выполнять не модифицирующие SQL преобразования после того, как запрос был извлечен из кэша. Помимо прочего, этот метод можно использовать вместе сShardedQuery
для установки идентификатора шарда.ShardedQuery
также был модифицирован таким образом, что его методShardedQuery.get()
корректно взаимодействует с методомResult
.References: #4135
1.2.0b3¶
Released: October 13, 2017orm¶
Исправлена ошибка, когда ORM отношения предупреждали о конфликтующих целях синхронизации (например, два отношения записывали в один и тот же столбец) для классов-близнецов в иерархии наследования, хотя на самом деле эти два отношения никогда не конфликтуют во время записи.
This change is also backported to: 1.1.15
References: #4078
Исправлена ошибка, при которой корреляционный select, используемый против сущности наследования одной таблицы, не отображался корректно во внешнем запросе из-за того, что корректировка критериев дискриминатора одиночного наследования неправомерно повторно применяла критерии к внешнему запросу.
This change is also backported to: 1.1.15
References: #4103
Исправлена ошибка в
Session.merge()
, аналогичная ошибке в #4030, когда внутренняя проверка целевого объекта в карте идентификации могла привести к ошибке, если она собирала мусор непосредственно перед тем, как процедура слияния действительно извлекала объект.This change is also backported to: 1.1.14
References: #4069
Исправлена ошибка, при которой опция
undefer_group()
не распознавалась, если она расширялась из отношения, которое загружалось с использованием объединенной ускоренной загрузки. Кроме того, поскольку ошибка приводила к избыточной работе, количество вызовов функций Python также улучшено на 20% при первоначальном вычислении столбцов набора результатов, дополняя улучшения объединенной ускоренной загрузки #3915.This change is also backported to: 1.1.14
References: #4048
Исправлена ошибка в
Session.merge()
, когда объекты в коллекции, у которых атрибут первичного ключа был установлен вNone
для ключа, который обычно является автоинкрементным, считались персистирующим ключом базы данных для части внутреннего процесса дедупликации, в результате чего только один объект фактически вставлялся в базу данных.This change is also backported to: 1.1.14
References: #4056
Возникает ошибка
InvalidRequestError
, когдаsynonym()
используется против атрибута, который не используется противMapperProperty
, например, прокси ассоциации. Ранее при попытке найти несуществующие атрибуты возникало переполнение рекурсии.This change is also backported to: 1.1.14
References: #4067
Исправлена регрессия, появившаяся в 1.2.0b1 из-за #3934, когда
Session
не удавалось «деактивировать» транзакцию, если откат не удался (целевая проблема возникает, когда MySQL теряет отслеживание SAVEPOINT). Это приводило к тому, что последующий вызовSession.rollback()
вызывал ошибку во второй раз, вместо того, чтобы завершить и вернутьSession
в состояние ACTIVE.References: #4050
Исправлена проблема, когда функция
make_transient_to_detached()
заканчивала действие всех атрибутов целевого объекта, включая «отложенные» атрибуты, что приводило к тому, что атрибут оставался неотложенным при следующем обновлении, вызывая неожиданную загрузку атрибута.References: #4084
Исправлена ошибка, связанная с каскадом удаления сирот, когда связанный элемент, который становится сиротой до того, как родительский объект становится частью сессии, все еще отслеживается как переходящий в статус сироты, в результате чего он удаляется из сессии вместо того, чтобы быть смытым.
Примечание
Это исправление было случайно объединено во время выпуска 1.2.0b3 и не было добавлено в журнал изменений в то время. Эта заметка была добавлена в журнал изменений задним числом, начиная с версии 1.2.13.
References: #4040
Исправлена ошибка в «selectin» полиморфная загрузка, загружает подклассы с помощью отдельных IN-запросов, из-за которой настройки «selectin» и «inline» в многоуровневой иерархии классов не взаимодействовали друг с другом, как ожидалось. В документацию добавлен новый пример.
References: #4026
Удалены предупреждения, которые выдаются, когда LRU-кэши, используемые стратегиями mapper, а также loader, достигают своего порога; сначала это предупреждение было защитой от генерации избыточных ключей кэша, но затем стало проверкой антипаттерна «создание многих движков». Хотя это все еще антипаттерн, наличие тестовых наборов, которые как создают движок для каждого теста, так и повышают уровень предупреждений, будет неудобством; не должно быть критичным, чтобы такие тестовые наборы меняли свою архитектуру только ради этого предупреждения (хотя набор движков для каждого теста всегда лучше).
References: #4071
Исправлена регрессия, при которой использование опции
undefer_group()
в сочетании с опцией отношения с ленивой загрузкой приводило к ошибке атрибута, из-за ошибки в генерации ключей кэша SQL, добавленной в 1.2 как часть #3954.References: #4049
Модифицировано изменение, внесенное в оценщик обновлений/удалений ORM в #3366 таким образом, что если в обновлении или удалении присутствует выражение с несопоставленными столбцами, если оценщик может сопоставить его имя с сопоставленными столбцами целевого класса, то выдается предупреждение, а не возникает UnevaluatableError. По сути, это поведение, существовавшее до версии 1.2, и оно должно обеспечить миграцию приложений, которые в настоящее время полагаются на этот шаблон. Однако, если заданное имя атрибута не может быть сопоставлено со столбцами отображающего устройства, UnevaluatableError все равно будет выдано, что и было исправлено в #3366.
References: #4073
orm declarative¶
Если подкласс пытается переопределить атрибут, который был объявлен в суперклассе с помощью
@declared_attr.cascading
, выдается предупреждение, что переопределенный атрибут будет проигнорирован. Этот случай использования не может быть полностью поддержан вплоть до последующих подклассов без более сложных усилий по разработке, поэтому для последовательности «каскадирование» соблюдается на всех уровнях, независимо от переопределения атрибутов.References: #4091
Предупреждение выдается, если атрибут
@declared_attr.cascading
используется со специальным декларативным именем, таким как__tablename__
, так как это не имеет никакого эффекта.References: #4092
engine¶
Добавлены методы
__next__()
иnext()
кResultProxy
, чтобы встроенная функцияnext()
работала на объекте напрямую.ResultProxy
уже давно имеет метод__iter__()
, который уже позволяет ему реагировать на встроенную функциюiter()
. Реализация для__iter__()
осталась без изменений, поскольку тестирование производительности показало, что итерация с использованием метода__next__()
сStopIteration
примерно на 20% медленнее как в Python 2.7, так и в 3.6.References: #4077
Внесены некоторые изменения в
Pool
иConnection
, чтобы логика восстановления не выполнялась под ловушками исключений дляpool.Empty
,AttributeError
, поскольку когда сама операция восстановления терпит неудачу, Python 3 создает вводящую в заблуждение трассировку стека, ссылаясь наEmpty
/AttributeError
как на причину, когда на самом деле эти ловушки исключений являются частью потока управления.References: #4028
sql¶
Исправлена ошибка, при которой недавно добавленные методы
ColumnOperators.any_()
иColumnOperators.all_()
не работали, если вызывались как методы, в отличие от использования отдельных функцийany_()
иall_()
. Также добавлены примеры документации для этих относительно неинтуитивных операторов SQL.This change is also backported to: 1.1.15
References: #4093
Добавлен новый метод
DefaultExecutionContext.get_current_parameters()
, который используется в генераторе значений по умолчанию на основе функции для получения текущих параметров, передаваемых в оператор. Новая функция отличается от атрибутаDefaultExecutionContext.current_parameters
тем, что в ней также предусмотрена опциональная группировка параметров, соответствующих многозначной конструкции «вставка». Ранее было невозможно определить подмножество параметров, имеющих отношение к вызову функции.References: #4075
Исправлена ошибка в новой функции комментариев SQL, когда комментарий таблицы и столбца не копировался при использовании
Table.tometadata()
.References: #4087
В выпуске 1.1 тип
Boolean
был нарушен в том смысле, что принуждение к булевым значениям черезbool()
происходило для бэкендов, не поддерживающих «native boolean», но не происходило для бэкендов с «native boolean», что означает, что строка"0"
теперь ведет себя непоследовательно. После опроса был достигнут консенсус, что небулевые значения должны вызывать ошибку, особенно в неоднозначном случае строки"0"
; поэтому тип данныхBoolean
теперь будет вызывать ошибкуValueError
, если входящее значение не находится в диапазонеNone, True, False, 1, 0
.References: #4102
Уточнено поведение
Operators.op()
таким образом, что во всех случаях, если флагOperators.op.is_comparison
установлен в True, возвращаемый тип результирующего выражения будетBoolean
, а если флаг False, то возвращаемый тип результирующего выражения будет того же типа, что и тип левого выражения, что является типичным поведением по умолчанию для других операторов. Также добавлен новый параметрOperators.op.return_type
, а также вспомогательный методOperators.bool_op()
.References: #4063
Внутренние усовершенствования типов
Enum
,Interval
иBoolean
, которые теперь расширяют общий миксинEmulated
, указывающий на тип, который обеспечивает эмуляцию нативного типа БД со стороны Python, переключаясь на нативный тип БД, когда используется поддерживающий бэкенд. Тип PostgreSQLINTERVAL
при прямом использовании теперь будет включать правильные правила коэрцитивности типов для SQL-выражений, которые также действуют дляInterval
(например, добавление даты к интервалу дает datetime).References: #4088
postgresql¶
Добавлен новый флаг
use_batch_mode
в диалект psycopg2. Этот флаг позволяет использовать расширение psycopg2psycopg2.extras.execute_batch
при обращенииEngine
кcursor.executemany()
. Это расширение обеспечивает критическое увеличение производительности более чем на порядок при пакетном выполнении операторов INSERT. По умолчанию флаг равен False, так как пока он считается экспериментальным.References: #4109
Внесены дополнительные исправления в класс
ARRAY
в сочетании с COLLATE, так как исправление, сделанное в #4006, не подходило для многомерного массива.This change is also backported to: 1.1.15
References: #4006
Исправлена ошибка в функции
array_agg
, когда при передаче аргумента, уже имеющего типARRAY
, например, конструкции PostgreSQLarray
, возникала ошибкаValueError
, связанная с тем, что функция пыталась вложить массивы.This change is also backported to: 1.1.15
References: #4107
Исправлена ошибка в PostgreSQL
Insert.on_conflict_do_update()
, которая не позволяла использовать оператор insert в качестве CTE, например, черезInsert.cte()
, внутри другого оператора.This change is also backported to: 1.1.15
References: #4074
Исправлена ошибка, при которой драйвер pg8000 терпел неудачу при использовании
MetaData.reflect()
с именем схемы, поскольку имя схемы отправлялось в виде объекта «quoted_name», являющегося подклассом string, который pg8000 не распознает. Тип quoted_name добавляется в коллекцию py_types pg8000 при подключении.References: #4041
Включена поддержка UUID для драйвера pg8000, который поддерживает встроенные в Python обходы uuid для этого типа данных. Однако массивы UUID по-прежнему не поддерживаются.
References: #4016
mysql¶
Предупреждение выдается при обнаружении 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
Исправлена проблема, при которой CURRENT_TIMESTAMP некорректно отражалась в серии MariaDB 10.2 из-за изменения синтаксиса, где функция теперь представлена в виде
current_timestamp()
.This change is also backported to: 1.1.15
References: #4096
MariaDB 10.2 теперь поддерживает ограничения CHECK (предупреждение: используйте версию 10.2.9 или выше из-за проблем с восходящим потоком, отмеченных в #4097). Reflection теперь учитывает эти ограничения CHECK, когда они присутствуют в выводе
SHOW CREATE TABLE
.This change is also backported to: 1.1.15
References: #4098
Изменили название атрибута
.values
новой конструкции MySQL INSERT..ON DUPLICATE KEY UPDATE на.inserted
, так какInsert
уже имеет метод под названиемInsert.values()
. Атрибут.inserted
в конечном счете отображает функцию MySQLVALUES()
.References: #4072
sqlite¶
Исправлена ошибка, при которой отражение ограничений SQLite CHECK не работало, если таблица, на которую ссылались, находилась в удаленной схеме, например, на SQLite удаленная база данных, на которую ссылался ATTACH.
This change is also backported to: 1.1.15
References: #4099
mssql¶
Добавлен новый тип данных
TIMESTAMP
, который правильно действует как двоичный тип данных для SQL Server, а не как тип datetime, поскольку SQL Server здесь нарушает стандарт SQL. Также добавлен типROWVERSION
, поскольку тип «TIMESTAMP» в SQL Server устарел в пользу ROWVERSION.References: #4086
В диалекты PyODBC и pymssql добавлена поддержка уровня изоляции «AUTOCOMMIT», устанавливаемого через
Connection.execution_options()
. Этот уровень изоляции устанавливает соответствующие флаги, специфичные для DBAPI, на базовом объекте соединения.References: #4058
В диалект PyODBC для SQL Server добавлен полный набор кодов исключений «соединение закрыто», включая „08S01“, „01002“, „08003“, „08007“, „08S02“, „08001“, „HYT00“, „HY010“. Ранее охватывался только „08S01“.
This change is also backported to: 1.1.15
References: #4095
SQL Server поддерживает то, что SQLAlchemy называет «родным boolean» с его типом BIT, поскольку этот тип принимает только 0 или 1, а DBAPI возвращают его значение как True/False. Таким образом, диалекты SQL Server теперь поддерживают «родную булеву», т.е. ограничение CHECK не генерируется для типа данных
Boolean
. Единственное отличие от других нативных boolean заключается в том, что здесь нет констант «true» / «false», поэтому «1» и «0» все еще отображаются.References: #4061
Исправлен диалект pymssql таким образом, что знаки процентов в тексте SQL, например, используемые в выражениях по модулю или буквальных текстовых значениях, не удваиваются, как, по-видимому, ожидает pymssql. Это происходит несмотря на то, что pymssql DBAPI использует стиль параметров «pyformat», который сам считает знак процента значимым.
References: #4057
Исправлена ошибка, при которой диалект SQL Server мог извлекать столбцы из нескольких схем при отражении самореферентного ограничения внешнего ключа, если несколько схем содержали одноименное ограничение для одноименной таблицы.
References: #4060
Добавлен новый класс «rowcount support» для диалектов, специфичный для случаев, когда используется «RETURNING», что на SQL Server выглядит как «OUTPUT inserted», так как бэкенд PyODBC не может предоставить нам подсчет рядов в операторе UPDATE или DELETE, когда действует OUTPUT. Это в первую очередь влияет на ORM, когда при обновлении строки, содержащей вычисленные сервером значения, возникает ошибка, если бэкенд не возвращает ожидаемое количество строк. PyODBC теперь заявляет, что он поддерживает подсчет рядов, кроме случаев, когда присутствует OUTPUT.inserted, что учитывается ORM во время флеша, чтобы определить, будет ли он искать подсчет рядов.
References: #4062
Включен флаг «sane_rowcount» для диалекта pymssql, указывающий на то, что DBAPI теперь сообщает правильное количество строк, затронутых оператором UPDATE или DELETE. Это в основном влияет на функцию версионности ORM, поскольку теперь она может проверять количество затронутых строк в целевой версии.
Добавлено правило для отражения индексов SQL Server для игнорирования так называемого «кучного» индекса, который неявно присутствует в таблице, в которой не указан кластеризованный индекс.
References: #4059
oracle¶
Исправлена регрессия производительности, вызванная исправлением для #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 «бесконечность» реализована в cx_Oracle, используя только плавающие значения Python, например,
float("inf")
. Поддержка десятичных дробей пока не реализована в драйвере cx_Oracle DBAPI.References: #4064
Диалект cx_Oracle был переработан и модернизирован, чтобы использовать преимущества новых паттернов, которых не было в старой серии cx_Oracle 4.x. Это включает, что минимальной версией cx_Oracle является серия 5.x и что cx_Oracle 6.x теперь полностью протестирован. Наиболее значительные изменения касаются преобразования типов, в первую очередь числовых типов данных / типов данных с плавающей точкой и LOB, более эффективного использования крючков обработки типов cx_Oracle для упрощения обработки параметров привязки и данных результата.
поддержка двух фаз для cx_Oracle была полностью удалена для всех версий cx_Oracle, тогда как в версии 1.2.0b1 это изменение вступило в силу только для серии cx_Oracle 6.x. Эта функция никогда не работала корректно ни в одной версии cx_Oracle, а в cx_Oracle 6.x API, на который опирался SQLAlchemy, был удален.
References: #3997
Ключи столбцов, присутствующие в наборе результатов при использовании
Insert.returning()
с бэкендом cx_Oracle, теперь используют правильные имена столбцов / меток, как и во всех других диалектах. Ранее они отображались какret_nnn
.Несколько параметров диалекта cx_Oracle теперь устарели и не будут иметь никакого эффекта:
auto_setinputsizes
,exclude_setinputsizes
,allow_twophase
.Исправлена ошибка, когда индекс, отраженный в Oracle с выражением типа «column DESC», не возвращался, если таблица также не имела первичного ключа, в результате логики, пытающейся отфильтровать индекс, неявно добавленный Oracle к столбцам первичного ключа.
References: #4042
Исправлено больше регрессий, вызванных cx_Oracle 6.0; на данный момент единственным изменением в поведении пользователей является то, что обнаружение разъединения теперь определяется для cx_Oracle.DatabaseError в дополнение к cx_Oracle.InterfaceError, поскольку это поведение, похоже, изменилось. Другие проблемы, касающиеся точности чисел и незакрываемых соединений, находятся на рассмотрении в трекере проблем cx_Oracle.
References: #4045
Исправлена ошибка, при которой режим объединения Oracle 8 «non ansi» не добавлял оператор
(+)
к выражениям, в которых использовался оператор, отличный от оператора=
. Оператор(+)
должен быть во всех столбцах, которые являются частью правой части.References: #4076
1.2.0b2¶
Released: July 24, 2017orm¶
Исправлена регрессия из версии 1.1.11, когда добавление дополнительных столбцов, не относящихся к сущности, в запрос, включающий сущность с отношениями subqueryload, приводило к неудаче из-за проверки, добавленной в версии 1.1.11 в результате #4011.
This change is also backported to: 1.1.12
References: #4033
Исправлена ошибка, связанная с логикой оценки JSON NULL, добавленной в 1.1 как часть #3514, когда логика не учитывала ORM сопоставленные атрибуты, названные иначе, чем
Column
, которые были сопоставлены.This change is also backported to: 1.1.12
References: #4031
Добавлены проверки
KeyError
ко всем методам внутриWeakInstanceDict
, где за проверкой наkey in dict
следует индексированный доступ к этому ключу, для защиты от гонки со сборкой мусора, которая под нагрузкой может удалить ключ из диктанта после того, как код предположит его наличие, что приведет к очень редким повышениямKeyError
.This change is also backported to: 1.1.12
References: #4030
tests¶
Добавлены проверки ко всем методам внутри , где за проверкой на следует индексированный доступ к этому ключу, для защиты от гонки со сборкой мусора, которая под нагрузкой может удалить ключ из диктанта после того, как код предположит его наличие, что приведет к очень редким повышениям .
This change is also backported to: 1.1.12, 1.0.18
References: #4034
1.2.0b1¶
Released: July 10, 2017orm¶
Теперь конструкция
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
Добавлен атрибут
.autocommit
кscoped_session
, проксирующий атрибут.autocommit
нижестоящегоSession
, назначенного потоку в данный момент. Pull request любезно предоставлен Беном Фейгином.Добавлена новая функция
with_expression()
, которая позволяет добавлять специальное SQL-выражение к определенной сущности в запросе во время получения результата. Это альтернатива тому, что SQL-выражение передается как отдельный элемент в кортеже результатов.References: #3058
Добавлен новый стиль загрузки наследования на уровне маппера «полиморфный селектин». Этот стиль загрузки выдает запросы для каждого подкласса в иерархии наследования после загрузки базового типа объекта, используя IN для указания нужных значений первичных ключей.
References: #3948
Добавлен новый вид ускоренной загрузки под названием «selectin». Этот стиль загрузки очень похож на «подзапрос», за исключением того, что в нем используется выражение IN, заданное списком значений первичных ключей загруженных родительских объектов, а не повторный запрос. В результате получается более эффективный запрос, который «запекается» (например, строка SQL кэшируется) и также работает в контексте
Query.yield_per()
.References: #3944
Стратегия загрузчика
lazy="select"
теперь во всех случаях использует систему кэширования запросовBakedQuery
. Это устраняет большую часть накладных расходов на генерацию объектаQuery
и выполнение его вselect()
, а затем строкового SQL-запроса из процесса ленивой загрузки связанных коллекций и объектов. «Запеченный» ленивый загрузчик также был улучшен, теперь он может кэшировать в большинстве случаев, когда используются опции загрузки запросов.References: #3954
Метод
Query.update()
теперь может использовать как гибридные атрибуты, так и составные атрибуты в качестве источника ключа для размещения в предложении SET. Для гибридов предусмотрен дополнительный декораторhybrid_property.update_expression()
, для которого пользователь предоставляет функцию, возвращающую кортеж.References: #3229
Добавлено новое событие атрибута
AttributeEvents.bulk_replace()
. Это событие срабатывает, когда коллекция присваивается отношению, до того, как входящая коллекция сравнивается с существующей. Это раннее событие позволяет также преобразовывать входящие объекты неORM. Событие интегрировано с декоратором@validates
.См.также
References: #3896
Добавлен новый обработчик событий
AttributeEvents.modified()
, который срабатывает при вызове функции func:.attributes.flag_modified, что часто встречается при использовании модуля расширенияsqlalchemy.ext.mutable
.References: #3303
Исправлена проблема с ускоренной загрузкой подзапросов, которая продолжает серию проблем, исправленных в #2699, #3106, #3893, включая то, что «подзапрос» содержит правильное предложение FROM, когда начинается с объединенного подкласса наследования, а затем ускоренная загрузка подзапроса на отношение из базового класса, в то время как запрос также включает критерии против подкласса. Исправление в предыдущих тикетах не учитывало дополнительные операции загрузки подзапросов, загружающих более глубокие отношения с первого уровня, поэтому исправление было дополнительно обобщено.
This change is also backported to: 1.1.11
References: #4011
Исправлена ошибка, при которой каскад типа «delete-orphan» (а также другие) не находил объект, связанный с отношением, которое само является локальным для подкласса в отношениях наследования, в результате чего операция не выполнялась.
This change is also backported to: 1.1.10
References: #3986
Исправлено состояние гонки, которое могло возникнуть в потоковых средах в результате кэширования, добавленного через #3915. Внутренняя коллекция объектов
Column
могла быть регенерирована на объекте псевдонима ненадлежащим образом, сбивая с толку объединенный нетерпеливый загрузчик, когда он пытался вывести SQL и собрать результаты, что приводило к ошибке атрибута. Теперь коллекция генерируется заранее, до того как объект псевдонима кэшируется и разделяется между потоками.This change is also backported to: 1.1.7
References: #3947
UPDATE, созданный в результате использования функции
relationship.post_update
, теперь будет интегрирован с функцией версионирования, чтобы как указывать идентификатор версии строки, так и утверждать, что был найден номер существующей версии.References: #3496
Исправлено несколько случаев использования функции
relationship.post_update
при использовании в сочетании с колонкой, имеющей значение «onupdate». Когда происходит UPDATE, соответствующий атрибут объекта истекает или обновляется, чтобы вновь созданное значение «onupdate» могло заполнить объект; ранее оставалось несвежее значение. Кроме того, если целевой атрибут был установлен в Python для INSERT объекта, значение теперь повторно отправляется во время UPDATE, чтобы «onupdate» не перезаписал его (обратите внимание, что это работает также и для генерируемых сервером onupdate). Наконец, событиеSessionEvents.refresh_flush()
теперь испускается для этих атрибутов при обновлении в рамках flush.Исправлена ошибка, при которой программный счетчик version_id в сочетании с наследованием объединенной таблицы давал сбой, если счетчик version_id фактически не увеличивался и никакие другие значения в базовой таблице не были изменены, так как UPDATE имел пустое предложение SET. Поскольку программный счетчик version_id, когда счетчик версий не увеличивается, является документированным случаем использования, это специфическое условие теперь обнаруживается, и UPDATE теперь устанавливает значение version_id на себя, так что проверка параллелизма по-прежнему выполняется.
References: #3996
Функция версионирования не поддерживает NULL для счетчика версий. Теперь возникает исключение, если идентификатор версии является программным и был установлен в NULL для UPDATE. Pull request любезно предоставлен Дианой Кларк.
References: #3673
Удален очень старый аргумент ключевого слова
scoped_session
из , называемыйscope
. Это ключевое слово никогда не было документировано и было ранней попыткой разрешить переменные диапазоны.References: #3796
Исправлена ошибка, при которой комбинирование нагрузки «with_polymorphic» в сочетании с отношениями, связанными с подклассами, которые указывают joinload с innerjoin=True, не приводило к понижению этих «innerjoins» до «outerjoins», чтобы соответствовать другим полиморфным классам, которые не поддерживают эти отношения. Это относится как к полиморфной нагрузке с одиночным, так и с объединенным наследованием.
References: #3988
Добавлен новый аргумент
with_for_update
к методуSession.refresh()
. Когда методQuery.with_lockmode()
был упразднен в пользуQuery.with_for_update()
, методSession.refresh()
не был обновлен, чтобы отразить новую опцию.References: #3991
Исправлена ошибка, когда атрибут
column_property()
, который также помечен как «отложенный», помечался как «истекший» во время промывки, в результате чего он загружался вместе с неистекшими обычными атрибутами, даже если к этому атрибуту никогда не было доступа.References: #3984
Исправлена ошибка в подзапросе с ускоренной загрузкой, когда параметр «join_depth» для самореферентных отношений не учитывался корректно, загружая все доступные уровни в глубину вместо того, чтобы правильно подсчитать указанное количество уровней для ускоренной загрузки.
References: #3967
Добавлены предупреждения в LRU «скомпилированный кэш», используемый
Mapper
(и, в конечном счете, будут добавлены в другие LRU кэши на основе ORM), таким образом, что когда кэш начинает достигать предельных размеров, приложение будет выдавать предупреждение о том, что это ситуация, снижающая производительность, которая может потребовать внимания. LRU-кэши могут достигать предельных размеров, прежде всего, если приложение использует неограниченное количество объектовEngine
, что является антипаттерном. В противном случае это может свидетельствовать о проблеме, на которую следует обратить внимание разработчика SQLAlchemy.Исправлена ошибка, улучшающая специфичность опций загрузчика, которые вступают в силу после ленивой загрузки связанной сущности, так что опции загрузчика будут соответствовать алиасированной или неалиасированной сущности более конкретно, если эти опции включают информацию о сущности.
References: #3963
Функция
flag_modified()
теперь вызывает ошибкуInvalidRequestError
, если именованный атрибут key не присутствует в объекте, поскольку предполагается, что он будет присутствовать в процессе flush. Чтобы пометить объект «грязным» для промывки без ссылки на какой-либо конкретный атрибут, можно использовать функциюflag_dirty()
.См.также
Используйте функцию flag_dirty(), чтобы пометить объект как «грязный» без изменения атрибутов.
References: #3753
Стратегия «evaluate», используемая
Query.update()
иQuery.delete()
, теперь может выполнять простое сравнение объектов из отношения «многие-к-одному» с экземпляром, когда имена атрибутов столбцов первичного ключа / внешнего ключа не совпадают с фактическими именами столбцов. Ранее это выполняло простое сравнение на основе имен и приводило к ошибке AttributeError.References: #3366
Декоратор
@validates
теперь позволяет декорированному методу получать объекты из операции «bulk collection set», которые еще не были сопоставлены с существующей коллекцией. Это позволяет преобразовывать входящие значения в совместимые объекты ORM, как это уже разрешено в событии «append». Обратите внимание, что это означает, что метод@validates
вызывается для всех значений во время назначения коллекции, а не только для тех, которые являются новыми.References: #3896
Исправлена ошибка в наследовании одной таблицы, когда аргумент select_from() не учитывался при ограничении строк в подклассе. Ранее учитывались только выражения в запрашиваемых столбцах.
References: #3891
При назначении коллекции атрибуту, сопоставленному с отношением, предыдущая коллекция больше не изменяется. Ранее старая коллекция очищалась вместе с событиями «удаление элемента»; теперь эти события не влияют на старую коллекцию.
References: #3913
Состояние
Session
теперь присутствует, когда испускается событиеSessionEvents.after_rollback()
, то есть состояние атрибутов объектов до истечения срока их действия. Это теперь соответствует поведению событияSessionEvents.after_commit()
, которое также испускается до истечения состояния атрибутов объектов.References: #3934
Исправлена ошибка, при которой
Query.with_parent()
не срабатывал, еслиQuery
был направлен против конструкцииaliased()
, а не обычного сопоставленного класса. Также добавляет новый параметрwith_parent.from_entity
к автономной функцииwith_parent()
, а такжеQuery.with_parent()
.References: #3607
orm declarative¶
Исправлена ошибка, когда использование
declared_attr
наAbstractConcreteBase
, где определенным возвращаемым значением был какой-либо не сопоставленный символ, включаяNone
, приводило к тому, что атрибут жестко оценивался только один раз и сохранял значение в словарь объекта, не позволяя его вызывать для подклассов. Такое поведение нормально, когдаdeclared_attr
находится на сопоставленном классе, и не происходит на миксине или абстрактном классе. ПосколькуAbstractConcreteBase
является одновременно «абстрактным» и фактически «сопоставленным», здесь делается специальное исключение, чтобы «абстрактное» поведение имело приоритет дляdeclared_attr
.References: #3848
engine¶
В объект
Pool
добавлена встроенная обработка «пессимистического разъединения». Новый параметрPool.pre_ping
, доступный из движка какcreate_engine.pool_pre_ping
, применяет эффективную форму рецепта «pre-ping», описанного в документации по пулингу, который при каждой проверке соединения выдает простой оператор, обычно «SELECT 1», для проверки соединения на живучесть. Если существующее соединение больше не может отвечать на команды, оно прозрачно утилизируется, а все другие соединения, созданные до текущей метки времени, аннулируются.См.также
Работа с разъединениями - пессимистично
В пул соединений добавлено пессимистическое обнаружение разъединения
References: #3919
Добавлен обработчик исключений, который будет предупреждать об исключении «cause» в Py2K, когда функция «autorollback» в
Connection
сама вызывает исключение. В Py3K эти два исключения естественно сообщаются интерпретатором как одно, возникающее во время обработки другого. Это продолжает серию изменений для обработки откатов, которые в последний раз были внесены в #2696 в версии 1.0.12.This change is also backported to: 1.1.7
References: #3946
Исправлена ошибка, когда в необычном случае передачи объекта
Compiled
непосредственно вConnection.execute()
, диалект, с которым был сгенерирован объектCompiled
, не обращался к параметру paramstyle строкового оператора, вместо этого предполагалось, что он будет соответствовать параметру paramstyle на уровне диалекта, что приводило к возникновению несоответствий.References: #3938
sql¶
Добавлен новый вид
bindparam()
под названием «расширяющийся». Он предназначен для использования в выраженияхIN
, где список элементов преобразуется в отдельные связанные параметры во время выполнения оператора, а не во время компиляции оператора. Это позволяет связать одно имя связанного параметра с IN-выражением из нескольких элементов, а также позволяет использовать кэширование запросов с IN-выражениями. Новая возможность позволяет связанным функциям загрузки «select in» и загрузки «polymorphic in» использовать расширение запеченных запросов для снижения накладных расходов на вызов. Эту возможность следует считать экспериментальной для версии 1.2.References: #3953
Добавлена поддержка комментариев SQL для объектов
Table
иColumn
с помощью новых аргументовTable.comment
иColumn.comment
. Комментарии включаются как часть DDL при создании таблицы, либо в строку, либо через соответствующий оператор ALTER, а также отражаются обратно в отражении таблицы, а также черезInspector
. Поддерживаемые бэкенды в настоящее время включают MySQL, PostgreSQL и Oracle. Большое спасибо Frazer McLean за большую работу над этим проектом.References: #1546
Давнее поведение операторов
ColumnOperators.in_()
иColumnOperators.notin_()
, выдающих предупреждение, когда правое условие является пустой последовательностью, было пересмотрено; простое «статическое» выражение «1 != 1» или «1 = 1» теперь отображается по умолчанию, а не подтягивается к исходному левому выражению. Это приводит к тому, что результат сравнения столбца NULL с пустым набором меняется с NULL на true/false. Это поведение настраивается, и старое поведение можно включить с помощью параметраcreate_engine.empty_in_strategy
кcreate_engine()
.References: #3907
Добавлена новая опция
autoescape
к классам компараторов «startswith» и «endswith»; она предоставляет символ экранирования и автоматически применяет его ко всем вхождениям символов подстановки «%» и «_». Pull request любезно предоставлен Дианой Кларк.Примечание
Эта функция была изменена в версии 1.2.0 по сравнению с ее первоначальной реализацией в версии 1.2.0b2. Теперь autoescape передается как булево значение, а не конкретный символ, который должен использоваться в качестве управляющего символа.
References: #2694
Исправлена ошибка AttributeError, которая возникала в конструкции
WithinGroup
во время итерации структуры.This change is also backported to: 1.1.11
References: #4012
Исправлена регрессия, выпущенная в версии 1.1.5 из-за #3859, когда корректировка оценки «правой стороны» выражения, основанного на
Variant
, для соблюдения правил «правой стороны» базового типа приводила к неуместной потере типаVariant
в тех случаях, когда мы делаем, чтобы тип левой стороны передавался непосредственно в правую сторону, чтобы к аргументу выражения можно было применить правила уровня bind.This change is also backported to: 1.1.9
References: #3952
Изменена механика
ResultProxy
для безусловной отсрочки шага «autoclose» до тех пор, покаConnection
не будет завершена работа с объектом; в случае, когда PostgreSQL ON CONFLICT с RETURNING возвращает отсутствие строк, autoclose происходил в этом ранее не существовавшем случае использования, вызывая сбой обычного поведения autocommit, которое происходит безусловно при INSERT/UPDATE/DELETE.This change is also backported to: 1.1.9
References: #3955
Правила принуждения типов
Numeric
,Integer
и типов, связанных с датой, теперь включают дополнительную логику, которая будет пытаться сохранить параметры входящего типа в «разрешенном» типе. В настоящее время целью для этого является флагasdecimal
, так что математическая операция междуNumeric
илиFloat
иInteger
сохранит флаг «asdecimal», а также то, должен ли тип быть подклассомFloat
.References: #4018
Процессор результатов для типа
Float
теперь безоговорочно прогоняет значения через процессорfloat()
, если диалект указывает, что он также поддерживает режим «native decimal». Хотя большинство бэкендов будут предоставлять объекты Pythonfloat
для типа данных с плавающей точкой, бэкенды MySQL в некоторых случаях не имеют информации о типе, чтобы обеспечить это, и возвращаютDecimal
, если не выполнено преобразование float.References: #4020
Добавлена некоторая дополнительная строгость в обработку значений Python «float», передаваемых в операторы SQL. Значение «float» будет связано с типом данных
Float
, а не с десятичным типом данныхNumeric
, как это было раньше, что устраняет путаное предупреждение, выдаваемое SQLite, а также ненужное приведение к десятичному типу.References: #4017
Старшинство операторов для всех операторов сравнения, таких как LIKE, IS, IN, MATCH, equals, greater than, less than и т.д., было объединено на одном уровне, так что выражения, которые используют их друг против друга, будут содержать круглые скобки между ними. Это соответствует заявленному приоритету операторов в таких базах данных, как Oracle, MySQL и других, в которых все эти операторы имеют равный приоритет, а также PostgreSQL начиная с версии 9.5, в которой также сглажен приоритет операторов.
References: #3999
Исправлена проблема, когда тип выражения, использующего
ColumnOperators.is_()
или аналогичное выражение, не был типом «boolean», вместо этого тип был «nulltype», а также при использовании пользовательских операторов сравнения против нетипизированного выражения. Такая типизация может повлиять на поведение выражения в больших контекстах, а также на обработку строк результатов.References: #3873
Исправлено отрицание конструкции
Label
, чтобы внутренний элемент отрицался правильно, когда к маркированному выражению применяется модификаторnot_()
.References: #3969
Система, с помощью которой знаки процентов в SQL-операторах «удваиваются» для целей экранирования, была усовершенствована. Теперь «удвоение» знаков процента, в основном связанных с конструкцией
literal_column
, а также операторами типаColumnOperators.contains()
, происходит в зависимости от указанного стиля параметров используемого DBAPI; для чувствительных к процентам стилей параметров, как это принято в драйверах PostgreSQL и MySQL, удвоение произойдет, а для других, таких как SQLite, - нет. Это позволяет использовать конструкциюliteral_column
в зависимости от базы данных.References: #3740
Исправлена ошибка, из-за которой при использовании
CheckConstraint
на уровне столбцов не удавалось скомпилировать SQL-выражение с помощью компилятора базового диалекта, а также применить соответствующие флаги для генерации литеральных значений как встроенных, в случае, если sqltext является выражением Core, а не простой строкой. Это было давно исправлено для контрольных ограничений на уровне таблиц в 0.9 как часть #2742, которые чаще используют выражения Core SQL, а не обычные строковые выражения.References: #3957
Исправлена ошибка, при которой SQL-ориентированный столбец по умолчанию на стороне Python мог не выполняться должным образом при INSERT в кодовом пути «pre-execute», если сам SQL был нетипизированным выражением, например, обычным текстом. Кодовая дорожка «pre-execute» встречается довольно редко, однако может применяться к столбцам с нецелым первичным ключом с SQL-умолчаниями, когда RETURNING не используется.
References: #3923
Выражение, используемое для COLLATE при отображении на уровне колонок
collate()
иColumnOperators.collate()
, теперь берется в кавычки как идентификатор, если имя чувствительно к регистру, например, содержит заглавные символы. Обратите внимание, что это не влияет на collation на уровне типов, которое уже заключено в кавычки.References: #3785
Исправлена ошибка, при которой использование объекта
Alias
в контексте столбца приводило к ошибке аргумента, когда он пытался сгруппироваться в выражение с круглыми скобками. ИспользованиеAlias
таким образом пока не является полностью поддерживаемым API, однако оно применимо в некоторых рецептах конечных пользователей и может играть более заметную роль в поддержке некоторых будущих функций PostgreSQL.References: #3939
schema¶
Теперь при создании объекта
ArgumentError
с несоответствующим количеством «локальных» и «удаленных» столбцов выдается предупреждениеForeignKeyConstraint
, что в противном случае приводит к некорректному внутреннему состоянию ограничения. Обратите внимание, что это также влияет на ситуацию, когда процесс отражения диалекта создает несовпадающий набор столбцов для ограничения внешнего ключа.This change is also backported to: 1.1.10
References: #3949
postgresql¶
В продолжение исправления, корректно обрабатывающего строку версии PostgreSQL «10devel», выпущенного в версии 1.1.8, введен дополнительный бамп regexp для обработки строк версий вида «10beta1». Хотя PostgreSQL теперь предлагает лучшие способы получения этой информации, мы придерживаемся regexp, по крайней мере, до версии 1.1.x для наименьшего риска совместимости со старыми или альтернативными базами данных PostgreSQL.
This change is also backported to: 1.1.11
References: #4005
Исправлена ошибка, при которой использование
ARRAY
с типом строки, имеющим коллизию, не приводило к правильному синтаксису в CREATE TABLE.This change is also backported to: 1.1.11
References: #4006
Добавлена поддержка «autocommit» для ключевых слов GRANT, REVOKE. Pull request любезно предоставлен Джейкобом Хейсом.
This change is also backported to: 1.1.10
Добавлена поддержка разбора строки версии PostgreSQL для версии разработки, например «PostgreSQL 10devel». Pull request любезно предоставлен Шоном МакКалли.
This change is also backported to: 1.1.8
Исправлена ошибка, при которой базовый тип данных
ARRAY
не вызывал процессоры привязки/результатаARRAY
.References: #3964
Добавлена поддержка всех возможных идентификаторов «полей» при отражении типа данных PostgreSQL
INTERVAL
, например, «ГОД», «МЕСЯЦ», «ДЕНЬ ДО МИНУТЫ» и т.д.. Кроме того, сам тип данныхINTERVAL
теперь включает новый параметрINTERVAL.fields
, в котором можно указать эти идентификаторы; идентификатор также отражается обратно в результирующий тип данных при отражении / проверке.References: #3959
mysql¶
Добавлена поддержка MySQL’s ON DUPLICATE KEY UPDATE MySQL-специфического объекта
Insert
. Pull request любезно предоставлен Михаилом Дорониным.References: #4009
В MySQL 5.7 введено ограничение прав доступа для команды «SHOW VARIABLES»; диалект MySQL теперь будет обрабатывать случаи, когда SHOW возвращает отсутствие строки, в частности, при начальной выборке SQL_MODE, и будет выдавать предупреждение о том, что права пользователя должны быть изменены, чтобы позволить строке присутствовать.
This change is also backported to: 1.1.11
References: #4007
Удален древний и ненужный перехват функции UTC_TIMESTAMP MySQL, который мешал использовать ее с параметром.
This change is also backported to: 1.1.10
References: #3966
Исправлена ошибка в диалекте MySQL относительно отображения опций таблицы в сочетании с опциями PARTITION при отображении CREATE TABLE. Опции, связанные с PARTITION, должны следовать за опциями таблицы, тогда как ранее этот порядок не соблюдался.
This change is also backported to: 1.1.10
References: #3961
Добавлена поддержка представлений, которые не отражаются из-за устаревших определений таблиц, при вызове
MetaData.reflect()
; выдается предупреждение для таблицы, которая не может ответить наDESCRIBE
, но операция проходит успешно.References: #3871
mssql¶
Исправлена ошибка, когда изоляция транзакций SQL Server должна быть получена из другого представления при использовании хранилища данных Azure. Теперь запрос выполняется к обоим представлениям, а затем безоговорочно выдается NotImplemented в случае неудачи, что обеспечивает наилучшую устойчивость к будущим произвольным изменениям API в новых версиях SQL Server.
This change is also backported to: 1.1.11
References: #3994
В диалект SQL Server добавлен тип-заполнитель
XML
, так что отраженная таблица, включающая этот тип, может быть повторно отображена как CREATE TABLE. Тип не имеет специального поведения при обходе и не поддерживает дополнительные уточняющие аргументы.This change is also backported to: 1.1.11
References: #3973
Диалект SQL Server теперь позволяет передавать имя базы данных и/или владельца с точкой внутри, явно используя скобки в строке вокруг владельца и, по желанию, имени базы данных. Кроме того, отправка конструкции
quoted_name
для имени схемы не будет разделяться точкой и передаст полную строку в качестве «владельца».quoted_name
теперь также доступен из пространства импортаsqlalchemy.sql
.References: #2626
oracle¶
Добавлены новые ключевые слова
Sequence.cache
иSequence.order
вSequence
, чтобы обеспечить рендеринг параметра CACHE, понимаемого Oracle и PostgreSQL, и параметра ORDER, понимаемого Oracle. Pull request любезно предоставлен Дэвидом Муром.This change is also backported to: 1.1.12
Диалект Oracle теперь проверяет уникальные и проверочные ограничения при использовании
Inspector.get_unique_constraints()
,Inspector.get_check_constraints()
. Поскольку Oracle не имеет уникальных ограничений, которые отделены от уникальногоIndex
, отраженныйTable
будет по-прежнему не иметь связанных с ним объектовUniqueConstraint
. Pull requests любезно предоставлены Элоем Феликсом.References: #4003
Поддержка двухфазных транзакций была полностью удалена для 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
Исправлена ошибка в диалекте cx_Oracle, когда разбор строки версии не выполнялся для cx_Oracle версии 6.0b1 из-за символа «b». Разбор строки версии теперь выполняется с помощью regexp, а не простого разделения.
This change is also backported to: 1.1.10
References: #3975
Диалект cx_Oracle теперь поддерживает «вменяемый многорядный подсчет», то есть, когда серия наборов параметров выполняется через DBAPI
cursor.executemany()
, мы можем использоватьcursor.rowcount
для проверки количества совпавших строк. Это влияет на ORM при обнаружении сценариев одновременной модификации, так как некоторые простые условия теперь могут быть обнаружены даже при пакетной обработке операторов, а также при использовании более строгой функции версионности ORM может по-прежнему использовать пакетную обработку операторов. Флаг включен для cx_Oracle, предполагающего, по крайней мере, версию 5.0, которая сейчас является общепринятой.References: #3932
Oracle reflection теперь «нормализует» имя, данное ограничению внешнего ключа, то есть возвращает его в нижнем регистре для имени, нечувствительного к регистру. Такое поведение уже было характерно для индексов и ограничений первичного ключа, а также для всех имен таблиц и столбцов. Это позволит скриптам автогенерации Alembic правильно сравнивать и отображать имена ограничений внешнего ключа, если они изначально заданы как нечувствительные к регистру.
References: #3276
misc¶
Добавлен новый флаг
Session.enable_baked_queries
кSession
, позволяющий отключать запеченные запросы в масштабах всей сессии, что уменьшает использование памяти. Также добавлена новая оберткаBakery
, чтобы можно было проверять запеченные запросы, возвращаемыеBakedQuery.bakery
.Защита от проверки «None» в качестве класса в случае, когда декларативные классы собираются в мусор, а новые операции automap prepare() происходят одновременно, очень редко попадая на weakref, который не был полностью обработан после gc.
This change is also backported to: 1.1.10
References: #3980
Исправлена ошибка в
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
В метод
Query.params()
добавлена поддержка связанных параметров, например, тех, которые обычно задаются черезResult.count()
. Ранее поддержка параметров была опущена. Pull request любезно предоставлен Pat Deegan.This change is also backported to: 1.1.8
Методы сравнения
AssociationProxy.any()
,AssociationProxy.has()
иAssociationProxy.contains()
теперь поддерживают связь с атрибутом, который сам по себе также являетсяAssociationProxy
, рекурсивно.References: #3769
Реализованы операторы мутации in-place
__ior__
,__iand__
,__ixor__
и__isub__
дляMutableSet
и__iadd__
дляMutableList
, чтобы события изменения срабатывали, когда эти методы мутатора используются для изменения коллекции.References: #3853
Предупреждение выдается, если модификатор
declared_attr.cascading
используется с декларативным атрибутом, который сам объявлен в классе, подлежащем отображению, в отличие от декларативного класса-миксина или класса__abstract__
. Модификаторdeclared_attr.cascading
в настоящее время применяется только к смешиваемым/абстрактным классам.References: #3847
Улучшена коллекция списка прокси ассоциаций, чтобы предотвратить преждевременную автозагрузку на только что созданный объект ассоциации в случае, когда используется
list.append()
, и ленивая загрузка будет вызвана, когда прокси ассоциации обращается к коллекции конечных точек. Теперь к коллекции конечных точек обращаются сначала, прежде чем вызывается создатель для создания объекта ассоциации.References: #3941
Класс
sqlalchemy.ext.hybrid.hybrid_property
теперь поддерживает вызов мутаторов типа@setter
,@expression
и т.д. несколько раз в подклассах, и теперь предоставляет мутатор@getter
, так что конкретный гибрид может быть повторно использован в подклассах или других классах. Теперь это соответствует поведению@property
в стандартном Python.Исправлена ошибка в расширении
sqlalchemy.ext.serializer
, из-за которой «аннотированный» SQL-элемент (создаваемый ORM для многих типов SQL-выражений) не мог быть надежно сериализован. Также изменен уровень pickle по умолчанию для сериализатора на «HIGHEST_PROTOCOL».References: #3918