1.2 Changelog¶
1.2.19¶
Released: April 15, 2019orm¶
В 1.2 исправлена регрессия, связанная с внедрением запеченных запросов для ленивых загрузчиков отношений, когда при генерации «ленивого предложения», возникающего внутри мемоизированного атрибута, создавалось состояние гонки. Если два потока одновременно инициализируют мемоизированный атрибут, то запеченный запрос может быть сформирован с ключами параметров привязки, которые затем заменяются новыми ключами при следующем запуске, что приводит к запросу ленивой загрузки, в котором критерии связанности задаются как
None
. Исправление заключается в том, что имена параметров фиксируются до генерации нового клаузулы и объектов параметров, так что имена каждый раз остаются неизменными.References: #4507
examples¶
Исправлена ошибка в примере large_resultsets, когда переименование переменной «id» в результате переформатирования кода приводило к неудаче теста. Pull request любезно предоставлен Matt Schuchhardt.
References: #4528
engine¶
При сравнении двух объектов
URL
с помощью__eq__()
не учитывался номер порта, два объекта, отличающиеся только номером порта, считались равными. Теперь сравнение портов добавлено в метод__eq__()
методаURL
, объекты, отличающиеся номером порта, теперь не равны. Кроме того,__ne__()
не был реализован дляURL
, что приводило к неожиданному результату при использовании!=
в Python2, так как в Python2 не существует подразумеваемых отношений между операторами сравнения.References: #4406
mssql¶
После изменения уровня изоляции на SNAPSHOT выполняется commit(), поскольку и pyodbc, и pymssql открывают неявную транзакцию, которая блокирует выполнение последующих SQL в текущей транзакции.
References: #4536
oracle¶
1.2.18¶
Released: February 15, 2019orm¶
В 1.2 исправлена регрессия, при которой опция загрузчика wildcard/load_only не работала корректно по отношению к пути загрузчика, в котором для ограничения конкретным подклассом использовались функции of_type(). Пока исправление работает только для of_type() простого подкласса, но не для сущности with_polymorphic, которая будет рассмотрена в отдельном выпуске; маловероятно, что последний случай работал ранее.
References: #4468
Исправлена довольно простая, но критическая проблема, когда событие
SessionEvents.pending_to_persistent()
вызывалось для объектов не только при переходе из состояния pending в состояние persistent, но и когда они уже были persistent и только обновлялись, в результате чего событие вызывалось для всех объектов при каждом обновлении.References: #4489
sql¶
Исправлена проблема, когда тип
JSON
имел атрибутJSON.should_evaluate_none
, доступный только для чтения, что приводило к сбоям при использовании методаTypeEngine.evaluates_none()
в связке с этим типом. Pull request courtesy 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 упраздняется. Спасибо Джону А Стивенсону за подсказку.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
приводил к некорректному кодированию сообщения в виде простой строки в Unicode под python 2k, которое не обрабатывается интерпретатором Python для символов, не входящих в кодировку платформы (обычно ascii). КлассSQLAlchemyError
теперь передает байтовую строку под Py2K для__str__()
, как и вообще поведение объектов исключений под Py2K, и выполняет безопасное приведение к юникоду utf-8 с возвратом на обратную косую черту для__unicode__()
. Для Py3K сообщение, как правило, уже имеет юникод, но если это не так, то для метода__str__()
снова выполняется безопасное коэрцитивное преобразование в utf-8 с обратным слешем.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¶
Исправлена проблема в функции «расширение 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
Исправлена ошибка, при которой цепочка опций mapper с использованием
RelationshipProperty.of_type()
в сочетании с цепочкой опций, ссылающихся на имя атрибута только в виде строки, не находила атрибут.References: #4400
orm declarative¶
misc¶
Добавлена поддержка передачи в строке URL флага
write_timeout
, принимаемого mysqlclient и pymysql.References: #4381
Исправлена проблема, при которой отражение домена PostgreSQL, выраженного в виде массива, не распознавалось. Pull request любезно предоставлен Jakub Synowiec.
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
Техника разрешения конфликтов столбцов, рассмотренная в разделе ``use_existing_column``R, теперь работает и для столбца
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¶
В список зарезервированных слов для MySQL добавлено слово
function
, которое теперь является ключевым словом в MySQL 8.0References: #4348
Добавлено решение для ошибки MySQL #88718, появившейся в версии 8.0, когда при отражении ограничения по внешнему ключу не указывается правильная чувствительность регистра для ссылающегося столбца, что приводит к ошибкам при использовании отраженного ограничения, например, при использовании расширения automap. Решение проблемы заключается в дополнительном запросе к таблицам information_schema для получения правильного имени с учетом регистра.
References: #4344
misc¶
Исправлена проблема, при которой часть внутренних функций вспомогательного языка передавала встроенному модулю Python
__import__
неправильный аргумент в виде списка импортируемых модулей. Проблема не проявлялась в основной библиотеке, но могла вызывать проблемы во внешних приложениях, переопределяющих встроенный модуль__import__
или иным образом использующих его. Pull request любезно предоставлен Joe Urciuoli.Исправлены дополнительные предупреждения, выдаваемые Python 3.7 в связи с изменениями в организации пакетов Python
collections
иcollections.abc
. Предыдущие предупрежденияcollections
были исправлены в версии 1.2.11. Pull request любезно предоставлен xtreak.References: #4339
Добавлен недостающий метод
.index()
в списочные коллекции ассоциаций в расширении association proxy.
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» в контексте операции post-update происходила и для строки, которая должна быть удалена после обновления, то есть столбец с генератором значений на Python показывал уже удаленное значение, которое было выдано для UPDATE перед DELETE (что не соответствовало предыдущему поведению), а также то, что генератор значений, созданный на SQL, будет иметь атрибут expired, то есть предыдущее значение будет недоступно из-за того, что строка была удалена, а объект отсоединен от сессии. Логика «поствыборки», которая была добавлена в #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
Исправлена ошибка отражения ENUM в PostgreSQL, когда запрос сообщал имя с учетом регистра и кавычек, что не соответствовало целевому столбцу при отражении таблицы, так как кавычки необходимо было убрать.
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, когда при использовании
ColumnElement.self_group()
выражение, представленное в булевом контексте на неродном булевом бэкенде, сравнивалось с 1/0, хотя оно уже является неявно булевым выражением. Хотя это не влияет на дружественные бэкенды (MySQL, SQLite), это не было обработано Oracle (и, возможно, SQL Server). Теперь вопрос о том, является ли выражение неявно булевым в любой базе данных, определяется заранее в качестве дополнительной проверки, чтобы не генерировать целочисленное сравнение в процессе компиляции оператора.References: #4320
В методы
WithinGroup.over()
иFunctionFilter.over()
добавлены недостающие параметры оконных функцийWithinGroup.over.range_
иWithinGroup.over.rows
, что соответствует функции 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, так и изменять поведение типов данных, передаваемых в этот метод.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() вендорной версией, скопированной из стандартной библиотеки 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
с доступностью методов класса, а не произвольным вызываемым объектом. В частности, в примере с кэшированием собачьей кучи показано, чтоquery_cls
является функцией, а не подклассомQuery
.References: #4256
Исправлена давняя ошибка, возникшая в версии 1.0, которая не позволяла использовать пользовательский
MapperOption
, изменяющий _параметры объектаQuery
для ленивой загрузки, поскольку сам ленивый загрузчик перезаписывал эти параметры. Это относится к примеру «временного диапазона», приведенному в вики. Заметим, однако, что методQuery.populate_existing()
теперь необходим для того, чтобы переписать параметры отображения, связанные с объектом, уже загруженным в карту идентичности.В рамках этого изменения пользовательское определение
MapperOption
теперь будет приводить к тому, что ленивые загрузчики, связанные с целевым объектом, по умолчанию будут использовать непеченый запрос, если не реализован методMapperOption._generate_cache_key()
. В частности, это устраняет одну регрессию, возникшую при использовании «продвинутого» примера dogpile.cache, который не возвращал кэшированные результаты, а вместо этого выдавал SQL из-за несовместимости с загрузчиком печеных запросов; благодаря этому изменению опцияRelationshipCache
, включенная во многие релизы в пример dogpile, полностью отключает «печеный» запрос. Отметим, что в рамках выпуска #4258 пример dogpile также модернизирован, чтобы избежать обеих этих проблем.References: #4128
Исправлена ошибка, при которой новый метод
Result.with_post_criteria()
некорректно взаимодействовал с загрузчиком подзапросов, в результате чего «пост-критерии» не применялись к встроенным загрузчикам подзапросов. Это связано с #4128 в том, что функция post criteria теперь используется ленивым загрузчиком.Обновлен пример dogpile.caching для включения новых структур, учитывающих «запеченную» систему запросов, которая по умолчанию используется в ленивых загрузчиках и некоторых нетерпеливых загрузчиках отношений. Примеры dogpile.caching «relationship_caching» и «advanced» также были сломаны из-за #4256. Проблема здесь также решена исправлением в #4128.
References: #4258
engine¶
Исправлена проблема, связанная с тем, что если во время выполнения последовательности «сброс при возврате» пула соединений возникала ошибка разъединения в сочетании с явной транзакцией, открытой против окружающего объекта
Connection
(например, при вызовеSession.close()
без отката или фиксации, или при вызовеConnection.close()
без предварительного закрытия транзакции, объявленной с помощьюConnection.begin()
), то возникал двойной контроль, который мог привести к одновременным проверкам одного и того же соединения. Теперь условие double-checkin в целом предотвращается утверждением, а также исправлен конкретный сценарий double-checkin.References: #4252
Исправлена проблема утечки ссылок, когда на значения словаря параметров, используемые при выполнении оператора, оставались ссылки в «скомпилированном кэше», в результате хранения представления ключей, используемого в Python 3 словарем keys(). Pull request любезно предоставлен Оливье Гризелем.
sql¶
Исправлена проблема, при которой сообщение об ошибке «неоднозначный литерал», используемое при интерпретации литеральных значений как значений SQL-выражений, встречало значение кортежа и не могло правильно отформатировать сообщение. Pull request любезно предоставлен Мигелем Вентурой.
mssql¶
Исправлена регрессия в версии 1.2, вызванная использованием #4061, когда тип SQL Server «BIT» считался «родным булевым». Целью было избежать создания ограничения CHECK на столбец, однако более серьезная проблема заключается в том, что значение BIT не ведет себя как константа true/false и не может быть интерпретировано как самостоятельное выражение, например, «WHERE <column>». Теперь диалект SQL Server возвращается к неродному значению boolean, но с дополнительным флагом, который все равно позволяет избежать создания ограничения 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 исправлена ошибка в функции sharded query, когда новый элемент «identity_token» некорректно учитывался в рамках операции lazy load при поиске в карте идентификации связанного с ним элемента «многие-к-одному». Новое поведение позволит использовать «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¶
Исправлена регрессия, возникшая после предыдущего исправления #4204 в версии 1.2.5, когда CTE, ссылающийся на себя после вызова метода
CTE.alias()
, некорректно ссылался на себя.References: #4204
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 любезно предоставлен Эриком Аткиным.Исправлена ошибка в новой загрузке «полиморфного селектина», когда выборка полиморфных объектов частично загружалась из ленивого загрузчика отношений, что приводило к возникновению условия «пустой 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()
добавлен новый аргументset_attribute.inititator
, позволяющий распространять маркер события, полученный от функции-слушателя, на последующие события набора.Исправлена проблема в функции 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 любезно предоставлен Андре Крузом (André Cruz).
This change is also backported to: 1.1.16
В список ключевых слов, принимаемых диалектом PostgreSQL в качестве триггерного ключевого слова «autocommit», добавлено «TRUNCATE». Pull request любезно предоставлен Джейкобом Хейсом.
This change is also backported to: 1.1.16
sqlite¶
Исправлена ошибка импорта, возникающая, когда на платформе не установлены ни pysqlite2, ни sqlite3, в результате чего возникает ошибка импорта, связанная с sqlite3, а не с pysqlite2, которая не является реальной причиной сбоя. Pull request courtesy Robin.
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 добавлено больше зарезервированных слов для целей цитирования. Pull request любезно предоставлен Riccardo Magliocchetti.
mssql¶
В список кодов ошибок, которые считаются отключением для ODBC / MSSQL-сервера, добавлен код ошибки ODBC 10054.
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()
, при которой использование формата «многозначных значений» в сочетании с объектамиColumn
в качестве ключей, а не строк, приводило к ошибке. Pull request любезно предоставлен Обри Старк-Толером.This change is also backported to: 1.1.16
References: #4162
mssql¶
В версии 1.2 исправлена ошибка, при которой вновь исправленное цитирование имен collation в #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, обращающийся к нескольким таблицам, переключается в режим «многотабличности» и выводит соответствующее предложение «USING» или многотабличное предложение «FROM» в соответствии с пониманием базы данных. Pull request любезно предоставлен Питером Малдером (Pieter Mulder).
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
При использовании атрибута
synonym()
против атрибута, который не используется против атрибутаMapperProperty
, например, ассоциативного прокси, возникает ошибкаInvalidRequestError
. Ранее при попытке найти несуществующие атрибуты происходило переполнение рекурсии.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¶
В
ResultProxy
добавлены методы__next__()
иnext()
, чтобы встроенная функция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¶
В диалект psycopg2 добавлен новый флаг
use_batch_mode
. Этот флаг позволяет использовать расширение 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 называют «родным булевым» типом BIT, поскольку этот тип принимает только 0 или 1, а DBAPI возвращают его значение как True/False. Таким образом, диалекты SQL Server теперь поддерживают «родную булеву», поскольку для типа данных
Boolean
не генерируется ограничение CHECK. Единственным отличием от других «родных» булевых является отсутствие констант «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 не может дать нам rowcount в операциях UPDATE или DELETE, когда действует OUTPUT. В первую очередь это влияет на ORM, когда при обновлении строки, содержащей вычисленные сервером значения, возникает ошибка, если бэкенд не возвращает ожидаемое количество строк. Теперь PyODBC заявляет, что он поддерживает подсчет строк, за исключением случаев, когда присутствует OUTPUT.inserted, что учитывается ORM при выполнении операции flush для определения того, будет ли он искать подсчет строк.
References: #4062
Включен флаг «sane_rowcount» для диалекта pymssql, что означает, что DBAPI теперь сообщает корректное количество строк, затронутых операциями UPDATE или DELETE. Это в основном влияет на функцию версионности ORM, поскольку теперь она может проверять количество затронутых строк на целевой версии.
В отражение индексов SQL Server добавлено правило, игнорирующее так называемый «кучный» индекс, который неявно присутствует в таблице, в которой не указан кластеризованный индекс.
References: #4059
oracle¶
Исправлена регрессия производительности, вызванная исправлением #3937, когда cx_Oracle начиная с версии 5.3 исключал из своего пространства имен символ
.UNICODE
, что интерпретировалось как безусловное включение режима cx_Oracle «WITH_UNICODE», вызывающего на стороне SQLAlchemy функции безусловного преобразования всех строк в юникод и приводящего к снижению производительности. На самом деле, по словам автора cx_Oracle, начиная с версии 5.1 режим «WITH_UNICODE» был полностью удален, поэтому дорогостоящие функции преобразования юникода больше не нужны и отключаются, если cx_Oracle 5.1 или выше обнаружен под Python 2. Также восстановлено предупреждение о недопустимости использования режима «WITH_UNICODE», которое было удалено при #3937.This change is also backported to: 1.1.13, 1.0.19
References: #4035
Частичная поддержка сохранения и получения значения Oracle «бесконечность» реализована в 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¶
Исправлена проблема в тестировании фикстур, которая была несовместима с изменением, внесенным в Python 3.6.2 в отношении менеджеров контекста.
This change is also backported to: 1.1.12, 1.0.18
References: #4034
1.2.0b1¶
Released: July 10, 2017orm¶
Теперь методу
Query.select_entity_from()
можно передать конструкциюaliased()
. Сущности будут извлечены из выборки, представленной конструкциейaliased()
. Это позволяет использовать специальные опции дляaliased()
, такие какaliased.adapt_on_names
, в сочетании сQuery.select_entity_from()
.This change is also backported to: 1.1.7
References: #3933
Добавлен атрибут
.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»; ранее оставалось неактуальное значение. Кроме того, если атрибут target был установлен в 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» с отношениями, связанными с подклассами, в которых указана нагрузка joinedload с innerjoin=True, эти «innerjoins» не понижались до «outerjoins», чтобы соответствовать другим полиморфным классам, не поддерживающим это отношение. Это относится как к полиморфной нагрузке с одиночным, так и с объединенным наследованием.
References: #3988
В метод
Session.refresh()
добавлен новый аргументwith_for_update
. Когда метод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» использовать расширение baked query для снижения накладных расходов на вызов. Данную возможность следует рассматривать как экспериментальную для версии 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
В классы компараторов «startswith» и «endswith» добавлена новая опция
autoescape
, которая предоставляет управляющий символ и автоматически применяет его ко всем вхождениям символов подстановки «%» и «_». 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
в тех случаях, когда мы хотим, чтобы тип левой стороны был передан непосредственно в правую часть, чтобы к аргументу выражения могли быть применены правила уровня связывания.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, а также ненужное приведение к Decimal.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-выражение с помощью компилятора базового диалекта, а также не применялись соответствующие флаги для генерации литеральных значений как inline, в случае если 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¶
Теперь при создании объекта
ForeignKeyConstraint
с несоответствующим количеством «локальных» и «удаленных» столбцов выдается сообщениеArgumentError
, что в противном случае приводит к некорректному внутреннему состоянию ограничения. Обратите внимание, что это также влияет на ситуацию, когда в процессе рефлексии диалекта создается несовпадающий набор столбцов для ограничения внешнего ключа.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
со строковым типом, имеющим collation, не приводило к корректному синтаксису в 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 объекта ON DUPLICATE KEY UPDATE
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
Удален древний и ненужный перехват MySQL-функции UTC_TIMESTAMP, который мешал использовать ее с параметром.
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¶
Исправлена ошибка, когда при использовании хранилища данных Azure необходимо было получить данные об изолированности транзакций SQL Server из другого представления. Теперь запрос выполняется к обоим представлениям, а в случае неудачи безусловно выдается сообщение 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
добавлены новые ключевые словаSequence.cache
иSequence.order
, позволяющие выводить параметр 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 courtesy Eloy Felix.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 теперь поддерживает «sane multi rowcount», то есть при выполнении серии наборов параметров через DBAPI
cursor.executemany()
мы можем использоватьcursor.rowcount
для проверки количества совпавших строк. Это влияет на работу ORM при обнаружении сценариев одновременной модификации, так как некоторые простые условия теперь могут быть обнаружены даже при пакетной обработке операторов, а также при использовании более строгой функции версионности ORM может по-прежнему использовать пакетную обработку операторов. Флаг включен для cx_Oracle, предполагающего, по крайней мере, версию 5.0, которая сейчас является общепринятой.References: #3932
Oracle reflection теперь «нормализует» имя, заданное ограничению внешнего ключа, то есть возвращает его в нижнем регистре для имени, нечувствительного к регистру. Такое поведение уже было характерно для индексов и ограничений первичного ключа, а также для всех имен таблиц и столбцов. Это позволит скриптам автогенерации Alembic корректно сравнивать и отображать имена ограничений внешнего ключа, если они изначально заданы как нечувствительные к регистру.
References: #3276
misc¶
В
Session
добавлен новый флагSession.enable_baked_queries
, позволяющий отключать запеченные запросы в масштабах всей сессии, что уменьшает потребление памяти. Также добавлена новая обертка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
В метод
Result.count()
добавлена поддержка связанных параметров, например, тех, которые обычно задаются черезQuery.params()
. Ранее поддержка параметров была опущена. 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
в настоящее время применяется только к классам mixin/abstract.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