1.3 Changelog¶
1.3.25¶
no release dateorm¶
Исправлена ошибка в
Session.bulk_save_objects()
при использовании с постоянными объектами, из-за которой не удавалось отследить первичный ключ в сопоставлениях, где имя столбца первичного ключа отличалось от имени атрибута.References: #6392
schema¶
Объект
Table
теперь выдает информативное сообщение об ошибке, если он инстанцируется без позиционной передачи хотя бы аргументовTable.name
иTable.metadata
. Ранее, если они передавались как аргументы ключевого слова, то объект молча не инициализировался.References: #6135
postgresql¶
Исправлена регрессия, вызванная #6023, когда оператор приведения PostgreSQL, применяемый к элементам внутри
ARRAY
при использовании psycopg2, не мог использовать правильный тип в случае, если тип данных также был встроен в экземпляр адаптераVariant
.Кроме того, исправлена поддержка корректной выдачи CREATE TYPE при использовании
Variant(ARRAY(some_schema_type))
.References: #6182
mysql¶
Исправления, связанные с переходом на серию MariaDB 10.6, включают несовместимые с предыдущими версиями изменения как в Python-драйвере mariadb-connector (поддерживается только в SQLAlchemy 1.4), так и в собственных клиентских библиотеках 10.6, которые автоматически используются DBAPI mysqlclient (применимо как к 1.3, так и к 1.4). Символ кодировки «utf8mb3» теперь сообщается этими клиентскими библиотеками, когда кодировка указана как «utf8», что приводит к ошибкам поиска и кодировки в диалекте MySQL, который не ожидает этого символа. Обновлены как базовая библиотека MySQL для учета этого символа utf8mb3, так и тестовый набор. Спасибо Георгу Рихтеру за поддержку.
sqlite¶
Добавить примечание относительно прагм, связанных с шифрованием, для pysqlcipher, передаваемого в url.
References: #6589
1.3.24¶
Released: March 30, 2021orm¶
Удалено очень старое предупреждение о том, что passive_deletes не предназначен для отношений «многие-к-одному». Хотя, вероятно, во многих случаях размещение этого параметра в отношениях «многие-к-одному» не является тем, что было задумано, существуют случаи, когда каскадное удаление может быть запрещено после таких отношений.
References: #5983
Исправлена проблема, при которой процесс объединения двух таблиц мог завершиться неудачей, если одна из таблиц имела несвязанное, неразрешимое ограничение внешнего ключа, которое вызывало в процессе объединения исключение
NoReferenceError
, которое, тем не менее, можно было обойти, чтобы завершить объединение. Логика, проверяющая значимость исключения в процессе, сделала бы предположения о конструкции, которая бы дала сбой.References: #5952
Исправлена проблема, при которой конструкция
MutableComposite
могла быть переведена в недопустимое состояние, когда родительский объект уже был загружен, а затем покрыт последующим запросом, из-за того, что обработчик обновления составных свойств заменял объект на новый, не обработанный мутабельным расширением.References: #6001
engine¶
Исправлена ошибка, при которой функция «schema_translate_map» не учитывалась для случая прямого выполнения объектов
DefaultGenerator
, таких как последовательности, что включало случай, когда они «предварительно выполнялись» для генерации значений первичных ключей при отключенном implicit_returning.References: #5929
schema¶
Исправлена ошибка, впервые появившаяся в виде некоторой комбинации #2892, #2919 и #3832, когда события присоединения для
TypeDecorator
удваивались по отношению к классу «impl», если «impl» также являлсяSchemaType
. В реальном случае любойTypeDecorator
противEnum
илиBoolean
получит удвоенныйCheckConstraint
при установленном флагеcreate_constraint=True
.References: #6152
Исправлена проблема, при которой ограничение CHECK, сгенерированное с помощью
Boolean
илиEnum
, после первой компиляции не могло корректно отобразить соглашение об именовании из-за непреднамеренного изменения состояния в имени, заданном ограничению. Впервые эта проблема была обнаружена в 0.9 в исправлении проблемы #3067, и данное исправление пересматривает принятый в то время подход, который, как оказалось, был более сложным, чем требовалось.References: #6007
Исправлена / реализована поддержка соглашений об именовании ограничений первичного ключа, использующих в качестве части соглашения имена столбцов/ключей/etc. В частности, это включает в себя то, что объект
PrimaryKeyConstraint
, автоматически связанный сTable
, будет обновлять свое имя по мере добавления новых объектов первичного ключаColumn
в таблицу, а затем и в ограничение. Теперь учитываются внутренние режимы отказов, связанные с процессом построения ограничений, включая отсутствие столбцов, отсутствие имени или наличие пустого имени.References: #5919
Скорректирована логика выдачи операторов DROP для объектов
Sequence
при сбросе нескольких таблиц таким образом, что все объектыSequence
сбрасываются после всех таблиц, даже если данныйSequence
связан только с объектомTable
, а не непосредственно с общим объектомMetaData
. В данном случае поддерживается возможность одновременного связывания одного и того жеSequence
с несколькимиTable
.References: #6071
postgresql¶
Исправлена проблема, при которой использование
aggregate_order_by
при определенных условиях возвращало ARRAY(NullType), что мешало объекту result корректно возвращать данные.References: #5989
Исправлена проблема в отражении PostgreSQL, когда столбец, выражающий «NOT NULL», заменял собой нулевость соответствующего домена.
References: #6161
Настроен диалект psycopg2 на выдачу явного приведения в стиле PostgreSQL для связанных параметров, содержащих элементы ARRAY. Это позволяет корректно использовать весь спектр типов данных в массивах. Диалект asyncpg уже генерировал эти внутренние касты в финальном операторе. Также реализована поддержка обновления срезов массива и специфического для PostgreSQL метода
ARRAY.contains()
.References: #6023
mssql¶
Исправлена проблема с отражением SQL Server для старой версии SQL Server 2005, когда вызов sp_columns выполнялся некорректно без префикса ключевого слова EXEC. В текущей версии 1.4 этот метод не используется.
References: #5921
1.3.23¶
Released: February 1, 2021sql¶
Исправлена ошибка, когда при использовании метода
TypeEngine.with_variant()
на типеTypeDecorator
не учитывались используемые диалектные отображения, из-за правила вTypeDecorator
, которое вместо этого пыталось проверить цепочки экземпляровTypeDecorator
.References: #5816
postgresql¶
Только для SQLAlchemy 1.3 файл setup.py переводит pg8000 на версию ниже 1.16.6. Версия 1.16.6 и выше поддерживается SQLAlchemy 1.4. Pull request любезно предоставлен Джузеппе Люмией.
References: #5645
Исправлена проблема, при которой использование
Table.to_metadata()
(в 1.3 он называлсяTable.tometadata()
) совместно с PostgreSQLExcludeConstraint
, в котором использовались специальные выражения для столбцов, приводило к некорректному копированию.References: #5850
mysql¶
Приведение к
FLOAT
теперь поддерживается в MySQL >= (8, 0, 17) и MariaDb >= (10, 4, 5).References: #5808
Исправлена ошибка, при которой отражение по умолчанию сервера MySQL приводило к ошибке для числовых значений с присутствующим символом отрицания.
References: #5860
Исправлена давняя ошибка в диалекте MySQL, когда максимальная длина идентификатора 255 была слишком велика для имен всех типов ограничений, а не только индексов, которые имеют ограничение на размер 64. Поскольку соглашения об именовании метаданных могут создавать слишком длинные имена в этой области, примените ограничение к генератору идентификаторов в компиляторе DDL.
References: #5898
Исправлены предупреждения об устаревании, возникшие в результате выхода PyMySQL 1.0, в том числе предупреждения об устаревании параметров «db» и «passwd», которые теперь заменены на «database» и «password».
References: #5821
Исправлена регрессия из SQLAlchemy 1.3.20, связанная с исправлением ошибки #5462, добавляющей двойную парентезу для функциональных выражений MySQL в индексах, как того требует бэкенд. Эта ошибка непроизвольно распространилась на произвольные выражения
text()
, а также на внутренний текстовый компонент Alembic, который требуется Alembic для произвольных индексных выражений, не предполагающих двойной парентезы. Проверка была сужена до включения непосредственно только двоичных/унарных/функциональных выражений.References: #5800
oracle¶
Исправлена ошибка в диалекте Oracle, введенная #4894 в SQLAlchemy 1.3.11, когда использование SQL-выражения в RETURNING для UPDATE не компилировалось из-за проверки на «server_default», когда произвольное SQL-выражение не является столбцом.
References: #5813
Исправлена ошибка в диалекте Oracle, когда получение столбца CLOB/BLOB через
Insert.returning()
приводило к ошибке, так как при возврате необходимо было считывать значение LOB; дополнительно исправлена поддержка получения значений Unicode через RETURNING под Python 2.References: #5812
misc¶
Исправлена проблема, при которой стрингизация, иногда вызываемая при попытке сгенерировать «ключ» для коллекции
.c
на selectable, терпела неудачу, если столбец был немаркированной пользовательской SQL-конструкцией, использующей расширениеsqlalchemy.ext.compiler
, и не предоставлял форму компиляции по умолчанию; хотя это кажется необычным случаем, он может быть вызван в некоторых ORM-сценариях, например, когда выражение используется в «порядке по» в сочетании с объединенной ускоренной загрузкой. Проблема заключается в том, что отсутствие функции компиляции по умолчанию приводило к появлениюCompileError
, а неUnsupportedCompilationError
.References: #5836
1.3.22¶
Released: December 18, 2020oracle¶
Исправлена регрессия, возникавшая из-за того, что в #5755 была реализована поддержка уровня изоляции для Oracle. Сообщалось, что многие учетные записи Oracle не имеют прав на запросы к представлению
v$transaction
, поэтому эта функция была изменена таким образом, чтобы при неудачном подключении к базе данных она изящно отступала назад, при этом диалект будет считать, что «READ COMMITTED» является уровнем изоляции по умолчанию, как это было до SQLAlchemy 1.3.21. Однако явное использование методаConnection.get_isolation_level()
теперь должно обязательно вызывать исключение, поскольку базы данных Oracle с этим ограничением явно запрещают пользователю читать текущий уровень изоляции.References: #5784
1.3.21¶
Released: December 17, 2020orm¶
Добавлена комплексная проверка и информативное сообщение об ошибке для случая, когда в
relationship.secondary
передается сопоставленный класс или строковое имя сопоставленного класса. Это очень распространенная ошибка, которая требует четкого сообщения.Кроме того, добавлено новое правило для разрешения реестра классов, согласно которому для параметра
relationship.secondary
, если сопоставленный класс и его таблица имеют одинаковое строковое имя, то при разрешении этого параметра предпочтение будет отдаватьсяTable
. Во всех остальных случаях предпочтение по-прежнему отдается классу, если класс и таблица имеют одинаковое имя.References: #5774
Исправлена ошибка в
Query.update()
, когда объекты в_ormsession.Session
, срок действия которых уже истек, излишне SELECTировались по отдельности при их обновлении с помощью стратегии «evaluate «synchronize.References: #5664
Исправлена ошибка, связанная с тем, что флаг
restore_load_context
в событиях ORM, таких какInstanceEvents.load()
, не переносился на подклассы, которые были отображены после создания обработчика события.References: #5737
sql¶
Если метод returning(), например
Insert.returning()
, вызывается несколько раз, то выдается предупреждение, так как этот метод еще не поддерживает аддитивную операцию. В версии 1.4 для этого будет реализована поддержка аддитивной операции. Кроме того, любая комбинация методовInsert.returning()
иValuesBase.return_defaults()
теперь приводит к ошибке, так как эти методы являются взаимоисключающими; ранее операция выполнялась без звука.References: #5691
Исправлена проблема структурного компилятора, когда некоторые конструкции, такие как MySQL / PostgreSQL «on conflict / on duplicate key», полагались на состояние объекта
Compiler
, зафиксированное в их утверждении как утверждение верхнего уровня, что приводило к ошибкам в случаях, когда эти утверждения ветвились из другого контекста, например, DDL-конструкции, связанной с SQL-утверждением.References: #5656
postgresql¶
В объект
ExcludeConstraint
добавлен новый параметрExcludeConstraint.ops
для поддержки спецификации класса оператора с этим ограничением. Pull request любезно предоставлен Alon Menczer.References: #5604
Исправлена регрессия, появившаяся в 1.3.2 для диалекта PostgreSQL и перенесенная в 1.3.18 на диалект MySQL, когда использование конструкции не
Table
, напримерtext()
, в качестве аргументаSelect.with_for_update.of
не могло быть корректно учтено компиляторами PostgreSQL или MySQL.References: #5729
mysql¶
Исправлена проблема, при которой отражение значения по умолчанию сервера только для MariaDB, содержащего десятичную точку в значении, не отражалось корректно, что приводило к появлению отраженной таблицы, в которой отсутствовало значение по умолчанию сервера.
References: #5744
В список
RESERVED_WORDS
добавлены недостающие ключевые слова для диалекта MySQL:action
,level
,mode
,status
,text
,time
. Pull request любезно предоставлен Оскаром Батори.References: #5696
sqlite¶
Добавлено ключевое слово диалекта
sqlite_with_rowid=False
, позволяющее создавать таблицы в видеCREATE TABLE … WITHOUT ROWID
. Патч любезно предоставлен Шоном Андерсоном.References: #5685
mssql¶
Исправлена ошибка, при которой оператор CREATE INDEX отображался некорректно, если были указаны
mssql-include
иmssql_where
. Pull request любезно предоставлен @Adiorz.References: #5751
В список кодов отключения добавлен код SQL Server «01000».
References: #5646
Исправлена проблема, при которой составные столбцы первичного ключа не отображались в правильном порядке. Исправление любезно предоставлено @fulpm.
References: #5661
oracle¶
Реализована поддержка уровня изоляции SERIALIZABLE для баз данных Oracle, а также реальная реализация для
Connection.get_isolation_level()
.References: #5755
1.3.20¶
Released: October 12, 2020orm¶
Если в качестве целевого параметра для
Query.join()
задан не отображаемый объект, то теперь выдается сообщениеArgumentError
с более подробной информацией. До этого изменения выдавался менее подробныйAttributeError
. Pull request любезно предоставлен Ramon Williams.References: #4428
Исправлена проблема, когда при использовании опции загрузчика против строкового имени атрибута, которое на самом деле не является отображаемым атрибутом, например, обычным дескриптором Python, возникала неинформативная ошибка AttributeError; теперь возникает ошибка с описанием.
References: #4589
engine¶
Исправлена проблема, при которой нестроковый объект, переданный в
SQLAlchemyError
или подкласс, как это происходит в некоторых сторонних диалектах, не мог корректно стробироваться. Pull request любезно предоставлен Andrzej Bartosiński.References: #5599
Исправлен импорт на уровне функций, при котором не использовалась стандартная система позднего импорта SQLAlchemy в модуле sqlalchemy.exc.
References: #5632
sql¶
Исправлена проблема, при которой операция
pickle.dumps()
против конструкцииOver
приводила к переполнению рекурсии.References: #5644
Исправлена ошибка, при которой не возникала ошибка в случае, когда
column()
добавлялись более чем к одномуtable()
одновременно. При этом ошибка возникала корректно для объектовColumn
иTable
. Теперь при возникновении такой ситуации выдается сообщениеArgumentError
.References: #5618
postgresql¶
Диалект psycopg2 теперь поддерживает многохостовые соединения с PostgreSQL, передавая в строке запроса комбинации хост/порт. Pull request любезно предоставлен Рамоном Уильямсом.
См.также
References: #4392
В методах
Comparator.any()
иComparator.all()
реализована прямая операция «НЕ» для отрицания, а не отрицание оператора сравнения.References: #5518
Исправлена проблема, при которой тип
ENUM
при выдаче CREATE TYPE или DROP TYPE не обращался к карте трансляции схемы во время проверки на существование или отсутствие типа. Кроме того, исправлена проблема, при которой, если одно и то же перечисление встречалось несколько раз в одной последовательности DDL, запрос «проверка» выполнялся повторно, а не полагался на кэшированное значение.References: #5520
mysql¶
Скорректирован диалект MySQL для корректного перевода функциональных индексных выражений в круглые скобки, как это принято в MySQL 8. Pull request любезно предоставлен Рамоном Уильямсом.
References: #5462
Добавить новые зарезервированные слова MySQL:
cube
,lateral
добавлены в MySQL 8.0.1 и 8.0.14 соответственно; это указывает на то, что при использовании этих терминов в качестве имен идентификаторов таблиц или столбцов они будут заключаться в кавычки.References: #5539
Ключевое слово «skip_locked», используемое вместе с
with_for_update()
, при использовании на бэкендах MariaDB будет выдавать предупреждение, а затем игнорироваться. Это устаревшее поведение, которое будет отменено в SQLAlchemy 1.4, поскольку приложение, запрашивающее «skip locked», ищет неблокирующую операцию, которая недоступна на этих бэкендах.References: #5568
Исправлена ошибка, из-за которой при выполнении оператора UPDATE с JOIN, использующего многотабличный формат MySQL, не включался префикс таблицы для целевой таблицы, если в операторе отсутствовал пункт WHERE, поскольку для обнаружения «многотабличного обновления» в этот момент сканировались только пункты WHERE. Теперь целевая таблица также сканируется, если это JOIN, чтобы получить самую левую таблицу в качестве первичной, а дополнительные записи - в качестве дополнительных записей FROM.
References: #5617
mssql¶
Исправлена проблема, при которой URI подключения SQLAlchemy к Azure DW, содержащий
authentication=ActiveDirectoryIntegrated
(и не содержащий имя пользователя+пароль), не формировал строку ODBC-соединения таким образом, который был приемлем для экземпляра Azure DW.References: #5592
tests¶
Исправлена несовместимость тестового набора при работе с Pytest 6.x.
References: #5635
misc¶
Исправлена проблема, при которой следующие параметры пула не распространялись на новый пул, созданный при вызове
Engine.dispose()
:pre_ping
,use_lifo
. Кроме того, для классаAssertionPool
теперь распространяются параметрыrecycle
иreset_on_return
.References: #5582
При попытке использовать прокси-элемент ассоциации в качестве обычного выражения столбца для SELECT из или использования в SQL-функции теперь выдается информационная ошибка; в настоящее время такой вариант использования не поддерживается.
1.3.19¶
Released: August 17, 2020orm¶
Настроена работа аксессора
Mapper.all_orm_descriptors()
для детерминированного представления атрибутов в порядке их расположения, что предполагает использование Python 3.6 и выше, который сохраняет порядок сортировки атрибутов класса в зависимости от того, как они были объявлены. Однако не гарантируется, что эта сортировка будет соответствовать объявленному порядку атрибутов во всех случаях; точную схему см. в документации к методу.References: #5494
orm declarative¶
Имя виртуального столбца, используемого при использовании классов
AbstractConcreteBase
иConcreteBase
, теперь может быть настроено, что позволяет использовать модели, имеющие столбец с реальным именемtype
. Pull request любезно предоставлен Jesse-Bakker.References: #5513
sql¶
Исправлена проблема, когда при выводе выражения «ORDER BY», содержащего имя метки, а не полное выражение, что особенно важно для SQL Server, в некоторых случаях не выполнялось, если выражение было заключено в круглую скобку. Этот случай был добавлен для проверки поддержки. Данное изменение дополнительно корректирует поведение ORM-запроса «автоматически добавлять столбцы ORDER BY при наличии DISTINCT», устаревшее в 1.4, для более точного определения уже присутствующих выражений столбцов.
References: #5470
Теперь сообщение
LookupError
будет предоставлять пользователю до четырех возможных значений, на которые ограничивается столбец с помощьюEnum
. Значения длиной более 11 символов будут усекаться и заменяться многоточиями. Pull request любезно предоставлен Ramon Williams.References: #4733
Исправлена проблема, при которой функция
Connection.execution_options.schema_translate_map
не вступала в силу, если в параметреColumn.server_default
использовалась функцияSequence.next_value()
дляSequence
и выполнялся DDL create table.References: #5500
postgresql¶
Исправлена проблема, при которой возвращаемый тип для различных операторов сравнения RANGE сам по себе являлся типом RANGE, а не BOOLEAN, что приводило к нежелательному результату в случае использования
TypeDecorator
, определяющего поведение обработки результата. Pull request любезно предоставлен Джимом Бошем.References: #5476
mysql¶
Диалект MySQL отобразит FROM DUAL для оператора SELECT, в котором нет предложения FROM, но есть предложение WHERE. Это позволяет использовать запросы типа «SELECT 1 WHERE EXISTS (subquery)», а также другие варианты использования.
References: #5481
Исправлена проблема, при которой в операторах CREATE TABLE неправильно указывалось ключевое слово COLLATE.
References: #5411
В список кодов «отключения» добавлен код MariaDB 1927, так как последние версии MariaDB, по-видимому, используют этот код, когда сервер базы данных был остановлен.
References: #5493
sqlite¶
Проведена проверка всех включенных диалектов на предмет корректного экранирования имен, содержащих одинарные или двойные кавычки, при запросах к системным таблицам, для всех методов
Inspector
, принимающих в качестве аргумента имена объектов (например, имена таблиц, представления и т.д.). SQLite и MSSQL содержали две проблемы с кавычками, которые были исправлены.References: #5456
mssql¶
Исправлена ошибка, при которой диалект mssql некорректно экранировал имена объектов, содержащие символы „]“.
References: #5467
misc¶
1.3.18¶
Released: June 25, 2020orm¶
Улучшено сообщение об ошибке при использовании
Query.filter_by()
в запросе, в котором первая сущность не является сопоставленным классом.References: #5326
В конструкцию
query_expression()
добавлен новый параметрquery_expression.default_expr
, который будет автоматически применяться к запросам, если не используется опцияwith_expression()
. Pull request любезно предоставлен Haoyu Sun.References: #5198
examples¶
В набор examples.performance добавлена новая опция
--raw
, которая позволяет сбрасывать необработанный тест профиля для использования любыми средствами визуализации профилей. Удалена опция «runsnake», так как на данный момент собрать runsnake очень сложно;
engine¶
Доработаны исправления агента «reset», исправленного в #5326, который теперь выдает предупреждение при некорректном вызове и исправляет поведение. Были выявлены и исправлены дополнительные сценарии, в которых выдавалось это предупреждение.
References: #5326
Исправлена проблема в объекте
URL
, когда при строковой обработке объекта не происходило URL-кодирование специальных символов, из-за чего URL не мог быть пересчитан как настоящий URL. Pull request любезно предоставлен Мигелем Гринбергом.References: #5341
sql¶
В конструкцию
table()
добавлен параметр «.schema», позволяющий специальным табличным выражениям также включать имя схемы. Pull request любезно предоставлен Диланом Модеситтом.References: #5309
В диалект sybase добавлена поддержка
.offset
. Pull request любезно предоставлен Аланом Д. Сноу.References: #5294
Корректно применять self_group в элементе type_coerce.
Элемент type coerce некорректно применял правила группировки при использовании в выражении
References: #5344
Добавлен вывод
Select.with_hint()
в общую SQL-строку, формируемую при вызовеstr()
на операторе. Ранее этот пункт опускался, поскольку предполагалось, что он зависит от диалекта. Текст подсказки представлен в скобках для того, чтобы показать, что в разных бэкендах такие подсказки отображаются по-разному.References: #5353
Ввести
IdentityOptions
для хранения общих параметров для последовательностей и столбцов идентичности.References: #5324
schema¶
mysql¶
Реализована поддержка блокировки на уровне строк для mysql. Pull request любезно предоставлен Квентином Сомервиллем.
References: #4860
sqlite¶
В SQLite 3.31 добавлена поддержка вычисляемых колонок. Это изменение обеспечивает их поддержку в SQLAlchemy при работе с SQLite.
References: #5297
В список зарезервированных слов для SQLite добавлено слово «exists», поэтому при использовании его в качестве метки или имени колонки оно будет заключаться в кавычки. Pull request любезно предоставлен Thodoris Sotiropoulos.
References: #5395
mssql¶
Перемещено требование
supports_sane_rowcount_returning = False
с уровняPyODBCConnector
на уровеньMSDialect_pyodbc
, поскольку в некоторых условиях pyodbc работает корректно.References: #5321
Усовершенствована логика, используемая диалектом SQL Server для интерпретации многокомпонентных имен схем, содержащих много точек, чтобы не терять точки, если в имени не используются скобки или кавычки, а также для поддержки многокомпонентного токена «dbname», который может иметь несколько независимо заключенных в скобки секций.
В коннекторе pyodbc исправлена ошибка, из-за которой при использовании абсолютно пустого URL выдавалось предупреждение о «drivername» pyodbc. Пустые URL являются нормальным явлением при создании неподключенного объекта диалекта или при использовании аргумента «creator» в create_engine(). Теперь предупреждение выдается только в том случае, если имя драйвера отсутствует, но другие параметры присутствуют.
References: #5346
Исправлена проблема со сборкой строки подключения к ODBC для pyodbc DBAPI. Токены, содержащие точки с запятой и/или скобки «{}», неправильно экранировались, что приводило к неправильной интерпретации драйвером ODBC атрибутов строки подключения.
References: #5373
Исправлена проблема, когда параметры
datetime.time
преобразовывались вdatetime.datetime
, что делало их несовместимыми со сравнениями типа>=
с реальным столбцомTIME
.References: #5339
Исправлена проблема, при которой функция
is_disconnect
в диалекте SQL Server pyodbc некорректно сообщала о состоянии разъединения, когда сообщение об исключении содержало подстроку, соответствующую коду ошибки SQL Server ODBC.References: #5359
oracle¶
Исправлена ошибка в диалекте Oracle, когда индексы, содержащие полный набор столбцов первичного ключа, ошибочно принимались за сам индекс первичного ключа, который опускался, даже если их было несколько. Проверка была доработана таким образом, чтобы сравнивать имя ограничения первичного ключа с именем самого индекса, а не пытаться угадать его по столбцам, присутствующим в индексе.
References: #5421
1.3.17¶
Released: May 13, 2020orm¶
Добавлен аксессор
Comparator.expressions
, обеспечивающий доступ к группе колонок, отображаемых по многоколоночному атрибутуColumnProperty
.References: #5262
Ввести флаг
relationship.sync_backref
в отношениях для контроля добавления событий синхронизации, изменяющих атрибуты in-Python. Это заменяет предыдущее изменение #5149, которое предупреждало, чтоviewonly=True
целевой объект отношения, имеющий конфигурацию back_populates или backref, будет запрещен.References: #5237
Исправлена ошибка, при которой использование
with_polymorphic()
в качестве цели join черезRelationshipComparator.of_type()
на mapper, который уже имеет настройку with_polymorphic на основе подзапроса, эквивалентную запрашиваемой, не приводило к корректному псевдониму предложения ON в join.References: #5288
Исправлена проблема взаимодействия опций загрузчика, таких как selectinload(), с системой запеченных запросов: кэширование запроса не должно происходить, если в самих опциях загрузчика присутствуют элементы типа with_polymorphic(), которые в настоящее время не совместимы с кэшем. В некоторых случаях загрузчик baked loader мог не полностью завершить свою работу в таких сценариях, что приводило к пропуску ускоренной загрузки.
References: #5303
Модифицирована внутренняя реализация «identity set», представляющая собой набор, который хэширует объекты по их id(), а не по хэш-значениям, чтобы не вызывать метод
__hash__()
у объектов, которые обычно являются пользовательскими объектами. Некоторые методы вызывали этот метод в качестве побочного эффекта реализации.References: #5304
Информационное сообщение об ошибке выдается в том случае, если ORM пытается выполнить сравнение «многие-к-одному» с объектом, не являющимся реальным сопоставленным экземпляром. Сравнения, например, со скалярными подзапросами не поддерживаются; обобщенное сравнение с подзапросами лучше выполнять с помощью
Comparator.has()
.References: #5269
engine¶
Исправлена довольно критичная проблема, когда DBAPI-соединение могло быть возвращено в пул соединений, находясь в состоянии un-rolled-back. Агент сброса, отвечающий за откат соединения, мог быть поврежден в случае «закрытия» транзакции без отката или фиксации, что может происходить в некоторых сценариях при использовании ORM-сессий и выполнении .close() в определенном паттерне с точками сохранения. Исправление гарантирует, что агент сброса всегда активен.
References: #5326
schema¶
Исправлена проблема, при которой выражение
Index
, отложенно связанное с таблицей, например, когда оно содержитColumn
, еще не связанное ни с однойTable
, не могло корректно присоединиться, если оно также содержало выражение, не ориентированное на таблицу.References: #5298
Предупреждение выдается, если при использовании атрибута
MetaData.sorted_tables
и функцииsort_tables()
заданные таблицы не могут быть корректно отсортированы из-за циклической зависимости между ограничениями по внешнему ключу. В этом случае функции больше не будут сортировать задействованные таблицы по внешнему ключу, о чем будет выдано предупреждение. Другие таблицы, не входящие в цикл, по-прежнему будут возвращаться в порядке зависимости. Ранее функции sorted_table при обнаружении цикла возвращали коллекцию, в которой безусловно опускались все иностранные ключи, и предупреждение не выдавалось.References: #5316
Добавить атрибут
comment
к методуColumn
__repr__
.References: #4138
postgresql¶
Добавлена поддержка столбцов или типа
ARRAY
изEnum
,JSON
илиJSONB
в PostgreSQL. Ранее в этих случаях требовалось обходное решение.References: #5265
Вызывает явную ошибку
CompileError
при добавлении таблицы со столбцом типаARRAY
изEnum
, в которомEnum.native_enum
установлен вFalse
, когдаEnum.create_constraint
не установлен вFalse
References: #5266
mssql¶
Исправление регрессии, связанной с отражением вычисляемого столбца в MSSQL при использовании устаревшей версии TDS 4.2. Диалект будет пытаться определить версию протокола при первом подключении и работать в режиме совместимости, если не сможет ее определить.
References: #5255
Исправление регрессии, связанной с отражением вычисляемого столбца в MSSQL при использовании SQL-сервера версий до 2012 года, не поддерживающего функцию
concat
.References: #5271
oracle¶
Некоторые изменения в настройке диалекта cx_oracle на обработку типов вывода по столбцам для LOB и числовых типов данных для адаптации к возможным изменениям в cx_Oracle 8.
References: #5246
Изменена реализация получения CLOB- и BLOB-объектов для использования собственной реализации cx_Oracle, которая получает CLOB/BLOB-объекты в один ряд с другими колонками результата, а не выполняет отдельную выборку. Как обычно, это можно отключить, установив для параметра auto_convert_lobs значение False.
В рамках этого изменения поведение CLOB, которому была присвоена пустая строка при INSERT, теперь возвращает None при SELECT, что соответствует поведению VARCHAR в Oracle.
References: #5314
misc¶
Скорректирована загрузка диалекта для URI
firebird://
, так что внешний диалект sqlalchemy-firebird будет использоваться, если он был установлен, в противном случае будет возвращаться к (теперь уже устаревшему) внутреннему диалекту Firebird.References: #5278
1.3.16¶
Released: April 7, 2020orm¶
В запросах, используемых в subqueryload и selectinload, изменен порядок следования по первичному ключу родительской сущности; этот порядок был использован для того, чтобы строки по мере их поступления копировались в списки напрямую с минимальным уровнем свертки на стороне Python. Однако эти условия ORDER BY могут негативно повлиять на производительность запроса, поскольку во многих сценариях эти столбцы получены из подзапроса или не являются столбцами с первичным ключом, что не позволяет планировщикам SQL использовать индексы. Свертка на стороне Python использует встроенную функцию itertools.group_by() для свертки входящих строк и была модифицирована, чтобы позволить собирать несколько групп строк по одному родителю с помощью list.extend(), что должно обеспечить относительно высокую производительность на стороне Python. Для отношений, включающих явный параметр order_by, по-прежнему будет присутствовать ORDER BY, однако это единственный ORDER BY, который будет добавлен в запрос для обоих типов загрузки.
References: #5162
Исправлена ошибка в варианте загрузки
selectinload()
, когда два или более загрузчика, представляющие различные отношения с одинаковым строковым именем ключа, на которые ссылается одна конструкцияwith_polymorphic()
с несколькими отображениями подклассов, не вызывали каждый подзапрос отдельно, а использовали один слот на основе строки, что не позволяло вызывать другие загрузчики.References: #5228
Исправлена проблема, при которой ленивая загрузка, использующая сессионно-локальный «get» в отношении целевого отношения «многие-к-одному», где присутствует объект с правильным первичным ключом, но он является экземпляром класса-близнеца, некорректно возвращала None, как это происходит, когда ленивый загрузчик действительно производит загрузку для этой строки.
References: #5210
orm declarative¶
Строковый аргумент, принимаемый в качестве первого позиционного аргумента функцией
relationship()
при использовании Декларативного API, больше не интерпретируется с помощью функции Pythoneval()
; вместо этого имя разделяется точками, и имена ищутся непосредственно в словаре разрешения имен, не рассматривая значение как выражение Python. Однако при передаче строкового аргумента другим параметрамrelationship()
, которые обязательно должны принимать выражения Python, по-прежнему будет использоваться функцияeval()
; документация была уточнена, чтобы исключить двусмысленность использования этой функции.См.также
Оценка аргументов в пользу отношений - подробности об оценке строк
References: #5238
sql¶
Добавлена возможность буквальной компиляции
DateTime
,Date
илиTime
при использовании строкового диалекта для целей отладки. Данное изменение не влияет на реальные реализации диалекта, которые сохраняют свое текущее поведение.References: #5052
schema¶
Добавлена поддержка отражения «вычисляемых» столбцов, которые теперь возвращаются как часть структуры, возвращаемой командой
Inspector.get_columns()
. При отражении полных объектовTable
вычисляемые столбцы будут представлены с помощью конструкцииComputed
.References: #5063
postgresql¶
Исправлена проблема, при которой «покрывающий» индекс, например, имеющий предложение INCLUDE, отражался, включая все столбцы в предложении INCLUDE как обычные столбцы. Теперь при обнаружении таких дополнительных столбцов выдается предупреждение о том, что в данный момент они игнорируются. Обратите внимание, что полная поддержка «покрывающих» индексов является частью #4458. Pull request любезно предоставлен Маратом Шарафутдиновым.
References: #5205
mysql¶
Исправлена проблема в диалекте MySQL при подключении к псевдо-MySQL базе данных, например, предоставляемой ProxySQL, при которой предварительная проверка уровня изоляции при отсутствии строки не мешает диалекту продолжить подключение. Выдается предупреждение о том, что уровень изоляции не может быть определен.
References: #5239
sqlite¶
Реализован уровень изоляции AUTOCOMMIT для SQLite при использовании pysqlite.
References: #5164
mssql¶
Добавлена поддержка
ColumnOperators.is_distinct_from()
иColumnOperators.isnot_distinct_from()
в SQL Server, MySQL и Oracle.References: #5137
oracle¶
Реализован уровень изоляции AUTOCOMMIT для Oracle при использовании cx_Oracle. Также добавлен фиксированный уровень изоляции по умолчанию READ COMMITTED для Oracle.
References: #5200
Исправлена регрессия / некорректное исправление, вызванное исправлением для #5146, когда диалект Oracle читал из представления «all_tab_comments» для получения комментариев к таблице, но не учитывал текущего владельца запрашиваемой таблицы, что приводило к чтению неправильного комментария, если несколько таблиц с одинаковым именем существовали в нескольких схемах.
References: #5146
tests¶
Исправлена проблема, из-за которой тестовый набор не мог работать с недавно выпущенной версией py.test 5.4.0.
References: #5201
misc¶
Тип
Enum
теперь поддерживает параметрEnum.length
для указания длины создаваемого столбца VARCHAR при использовании неродных перечислений путем установкиEnum.native_enum
в значениеFalse
.References: #5183
Убедились, что файл «pyproject.toml» не включается в сборки, поскольку наличие этого файла указывает pip на необходимость использования процесса установки pep-517. Поскольку данный режим работы, по-видимому, не очень хорошо поддерживается текущими инструментами / дистрибутивами, в рамках установки SQLAlchemy эти проблемы можно избежать, исключив этот файл.
References: #5207
1.3.15¶
Released: March 11, 2020orm¶
Скорректировано сообщение об ошибке, выдаваемое методом
Query.join()
, когда левая сторона не может быть найдена, что методQuery.select_from()
является наилучшим способом решения проблемы. Также в серии 1.3 использовано детерминированное упорядочивание при определении предложения FROM по заданной сущности столбца, передаваемой вQuery
, так что каждый раз определяется одно и то же выражение.References: #5194
В версии 1.3.14 исправлена регрессия #4849, из-за которой вызов sys.exc_info() не вызывался корректно при возникновении ошибки flush. Для этого случая добавлено тестовое покрытие.
References: #5196
1.3.14¶
Released: March 10, 2020general¶
Применена явная «причина» для большинства, если не для всех, внутренне вызываемых исключений, которые вызываются внутри внутреннего перехвата исключения, чтобы избежать введения в заблуждение трассировки стека, свидетельствующей об ошибке в процессе обработки исключения. Хотя было бы предпочтительнее подавлять внутренне пойманное исключение так, как это делает атрибут
__suppress_context__
, пока не существует способа сделать это без подавления окружающего пользовательского контекста, поэтому в настоящее время в качестве причины раскрывается внутренне пойманное исключение, чтобы сохранить полную информацию о контексте ошибки.References: #4849
orm¶
В события
InstanceEvents.load()
,InstanceEvents.refresh()
иSessionEvents.loaded_as_persistent()
добавлен новый флагInstanceEvents.restore_load_context
иSessionEvents.restore_load_context
, который при установке восстанавливает «контекст загрузки» объекта после вызова хука события. Это гарантирует, что объект останется в «контексте загрузчика» уже выполняющейся операции загрузки, а не будет переведен в новый контекст загрузки из-за операций обновления, которые могли произойти в событии. Теперь при возникновении этого условия выдается предупреждение, в котором рекомендуется использовать флаг для разрешения этой ситуации. Флаг является «опциональным», поэтому не представляет никакого риска для существующих приложений.Изменение дополнительно добавляет поддержку флага
raw=True
в событиях жизненного цикла сессии.References: #5129
Исправлена регрессия, вызванная в 1.3.13 ошибкой #5056, когда в результате рефакторинга системы реестра путей ORM путь больше не мог сравниваться с пустым кортежем, что может иметь место в определенном типе объединенных путей с ускоренной загрузкой. Случай использования «пустого кортежа» был решен таким образом, что реестр путей сравнивается с реестром путей во всех случаях; сам объект
PathRegistry
теперь реализует методы__eq__()
и__ne__()
, которые будут иметь место для всех сравнений равенства и продолжат успешно работать в непредвиденном случае, когда сравнивается неPathRegistry
объект, выдавая при этом предупреждение, что этот объект не должен быть объектом сравнения.References: #5110
Установка отношения в viewonly=True, которое также является целью конфигурации back_populates или backref, теперь будет выдавать предупреждение и в конечном итоге будет запрещена. back_populates относится именно к мутации атрибута или коллекции, которая запрещена, если атрибут имеет viewonly=True. Атрибут viewonly не подчиняется поведению персистентности, что означает, что он не будет отражать корректные результаты при локальном изменении.
References: #5149
Исправлена дополнительная регрессия в той же области, что и в #5080, введенная в 1.3.0b3 через #4468, когда возможность создания объединенного варианта через
with_polymorphic()
в отношение к базовому классу этого класса with_polymorphic, а затем далее в обычные отображаемые отношения приводила к неудаче, поскольку компонент базового класса не добавлял себя в путь загрузки таким образом, чтобы его можно было найти с помощью стратегии загрузчика. Изменения, примененные в #5080, были доработаны с учетом этого сценария.References: #5121
engine¶
Расширена область действия очистки курсора/соединения при выполнении оператора: теперь она включает случаи, когда не удается построить объект результата, когда событие after_cursor_execute() приводит к ошибке или когда не удается выполнить autocommit / autoclose. Это позволяет очищать курсор DBAPI при сбое, а при выполнении без соединения - закрывать соединение и возвращать его в пул соединений, где ранее ожидание сборки мусора приводило к возврату пула.
References: #5182
sql¶
Исправлена ошибка, при которой CTE оператора INSERT/UPDATE/DELETE, также использующего RETURNING, нельзя было напрямую выбрать, так как внутреннее состояние компилятора пыталось рассматривать внешний SELECT как оператор DELETE и обращаться к несуществующему состоянию.
References: #5181
postgresql¶
Исправлена проблема, при которой функция «schema_translate_map» не работала с собственным типом перечисления PostgreSQL (т.е.
Enum
,ENUM
), в то время как оператор «CREATE TYPE» выдавался с правильной схемой, схема не отображалась в операторе CREATE TABLE в точке, в которой происходило обращение к перечислению.References: #5158
Исправлена ошибка, из-за которой при отражении в PostgreSQL ограничений CHECK не удавалось разобрать ограничение, если в тексте SQL содержались символы новой строки. Регулярное выражение было скорректировано для этого случая. Pull request любезно предоставлен Эриком Борчуком.
References: #5170
mysql¶
Исправлена проблема в конструкции MySQL
Insert.on_duplicate_key_update()
, когда использование SQL-функции или другого составного выражения для аргумента столбца приводило к неправильному отображению ключевого словаVALUES
, окружающего сам столбец.References: #5173
mssql¶
Исправлена проблема, при которой тип
DATETIMEOFFSET
не принимал значениеNone
, введенная в рамках серии исправлений для этого типа, впервые появившихся в #4983, #5045. Кроме того, добавлена поддержка передачи через этот тип строки с форматированием даты, характерной для бэкенда, как это обычно делается для типов дата/время в большинстве других DBAPI.References: #5132
oracle¶
Исправлена ошибка отражения, когда комментарии к таблицам могли быть получены только для таблиц, фактически принадлежащих пользователю, но не для таблиц, видимых пользователю, но принадлежащих кому-то другому. Pull request любезно предоставлен Дэйвом Хиршфельдом.
References: #5146
misc¶
В функцию
MutableList.sort()
добавлены аргументы в виде ключевых слов, чтобы можно было указать как ключевую функцию, так и аргумент в виде ключевого слова «reverse».References: #5114
Исправлено внутреннее изменение в тестовой системе, добавленное в результате #5085, когда модуль, связанный с тестированием, загружается безусловно при использовании диалекта, втягивая в пространство импорта модулей фреймворк тестирования SQLAlchemy, а также ORM. Это лишь незначительно повлияет на время начального запуска и память, однако лучше, чтобы эти дополнительные модули не были обратно зависимы от прямого использования Core.
References: #5180
Вендоризация функции
inspect.formatannotation
внутриsqlalchemy.util.compat
, которая необходима для вендоризованной версииinspect.formatargspec
. Эта функция не документирована в cPython и не гарантируется, что она будет доступна в будущих версиях Python.References: #5138
1.3.13¶
Released: January 22, 2020orm¶
Выявлена проблема с производительностью системы, в которой соединение строится на основе сопоставленных отношений. Система адаптации клаузул будет использоваться для большинства выражений присоединения, в том числе и в распространенном случае, когда адаптация не требуется. Условия, при которых происходит адаптация, были уточнены таким образом, что в среднем при построении несглаженных соединений на основе простого отношения без «вторичной» таблицы используется примерно на 70% меньше вызовов функций.
Добавлена поддержка тестов и исправлено множество ненужных циклов ссылок, созданных для короткоживущих объектов, в основном в области ORM-запросов. Большое спасибо Карсону Ипу за помощь в этом вопросе.
Исправлена регрессия в опциях загрузчика, появившаяся в 1.3.0b3 через #4468, когда при создании опции загрузчика с помощью
PropComparator.of_type()
, нацеленной на псевдосущность, являющуюся наследующим подклассом сущности, на которую ссылается предыдущее отношение, не удавалось получить соответствующий путь. См. также исправление #5082 в этом же выпуске, связанное с аналогичной проблемой.References: #5107
В 1.3.0b3 исправлена регрессия в загрузке объединенных опций через #4468, когда возможность создания объединенной опции через
with_polymorphic()
в полиморфный подкласс с помощьюRelationshipProperty.of_type()
и далее по обычным отображаемым связям приводила к ошибке, так как полиморфный подкласс не добавлял себя в путь загрузки таким образом, чтобы его можно было найти с помощью стратегии загрузчика. Для решения этой проблемы была сделана поправка.References: #5082
Исправлено предупреждение в процессе промывки ORM, которое не покрывалось тестами при удалении объектов, использующих функцию «version_id». Это предупреждение обычно недостижимо, если только не используется диалект, в котором флаг «supports_sane_rowcount» установлен в значение False, что обычно не характерно, но возможно для некоторых конфигураций MySQL, а также старых драйверов Firebird и, вероятно, некоторых диалектов сторонних производителей.
References: #5068
Исправлена ошибка, при которой использование объединенной ускоренной загрузки не позволяло обернуть запрос внутри подзапроса, если в запросе использовались
Query.group_by()
. При использовании любого подхода к ограничению результатов, например, DISTINCT, LIMIT, OFFSET, объединенная ускоренная загрузка вставляет запрос с ограничением строк внутрь подзапроса, чтобы не влиять на результаты коллекции. По какой-то причине наличие GROUP BY не было включено в этот критерий, хотя оно имеет тот же эффект, что и использование DISTINCT. Кроме того, эта ошибка не позволяет вообще использовать GROUP BY для объединенного запроса с ускоренной загрузкой для большинства платформ баз данных, которые запрещают наличие в запросе неагрегированных и негруппированных столбцов, поскольку дополнительные столбцы для объединенной ускоренной загрузки не будут восприняты базой данных.References: #5065
engine¶
Исправлена проблема, при которой коллекция процессоров значений на объекте
Compiled
мутировала при использовании «расширяющих IN» параметров с типом данных, имеющим процессоры значений bind; в частности, это означало, что при использовании кэширования операторов и/или запекаемых запросов одна и та же коллекция compiled._bind_processors мутировала параллельно. Поскольку эти процессоры каждый раз выполняют одну и ту же функцию для данного пространства имен bind-параметров, фактического негативного эффекта от этой проблемы не было, однако выполнение объектаCompiled
никогда не должно приводить к изменению его состояния, особенно если учесть, что они предназначены для потокобезопасности и многократного использования после полного построения.References: #5048
sql¶
В функции, созданной с помощью
GenericFunction
, теперь можно указать, что имя функции должно отображаться с кавычками или без них, присвоив элементу .name объекта конструкциюquoted_name
. До версии 1.3.4 кавычки к именам функций не применялись, а в #4467 были введены некоторые кавычки, но не было средств принудительного приведения имени в смешанном регистре. Кроме того, конструкцияquoted_name
при использовании в качестве имени правильно регистрирует свое имя в нижнем регистре в реестре функций, так что имя по-прежнему доступно через реестрfunc.
.См.также
References: #5079
postgresql¶
Добавлена поддержка префиксов к конструкции
CTE
, что позволяет поддерживать фразы Postgresql 12 «МАТЕРИАЛИЗОВАНО» и «НЕ МАТЕРИАЛИЗОВАНО». Pull request любезно предоставлен Маратом Шарафутдиновым.См.также
References: #5040
Исправлена проблема, при которой диалект PostgreSQL не мог разобрать отраженное ограничение CHECK, представляющее собой функцию с булевым значением (в отличие от выражения с булевым значением).
References: #5039
mssql¶
Исправлена проблема, при которой в значении
datetime
, преобразуемом в строку для использования в качестве параметра столбцаDATETIMEOFFSET
, отсутствовали дробные секунды.References: #5045
tests¶
Исправлено несколько сбоев в тестах, возникавших под Windows из-за проблем с блокировкой файлов SQLite, а также некоторые проблемы со временем в тестах, связанных с пулом соединений; запрос на выгрузку любезно предоставлен Федерико Казелли.
References: #4946
Улучшено обнаружение требования двухфазных транзакций для базы данных PostgreSQL путем проверки того, что max_prepared_transactions установлен в значение больше 0. Pull request любезно предоставлен Федерико Казелли.
References: #5057
misc¶
Исправлена ошибка в sqlalchemy.ext.serializer, когда уникальный объект
BindParameter
мог конфликтовать сам с собой, если он присутствовал в самом отображении, а также в условии фильтрации запроса, так как с одной стороны использовалась не десериализованная версия, а с другой - десериализованная. ВBindParameter
добавлена логика, аналогичная его методу «clone», которая при десериализации будет уникализировать имя параметра, чтобы он не конфликтовал с оригиналом.References: #5086
1.3.12¶
Released: December 16, 2019orm¶
Исправлена проблема, связанная со стратегией
lazy="raise"
, когда при удалении объекта в ORM возникала ошибка для простых отношений типа «use-get» типа «многие-к-одному», для которых было настроено lazy=»raise». Это противоречит изменению, внесенному в 1.3 в рамках #4353, где было установлено, что операция истории, которая не ожидает выдачи SQL, должна обходить проверкуlazy="raise"
, а вместо этого эффективно рассматривать ее какlazy="raise_on_sql"
для данного случая. Исправление корректирует стратегию ленивого загрузчика таким образом, чтобы не поднимать вопрос для случая, когда ленивая загрузка была проинструктирована, что она не должна испускать SQL, если объект не присутствует.References: #4997
В версии 1.3.0 исправлена ошибка, связанная с рефактором ассоциативного прокси в #4351, из-за которой атрибуты
composite()
не работали в терминах ассоциативного прокси, ссылающегося на них.References: #5000
Установка флагов, связанных с персистентностью, для
relationship()
при одновременном задании viewonly=True теперь будет выдавать обычное предупреждение, поскольку эти флаги не имеют смысла для отношения viewonly=True. В частности, настройки «каскада» имеют собственное предупреждение, которое генерируется на основе отдельных значений, например, «delete, delete-orphan», которые не должны применяться к отношениям viewonly. Заметим, однако, что в случае «каскада» эти настройки ошибочно продолжают действовать, даже если отношение настроено как «только для просмотра». Для решения этой проблемы в версии 1.4 все каскадные настройки, связанные с персистентностью, будут запрещены для отношений viewonly=True.References: #4993
Исправлена проблема, при которой при назначении коллекции самой себе в качестве среза операция мутации заканчивалась неудачей, так как сначала непреднамеренно стиралась назначенная коллекция. Поскольку присваивание, не изменяющее содержимое коллекции, не должно генерировать события, операция теперь не работает. Обратите внимание, что исправление применимо только к Python 3; в Python 2 хук
__setitem__
в этом случае не вызывается; вместо него используется__setslice__
, который во всех случаях воссоздает список элемент за элементом.References: #4990
Исправлена проблема, когда при неудачном «начале» транзакции на уровне движка Core/соединения, например, из-за сетевой ошибки или блокировки базы данных по каким-либо транзакционным рецептам, в контексте
Session
, получающего это соединение из пула соединений и тут же возвращающего его, ORMSession
не закрывал соединение, несмотря на то, что это соединение не хранилось в состоянии этогоSession
. Это приведет к тому, что соединение будет очищено обработчиком weakref пула соединений в рамках сборки мусора, что является нежелательным кодовым шагом, который в некоторых специальных конфигурациях может приводить к ошибкам в стандартной ошибке.References: #5034
sql¶
Исправлена ошибка, при которой ключевое слово «distinct», передаваемое в
select()
, не рассматривало строковое значение как «ссылку на метку» так же, как это делаетselect.distinct()
; вместо этого происходило безусловное повышение. Этот ключевой аргумент и другие, передаваемые вselect()
, в конечном итоге будут устаревшими для SQLAlchemy 2.0.References: #5028
Изменен текст исключения «Не удается разрешить ссылку на метку», чтобы включить в него другие виды принуждений к меткам, а именно, что «DISTINCT» также относится к этой категории в диалекте PostgreSQL.
sqlite¶
Исправлена проблема, позволяющая обойти поведение SQLite при присвоении «числового» сродства типам данных JSON, впервые описанное в Добавлена поддержка SQLite JSON, которое возвращает скалярные числовые значения JSON в виде числа, а не в виде строки, которую можно десериализовать в JSON. Десериализатор JSON, специфичный для SQLite, теперь изящно деградирует для этого случая в виде исключения и обходит десериализацию для одиночных числовых значений, поскольку с точки зрения JSON они уже десериализованы.
References: #5014
mssql¶
Исправлена поддержка типа данных
DATETIMEOFFSET
в PyODBC путем добавления обработчиков результатов на уровне PyODBC, так как в нем нет нативной поддержки этого типа данных. Это включает использование подкласса tzinfo «timezone» из Python 3 для установки часового пояса, который на Python 2 использует минимальный бэкпорт «timezone» в sqlalchemy.util.References: #4983
1.3.11¶
Released: November 11, 2019orm¶
Добавлен аксессор
Query.is_single_entity()
кQuery
, который указывает, будет ли результат, возвращаемый этимQuery
, списком сущностей ORM, или кортежем сущностей или выражений столбцов. SQLAlchemy надеется улучшить поведение одиночных сущностей / кортежей в будущих выпусках, чтобы это поведение было явным заранее, однако этот атрибут должен быть полезен для текущего поведения. Pull request любезно предоставлен Патриком Хейсом.References: #4934
Флаг
relationship.omit_join
не был предназначен для ручной установки в True, и теперь при возникновении такой ситуации будет выдаваться предупреждение. Оптимизация omit_join обнаруживается автоматически, и флагomit_join
был предназначен только для отключения оптимизации в гипотетическом случае, когда оптимизация могла помешать корректному результату, чего не наблюдалось в современной версии этой функции. Установка флага в True, когда он не определяется автоматически, может привести к некорректной работе функции selectin load при использовании нестандартного условия первичного соединения.References: #4954
Если в
Query.get()
передается значение первичного ключа, состоящее из None для всех позиций столбцов первичного ключа, то выдается предупреждение. Ранее передача одиночного None вне кортежа вызывала предупреждениеTypeError
, а передача составного None (кортежа из значений None) проходила молча. Теперь исправление принудительно помещает одиночное None в кортеж, где оно обрабатывается последовательно с другими условиями None. Спасибо Льву Израилевичу за помощь.References: #4915
BakedQuery
не будет кэшировать запрос, который был изменен событиемQueryEvents.before_compile()
, так что крючки компиляции, которые могут применять специальные изменения к запросам, будут действовать при каждом запуске. В частности, это полезно для событий, модифицирующих запросы, используемые в ленивой загрузке, а также в нетерпеливой загрузке, такой как загрузка «select in». Для повторного включения кэширования для запроса, модифицированного этим событием, добавлен новый флагbake_ok
; подробнее см. раздел Использование события before_compile.Более долгосрочный план по созданию новой формы кэширования SQL должен решить подобную проблему более полно.
References: #4947
Исправлена ошибка ORM, когда «вторичная» таблица, ссылающаяся на selectable, который каким-либо образом ссылается на локальную первичную таблицу, применяла алиасинг к обеим сторонам условия join, когда генерировались связанные с отношениями join, либо через
Query.join()
, либо черезjoinedload()
. Теперь «локальная» сторона исключена.References: #4974
engine¶
Исправлена ошибка, при которой параметр repr, используемый в логах и отчетах об ошибках, нуждался в дополнительном контексте, чтобы отличить список параметров для одного оператора от списка списков параметров, поскольку структура «список списков» могла также указывать на список из одного параметра, где первый параметр сам является списком, например, для параметра массива. Теперь движок/соединение передает дополнительный булев, указывающий на то, как следует учитывать параметры. Единственным бэкендом SQLAlchemy, который ожидает массивы в качестве параметров, является psycopg2, использующий параметры pyformat, поэтому эта проблема не слишком заметна, однако по мере того, как другие драйверы, использующие позиционные параметры, получают все больше возможностей, важно, чтобы это поддерживалось. Кроме того, это избавляет функцию parameter repr от необходимости угадывать структуру передаваемого параметра.
References: #4902
Исправлена ошибка в
Inspector
, когда при генерации ключа кэша не учитывались аргументы, переданные в виде кортежей, например, кортеж стилей имен представлений, который необходимо вернуть для диалекта PostgreSQL. Это приводило к тому, что при более конкретном наборе критериев инспектор кэшировал слишком общий ключ. Логика была скорректирована таким образом, чтобы включать в кэш каждый элемент ключевого слова, поскольку ожидается, что каждый аргумент будет соответствовать кэшу, иначе декоратор кэширования должен быть обойден диалектом.References: #4955
sql¶
Добавлены новые аксессоры к выражениям типа
JSON
для доступа и сравнения конкретных типов данных, охватывающие строки, целые числа, числовые и булевы элементы. Это пересматривает документированный подход CASTing to string при сравнении значений, вместо этого в диалекты PostgreSQL, SQlite, MySQL добавлена специальная функциональность для надежного предоставления этих базовых типов во всех случаях.См.также
References: #4276
Конструкция
text()
теперь поддерживает «уникальные» связанные параметры, которые будут динамически уникализироваться при компиляции, что позволяет объединять несколько конструкцийtext()
с одинаковыми именами связанных параметров.References: #4933
Изменена конструкция
repr()
изquoted_name
для использования регулярной строки repr() под Python 3, а не для выполнения экранирования «backslashreplace», которое может вводить в заблуждение.References: #4931
schema¶
Добавлена поддержка DDL для «вычисляемых колонок»; это спецификации DDL для колонок, значение которых вычисляется сервером либо при SELECT (так называемые «виртуальные»), либо в момент INSERT или UPDATEd (так называемые «хранимые»). Поддерживаются Postgresql, MySQL, Oracle SQL Server и Firebird. Спасибо Федерико Казелли за большую работу над этим проектом.
References: #4894
Исправлена ошибка, при которой в таблице, где метка столбца перекрывалась с обычным именем столбца, например, «foo.id AS foo_id» против «foo.foo_id», преждевременно генерировался атрибут
._label
для столбца до того, как это перекрытие могло быть обнаружено из-за использования флагаindex=True
илиunique=True
для столбца в сочетании со стандартным соглашением об именовании"column_0_label"
. Это приводило к сбоям при последующем использовании._label
для генерации имен связанных параметров, в частности, используемых ORM при генерации предложения WHERE для оператора UPDATE. Проблема была устранена путем использования альтернативного аксессора._label
для генерации DDL, который не влияет на состояниеColumn
. Аксессор также обходит шаг дедупликации ключей, поскольку он не нужен для DDL. Теперь при использовании в DDL именование последовательно"<tablename>_<columnname>"
без последующих цифровых символов.References: #4911
mysql¶
Добавлено сообщение «Connection was killed», интерпретируемое из базового класса pymysql.Error для обнаружения закрытого соединения, на основании сообщений о том, что это сообщение приходит через объект pymysql.InternalError(), что указывает на то, что pymysql обрабатывает его некорректно.
References: #4945
mssql¶
Исправлена проблема в диалекте MSSQL, когда значение OFFSET, основанное на выражении, в SELECT отклонялось, даже если диалект может отобразить это выражение внутри конструкции LIMIT/OFFSET, ориентированной на ROW NUMBER.
References: #4973
Исправлена проблема в методе
Engine.table_names()
, когда в функцию таблицы уровня диалекта передавалось имя схемы по умолчанию диалекта, которое в случае SQL Server интерпретировалось как имя схемы с точкой в соответствии с диалектом mssql, что приводило к ошибке в случае, если имя пользователя базы данных действительно содержало точку внутри него. В версии 1.3 этот метод по-прежнему используется функциейMetaData.reflect()
, поэтому является заметным кодовым путем. В версии 1.4, которая является текущей мастер-веткой разработки, этой проблемы не существует, так какMetaData.reflect()
не использует этот метод и не передает имя схемы по умолчанию в явном виде. Тем не менее, исправление защищает возвращаемое диалектом значение имени сервера по умолчанию от интерпретации как ток-енизированного имени при любых обстоятельствах, оборачивая его в quoted_name().References: #4923
oracle¶
В диалект cx_Oracle добавлен флаг уровня диалекта
encoding_errors
, который может быть указан как часть флагаcreate_engine()
. Он передается в конвертер декодирования юникода SQLAlchemy под Python 2 и в объект cx_Oraclecursor.var()
в качестве параметраencodingErrors
под Python 3 для очень необычного случая, когда в целевой базе данных присутствуют неработающие кодировки, которые не могут быть извлечены, если не ослаблена обработка ошибок. В конечном счете, это значение является одним из параметров Python «encoding errors», передаваемых вdecode()
.References: #4799
Изменен подход к «нормализации имен» для диалектов Oracle и Firebird, при котором преобразование из UPPERCASE-as-case-insensitive, принятого в этих диалектах, в lowercase-as-case-insensitive для SQLAlchemy, чтобы не применять автоматически конструкцию
quoted_name
к имени, которое само совпадает при преобразовании в верхний или нижний регистр, как это происходит для многих неевропейских символов. Все имена, используемые в структурах метаданных, в любом случае преобразуются в объектыquoted_name
; изменение здесь повлияет только на вывод некоторых функций проверки.References: #4931
Тип данных
NCHAR
теперь будет связываться с привязкой данныхcx_Oracle.FIXED_NCHAR
DBAPI при использовании в связанном параметре, что обеспечивает корректное поведение при сравнении со строкой переменной длины. Ранее тип данныхNCHAR
связывался сcx_oracle.NCHAR
, который не имеет фиксированной длины; тип данныхCHAR
уже связывается сcx_Oracle.FIXED_CHAR
, так что в настоящее время вполне логично, чтоNCHAR
связывается сcx_Oracle.FIXED_NCHAR
.References: #4913
tests¶
Исправлены сбои в тестировании, возникающие в новых версиях SQLite, начиная с версии 3.30 и выше, связанные с добавлением синтаксиса упорядочивания nulls, а также с новыми ограничениями на агрегатные функции. Pull request любезно предоставлен Nils Philippsen.
References: #4920
misc¶
Добавлено решение проблемы, связанной с setuptools, которая наблюдалась при установке Windows, когда setuptools некорректно сообщает об ошибке сборки, если не установлены зависимости сборки MSVC, что не позволяет перейти к сборкам без расширений C.
References: #4967
В обнаружение отключения Firebird добавлено дополнительное сообщение «Ошибка записи данных в соединение». Pull request любезно предоставлен lukens.
References: #4903
1.3.10¶
Released: October 9, 2019mssql¶
Исправлена ошибка в диалекте SQL Server с новой функцией «max_identifier_length», когда диалект mssql уже имел этот флаг, а реализация не учитывала корректно новый крючок инициализации.
References: #4857
oracle¶
Исправлена регрессия в диалекте Oracle, из-за которой на сервере Oracle 12.2 и выше непроизвольно использовалась максимальная длина идентификатора 128 символов, хотя по условиям контракта для оставшихся версий серии 1.3 это значение остается равным 30 до версии SQLAlchemy 1.4. Также исправлены проблемы с получением версии «совместимости» и убрано предупреждение, выдаваемое при недоступности представления «v$parameter», так как это приводило к путанице пользователей.
1.3.9¶
Released: October 4, 2019orm¶
Исправлена регрессия в стратегии загрузчика selectinload, вызванная использованием #4775 (выпущен в версии 1.3.6), в результате которой атрибут Many-to-one, равный None, больше не заполнялся загрузчиком. Хотя обычно это было незаметно из-за того, что lazyloader заполнял None при получении, при отсоединении объекта это приводило к ошибке detached instance.
References: #4872
Передача обычного строкового выражения в
Session.query()
является устаревшей, так как все строковые принуждения были удалены в #4481, а это должно было быть включено. Функцияliteral_column()
может быть использована для получения текстового выражения столбца.References: #4873
Предупреждение выдается для случая, когда
Session
может неявно поменять объект из карты идентификации на другой объект с тем же первичным ключом, отсоединив старый, что может быть результатом операций загрузки, выполняемых в рамках хукаSessionEvents.after_flush()
. Предупреждение призвано уведомить пользователя о том, что это произошло по каким-то особым условиям и что предыдущий объект может находиться не в ожидаемом состоянии.References: #4890
engine¶
Добавлен новый параметр
create_engine()
create_engine.max_identifier_length
. Он переопределяет кодируемую диалектом «максимальную длину идентификатора» для учета баз данных, в которых эта длина была недавно изменена, а диалект SQLAlchemy еще не был настроен для ее определения. Этот параметр взаимодействует с существующим параметромcreate_engine.label_length
в том, что он устанавливает максимальное значение (и значение по умолчанию) для анонимно сгенерированных меток. Кроме того, в систему диалектов было добавлено определение максимальной длины идентификатора после подключения. Эта возможность впервые используется в диалекте Oracle.См.также
Максимальная длина идентификатора - в документации по диалекту Oracle
References: #4857
sql¶
Добавлено явное сообщение об ошибке для случая, когда объекты, переданные в
Table
, не являются объектамиSchemaItem
, вместо того, чтобы разрешить ошибку атрибута.References: #4847
Символы, мешающие форматам «pyformat» или «named» в связанных параметрах, а именно
%, (, )
и символ пробела, а также некоторые другие обычно нежелательные символы, удаляются раньше дляbindparam()
, использующего анонимизированное имя, которое обычно генерируется автоматически из именованного столбца, который сам включает эти символы в свое имя и не использует.key
, чтобы они не мешали ни использованию компилятором SQLAlchemy форматирования строк, ни разбору параметра на уровне драйвера, что можно было продемонстрировать до исправления. Данное изменение относится только к анонимизированным именам параметров, которые генерируются и потребляются внутри системы, а не к именам, определяемым конечным пользователем, поэтому оно не должно повлиять на существующий код. В частности, это относится к драйверу psycopg2, который в противном случае не цитирует специальные имена параметров, а также удаляет ведущие символы подчеркивания в угоду Oracle (но пока не ведущие цифры, поскольку некоторые параметры anon в настоящее время полностью основаны на цифрах/незачеркнутых символах); Oracle в любом случае продолжает цитировать имена параметров, содержащие специальные символы.References: #4837
sqlite¶
mssql¶
Добавлена кавычка идентификатора для имени схемы, применяемая в операторе «use», который вызывается, когда в отражаемом
Table
используется многокомпонентное имя схемы SQL Server, а также для методовInspector
, таких какInspector.get_table_names()
; это учитывает наличие специальных символов или пробелов в имени базы данных. Кроме того, оператор «use» не выдается, если текущая база данных совпадает с передаваемым именем базы данных владельца цели.References: #4883
oracle¶
Диалект Oracle теперь выдает предупреждение, если используется Oracle версии 12.2 или выше, а параметр
create_engine.max_identifier_length
не задан. В этом конкретном случае по умолчанию используется версия «совместимости», установленная в конфигурации сервера Oracle, а не реальная версия сервера. В версии 1.4 значение max_identifier_length по умолчанию для версий 12.2 и выше будет изменено на 128 символов. Для сохранения форвардной совместимости приложениям следует установить значениеcreate_engine.max_identifier_length
в 30, чтобы сохранить прежнее поведение длины, или в 128, чтобы протестировать предстоящее поведение. Эта длина, помимо прочего, определяет, как будут усекаться генерируемые имена ограничений для операторов типаCREATE CONSTRAINT
иDROP CONSTRAINT
, что означает, что новая длина может привести к несовпадению имен с именами, которые были сгенерированы со старой длиной, что может повлиять на миграцию базы данных.См.также
Максимальная длина идентификатора - в документации по диалекту Oracle
References: #4857
Восстановлено добавление cx_Oracle.DATETIME в вызов setinputsizes() при использовании типа данных SQLAlchemy
Date
,DateTime
илиTime
, так как в некоторых сложных запросах это необходимо. В серии 1.2 это было удалено по произвольным причинам.References: #4886
tests¶
В версии 1.3.8 исправлена регрессия в модульных тестах, которая приводила к сбоям в работе Oracle, SQL Server и других неродных ENUM-платформ из-за новых тестов перечислений, добавленных как часть сортировки перечислений #4285 в модуле работы; перечисления создавали ограничения, которые дублировались по имени.
References: #4285
1.3.8¶
Released: August 27, 2019orm¶
Добавлена поддержка использования типа данных
Enum
, использующего объекты перечисления Python pep-435 в качестве значений для использования в качестве столбца первичного ключа, отображаемого ORM. Поскольку эти значения по своей природе не являются сортируемыми, как того требует ORM для первичных ключей, в систему типизации добавлен новый атрибутTypeEngine.sort_key_function
, который позволяет любому типу SQL реализовать сортировку для объектов Python своего типа, к которым обращается единица работы. При этом типEnum
задает ее, используя значение базы данных данного перечисления. Схема сортировки может быть также переопределена путем передачи вызываемого параметраEnum.sort_key_function
. Pull request любезно предоставлен Nicolas Caniart.References: #4285
Исправлена ошибка, при которой объекты
Load
не были pickleable из-за состояния mapper/relationship во внутреннем контекстном словаре. Теперь эти объекты преобразуются в picklable с помощью тех же приемов, что и другие элементы в системе опций загрузчика, которые уже давно являются сериализуемыми.References: #4823
engine¶
Добавлен новый параметр
create_engine.hide_parameters
, при установке которого в значение True параметры SQL больше не будут регистрироваться и выводиться в строковое представление объектаStatementError
.References: #4815
Исправлена проблема, при которой процесс «инициализации» диалекта, выполняемый при первом подключении, сталкивался с неожиданным исключением, процесс инициализации не завершался и при последующих попытках подключения больше не выполнялся, оставляя диалект в неинициализированном или частично инициализированном состоянии, в пределах параметров, которые должны быть установлены на основе проверки реального соединения. Логика «вызвать один раз» в системе событий была переработана с учетом этой ситуации с помощью новых частных API-функций, которые устанавливают «исполняющий один раз» хук, который будет продолжать позволять инициализатору срабатывать при последующих соединениях, пока он не завершится без возникновения исключения. Это не влияет на поведение существующего флага
once=True
в системе событий.References: #4807
postgresql¶
Добавлена поддержка отражения ограничений CHECK, включающих специальный квалификатор PostgreSQL «NOT VALID», который может присутствовать для ограничений CHECK, добавленных в существующую таблицу с указанием, что они не должны применяться к существующим данным в таблице. Словарь PostgreSQL для CHECK-ограничений, возвращаемый командой
Inspector.get_check_constraints()
, может включать дополнительную записьdialect_options
, которая в случае обнаружения этого символа будет содержать запись"not_valid": True
. Pull request любезно предоставлен Биллом Финном.References: #4824
Переработан подход для только что добавленной поддержки функции psycopg2 «execute_values()», добавленной в 1.3.7 для #4623. В данном подходе использовалось регулярное выражение, которое не подходило для более сложного оператора INSERT, например, с подзапросами. Новый подход обеспечивает точное соответствие строке, которая была выведена в качестве предложения VALUES.
References: #4623
Исправлена ошибка, при которой операторы Postgresql, такие как
Comparator.contains()
иComparator.contained_by()
, не работали корректно для нецелых значений при использовании их против объектаarray
, что было связано с ошибочным утверждением assert.References: #4822
sqlite¶
Исправлена ошибка, при которой FOREIGN KEY, настроенный на ссылку на родительскую таблицу только по имени таблицы без указания имен столбцов, не отражался корректно в части настройки «ссылающихся столбцов», поскольку PRAGMA SQLite не сообщает об этих столбцах, если они не заданы явно. По какой-то причине в этом случае жестко кодировалось имя локального столбца, что, возможно, работает в некоторых случаях, но не является корректным. Новый подход отражает первичный ключ ссылающейся таблицы и использует список столбцов ограничений в качестве списка ссылающихся столбцов, если удаленный столбец (столбцы) не присутствует в отраженной прагме напрямую.
References: #4810
1.3.7¶
Released: August 14, 2019orm¶
Исправлена ошибка, вызванная новой логикой selectinload для логики «многие-к-одному», когда условие primaryjoin, не основанное на реальных внешних ключах, приводило к ошибке KeyError, если связанный объект не существовал для данного значения ключа в родительском объекте.
References: #4777
Исправлена ошибка, при которой использование
Query.first()
или выражения slice в сочетании с запросом, в котором применено выражение, основанное на «смещении», приводило к ошибке TypeError из-за того, что условное «или» в отношении «смещения» не ожидало, что оно является выражением SQL, а не целым числом или None.References: #4803
sql¶
Исправлена проблема, при которой объект
Index
, содержащий смесь функциональных выражений, не разрешаемых в конкретный столбец, в сочетании со строковыми именами столбцов, не мог корректно инициализировать свое внутреннее состояние, что приводило к сбоям при компиляции DDL.References: #4778
Исправлена ошибка, при которой метод
TypeEngine.column_expression()
не применялся к последующим операторам SELECT внутри UNION или других_selectable.CompoundSelect
, даже если операторы SELECT отображались на самом верхнем уровне оператора. Новая логика теперь различает вывод выражения столбца, который необходим для всех SELECT в списке, и сбор возвращаемого типа данных для строки результата, который необходим только для первого SELECT.References: #4787
Исправлена проблема, при которой внутреннее клонирование конструкций SELECT могло привести к ошибке ключа, если копия SELECT меняла свое состояние так, что менялся список столбцов. Это наблюдалось в некоторых ORM-сценариях, которые могут быть характерны только для версии 1.3 и выше, поэтому частично является регрессионным исправлением.
References: #4780
postgresql¶
Добавлен новый флаг диалекта psycopg2,
executemany_mode
, который заменяет предыдущий экспериментальный флагuse_batch_mode
.executemany_mode
поддерживает функции «execute batch» и «execute values», предоставляемые psycopg2, последняя из которых используется для компилируемых конструкцийinsert()
. Pull request любезно предоставлен Ювалом Динари.References: #4623
mysql¶
В список зарезервированных слов MySQL добавлены зарезервированные слова ARRAY и MEMBER, поскольку в MySQL 8.0 они стали зарезервированными.
References: #4783
Диалекты MySQL будут выдавать «SET NAMES» в начале соединения, когда драйверу MySQL задается charset, чтобы устранить очевидное поведение, наблюдаемое в MySQL 8.0, которое приводит к ошибке collation, когда UNION включает строковые столбцы, объединенные со столбцами вида CAST(NULL AS CHAR(…)), что и делает функция SQLAlchemy polymorphic_union. Похоже, что эта проблема касается PyMySQL уже не менее года, однако в последнее время она появилась в версии mysqlclclient 1.4.4, что связано с изменениями в способе создания соединения этим DBAPI. Поскольку наличие этой директивы влияет на три отдельные настройки MySQL charset, каждая из которых имеет сложный эффект, SQLAlchemy теперь будет выдавать эту директиву при новых соединениях для обеспечения корректного поведения.
References: #4804
Добавлено еще одно исправление проблемы, связанной с тем, что в MySQL 8 имя таблицы, чувствительное к регистру, некорректно отражается в отражении ограничений внешнего ключа. Это продолжение исправления, впервые добавленного для #4344, которое касалось имени столбца, чувствительного к регистру. Новая проблема возникает в MySQL 8.0.17, поэтому общая логика исправления 88718 остается прежней.
См.также
https://bugs.mysql.com/bug.php?id=96365 - ошибка в восходящем потоке
References: #4751
sqlite¶
Диалекты, поддерживающие json, должны принимать аргументы
json_serializer
иjson_deserializer
на уровне create_engine(), однако диалект SQLite называет их_json_serializer
и_json_deserilalizer
. Имена были исправлены, старые имена принимаются с предупреждением об изменении, и теперь эти параметры документируются какcreate_engine.json_serializer
иcreate_engine.json_deserializer
.References: #4798
Исправлена ошибка, при которой использование «PRAGMA table_info» в диалекте SQLite приводило к тому, что функции отражения для определения существования таблицы, списка столбцов таблицы и списка внешних ключей по умолчанию использовали любую таблицу в любой подключенной базе данных, если имя схемы не было задано и таблица не существовала в базовой схеме. Исправление явно запускает PRAGMA для «основной» схемы, а затем для «временной» схемы, если «основная» не вернула ни одной строки, чтобы сохранить поведение таблиц + временных таблиц в пространстве имен «без схемы», а присоединенных таблиц - только в пространстве имен «схема».
References: #4793
mssql¶
Добавлена новая конструкция
try_cast()
для SQL Server, которая использует синтаксис «TRY_CAST». Pull request любезно предоставлен Leonel Atencio.References: #4782
misc¶
Исправлена проблема в системе событий, когда использование флага
once=True
с динамически генерируемыми функциями-слушателями приводило к сбою регистрации будущих событий, если эти функции-слушатели после их использования собирали мусор, из-за предположения, что на функцию-слушатель есть сильная ссылка. Обертка «once» теперь модифицирована таким образом, чтобы внутренние функции ссылались на нее постоянно, а также обновлена документация, в которой указано, что использование «once» не означает автоматической отмены регистрации функций-слушателей.References: #4794
1.3.6¶
Released: July 21, 2019orm¶
Добавлен новый метод опций загрузчика
Load.options()
, который позволяет строить опции загрузчика иерархически, так что к определенному пути можно применить множество под-опций без необходимости многократного вызоваdefaultload()
. Спасибо Алессио Богону за идею.References: #4736
Оптимизация, примененная к загрузке селектинов в #4340, где для ускоренной загрузки связанных элементов не требуется JOIN, теперь применяется и к отношениям «многие-к-одному», так что для простого условия объединения запрашивается только связанная таблица. В этом случае связанные элементы запрашиваются на основе значения столбца внешнего ключа родительского объекта; если эти столбцы отложены или иным образом не загружены ни в одном из родительских объектов коллекции, загрузчик возвращается к методу JOIN.
References: #4775
Исправлена регрессия, вызванная #4365, когда при соединении сущности с самой собой без использования псевдонимов больше не выдавалось информативное сообщение об ошибке, а вместо этого происходил сбой в утверждении. Состояние информативной ошибки восстановлено.
References: #4773
Исправлена проблема, при которой метод
_ORMJoin.join()
, являющийся не используемым внутри ORM-уровня методом, раскрывающим то, что обычно является внутренним процессомQuery.join()
, некорректно распространял аргументы ключевых словfull
иouterjoin
. Pull request любезно предоставлен Денисом Катаевым.References: #4713
Исправлена ошибка, из-за которой отношения «многие-к-одному», в которых указывалось
uselist=True
, не обновлялись корректно при изменении первичного ключа, когда необходимо было изменить связанный столбец.References: #4772
Исправлена ошибка, при которой обнаружение использования отношений «многие-к-одному» или «один-к-одному» с «динамическими» отношениями, что является недопустимой конфигурацией, не приводило к предупреждению, если отношения были настроены на
uselist=True
. В настоящее время вместо предупреждения выдается предупреждение, так как в противном случае это было бы несовместимо с обратным ходом событий, однако в будущем выпуске это станет предупреждением.References: #4772
Исправлена ошибка, при которой синоним, созданный для еще не существующего отображенного атрибута, как это бывает, когда он ссылается на backref до настройки отображателей, вызывал ошибки рекурсии при попытке проверить наличие у него атрибутов, которые в итоге не существуют (как это происходит при запуске классов через Sphinx autodoc), так как ненастроенное состояние синонима приводило его в цикл attribute not found.
References: #4767
engine¶
Исправлена ошибка, при которой использование функции отражения
MetaData.reflect()
с объектомEngine
, к которому были применены опции выполнения, приводило к неудаче, поскольку полученный объектOptionEngine
proxy не включал атрибут.engine
, используемый в процедуре отражения.References: #4754
sql¶
Скорректирована инициализация для
Enum
, чтобы минимизировать частоту обращения к атрибуту.__members__
данного объекта перечисления PEP-435, для случая, когда обращение к этому атрибуту требует больших затрат, как в некоторых популярных сторонних библиотеках перечислений.References: #4758
Исправлена проблема, при которой конструкция
array_agg
в комбинации сFunctionElement.filter()
не давала правильного предшествования операторов в комбинации с оператором индекса массива.References: #4760
Исправлена маловероятная проблема, когда процедура «соответствующий столбец» для объединений и других объектов
_selectable.CompoundSelect
могла возвращать неправильный столбец в некоторых ситуациях с перекрывающимися столбцами, что могло повлиять на некоторые операции ORM при использовании операций set, если базовые конструкцииselect()
использовались ранее в других подобных процедурах, из-за того, что не было очищено кэшированное значение.References: #4747
postgresql¶
Добавлена поддержка отражения индексов на разделенных таблицах PostgreSQL, которая была добавлена в PostgreSQL начиная с версии 11.
References: #4771
Добавлена поддержка литералов многомерных массивов Postgresql путем вложения объекта
array
внутрь другого объекта. Тип многомерного массива определяется автоматически.См.также
References: #4756
mysql¶
Исправлена ошибка, при которой специальная логика отображения «NULL» для типа данных
TIMESTAMP
приnullable=True
не работала, если тип данных столбца былTypeDecorator
илиVariant
. Теперь логика обеспечивает разворачивание до исходногоTIMESTAMP
, чтобы это ключевое слово NULL в особом случае корректно отображалось при запросе.References: #4743
Усовершенствован разбор строк версий MySQL/MariaDB для учета экзотических строк версий MariaDB, в которых слово «MariaDB» вписано среди других буквенно-цифровых символов, например, «MariaDBV1». Это обнаружение необходимо для корректной работы с функциями API, которые разделились между MySQL и MariaDB, например, системной переменной «transaction_isolation».
References: #4624
sqlite¶
Добавлена поддержка составных (кортежных) операторов IN с SQLite, за счет рендеринга ключевого слова VALUES для этого бэкенда. Поскольку известно, что другие бэкенды, такие как DB2, используют аналогичный синтаксис, он включен в базовый компилятор с помощью флага диалектного уровня
tuple_in_values
. Изменение также включает поддержку выражений «пустой кортеж IN» для SQLite при использовании «in_()» между значением кортежа и пустым множеством.References: #4766
mssql¶
Убедились, что в запросах, используемых для отражения индексов и определений представлений, строковые параметры будут явно CAST в NVARCHAR, поскольку многие драйверы SQL Server часто рассматривают строковые значения, особенно те, которые содержат неаскриптивные символы или большие строковые значения, как TEXT, которые часто по какой-то причине некорректно сравниваются с символами VARCHAR в таблицах информационных схем SQL Server. Эти операции CAST уже выполняются при отражении запросов к таблицам SQL Server
information_schema.
, но отсутствовали в трех дополнительных запросах к таблицамsys.
.References: #4745
1.3.5¶
Released: June 17, 2019orm¶
Исправлена серия ошибок, связанных с наследованием объединенных таблиц на глубине более двух уровней в сочетании с изменением значений первичных ключей, когда столбцы первичных ключей также связаны между собой отношениями внешнего ключа, что характерно для наследования объединенных таблиц. Промежуточная таблица в трехуровневой иерархии наследования теперь получит UPDATE, если изменилось только значение первичного ключа и passive_updates=False (например, ограничения внешнего ключа не выполняются), тогда как раньше она пропускалась; аналогично, при passive_updates=True (например, действует ON UPDATE CASCADE) таблица третьего уровня не получит оператора UPDATE, как это было ранее, что привело бы к неудаче, поскольку CASCADE уже изменил ее. В связи с этим отношение, связанное с трехуровневой иерархией наследования по первичному ключу промежуточной таблицы объединенной иерархии наследования, также будет корректно обновлять свой столбец внешнего ключа при изменении первичного ключа родительского объекта, даже если этот родительский объект является подклассом связанного родительского класса, тогда как раньше такие классы не учитывались.
References: #4723
Исправлена ошибка, при которой аксессор
Mapper.all_orm_descriptors
возвращал запись для самогоMapper
под декларативным ключом__mapper__
, когда это не являлось дескриптором. Теперь используется флаг.is_attribute
, присутствующий на всех объектахInspectionAttr
, который также был изменен наTrue
для ассоциативного прокси, так как для этого объекта он ошибочно был установлен в False.References: #4729
Исправлена ошибка в
Query.join()
, при которой флагaliased=True
не мог правильно применить адаптацию клаузы к критериям фильтрации, если предыдущее присоединение было выполнено к той же сущности. Это происходило из-за того, что адаптеры располагались в неправильном порядке. Порядок был изменен таким образом, что приоритет имеет адаптер для самого последнего вызоваaliased=True
, как это было в версии 1.2 и более ранних. Это, в частности, привело к поломке примеров «elementtree».References: #4704
Заменена подпрограмма совместимости с Python для функции
getfullargspec()
на полностью вендорную версию из Python 3.3. Первоначально Python выдавал предупреждения об устаревании этой функции в альфа-версии Python 3.8. Хотя это изменение было отменено, было замечено, что реализации Python 3 дляgetfullargspec()
на порядок медленнее, чем в серии 3.4, где она была переписана наSignature
. Хотя Python планирует улучшить эту ситуацию, в проектах SQLAlchemy пока используется простая замена, чтобы избежать проблем в будущем.References: #4674
Переработана механика атрибутов, используемая
AliasedClass
, чтобы больше не полагаться на вызов__getattribute__
на MRO обернутого класса, а вместо этого разрешать атрибут обычно на обернутом классе с помощью getattr(), а затем разворачивать/адаптировать его. Это позволяет использовать более широкий спектр стилей атрибутов в сопоставленном классе, включая специальные схемы__getattr__()
, но при этом упрощает код и делает его более устойчивым в целом.References: #4694
sql¶
Исправлена серия проблем с цитированием, связанных с конструкцией
literal_column()
, которая при «передаче» через подзапрос метки, совпадающей с ее текстом, не применяла правила кавычек, даже если строкаLabel
была задана как конструкцияquoted_name
. Неприменение кавычек к текстуLabel
является ошибкой, поскольку этот текст является строго именем SQL-идентификатора, а не SQL-выражением, и строка не должна иметь встроенных в нее кавычек, в отличие отliteral_column()
, к которому она может быть применена. Существующее поведение, при котором немаркированныйliteral_column()
распространяется как есть вне подзапроса, сохраняется для того, чтобы помочь при использовании ручных схем кавычек, хотя в любом случае неясно, может ли быть сгенерирован корректный SQL для такой конструкции.References: #4730
postgresql¶
Добавлена поддержка флагов сортировки столбцов при отражении индексов для PostgreSQL, включая ASC, DESC, NULLSFIRST, NULLSLAST. Также эта возможность добавлена в систему отражения в целом, что может быть применено к другим диалектам в будущих релизах. Pull request любезно предоставлен Eli Collins.
References: #4717
Исправлена ошибка, при которой диалект PostgreSQL не мог корректно отразить тип данных ENUM, не имеющий членов, возвращая список с
None
для вызоваget_enums()
и вызывая ошибку TypeError при отражении столбца с таким типом данных. Теперь проверка возвращает пустой список.References: #4701
mysql¶
Исправлена ошибка, при которой MySQL ON DUPLICATE KEY UPDATE не принимал установку столбца в значение NULL. Pull request любезно предоставлен Лукашем Баничем (Lukáš Banič).
References: #4715
1.3.4¶
Released: May 27, 2019orm¶
Исправлена проблема, при которой флаг
AttributeEvents.active_history
не устанавливался для слушателя событий, которые распространялись на подкласс через флагAttributeEvents.propagate
. Эта ошибка присутствовала на протяжении всего времени существования системыAttributeEvents
.References: #4695
Исправлена ошибка, из-за которой новая система ассоциативных прокси не проксировала гибридные атрибуты, когда они использовали декоратор
@hybrid_property.expression
для возврата альтернативного SQL-выражения, или когда гибрид возвращал произвольноеPropComparator
на уровне выражения. Это потребовало дальнейшего обобщения эвристики, используемой для определения типа проксируемого объекта на уровнеQueryableAttribute
, чтобы лучше определять, служит ли дескриптор в конечном итоге отображаемым классам или выражениям столбцов.References: #4690
Применение мьютекса «configure mutex» к декларативному процессу отображения классов защищает от гонки, которая может возникнуть при использовании отображения, когда схемы динамического импорта модулей еще находятся в процессе конфигурирования отображения для связанных классов. Это не защищает от всех возможных условий гонки, например, если одновременный импорт еще не встретился с зависимыми классами, но защищает от максимально возможного в рамках декларативного процесса SQLAlchemy.
References: #4686
Теперь выдается предупреждение для случая, когда переходный объект объединяется в сессию с
Session.merge()
, когда этот объект уже является переходным вSession
. Это предупреждает для случая, когда объект обычно вставляется дважды.References: #4647
Исправлена регрессия в новой логике сравнения отношений m2o, впервые представленной в Улучшение поведения выражений запросов типа «многие к одному, при сравнении с атрибутом, который сохраняется как NULL и находится в незафиксированном состоянии в сопоставленном экземпляре. Поскольку атрибут не имеет явного значения по умолчанию, при постоянном обращении к нему необходимо установить значение NULL.
References: #4676
engine¶
Переместили «откат», который происходит во время инициализации диалекта, так, чтобы он происходил после дополнительных шагов инициализации, специфичных для диалекта, в частности, для диалекта psycopg2, который непреднамеренно оставляет транзакционное состояние при первом новом соединении, что может помешать работе некоторых API, специфичных для psycopg2, которые требуют, чтобы транзакция не начиналась. Pull request любезно предоставлен Мэтью Уилксом.
References: #4663
sql¶
Исправлено, что класс
GenericFunction
случайно регистрировал себя в качестве одной из именованных функций. Pull request любезно предоставлен Adrien Berchet.References: #4653
Исправлена проблема, при которой двойное отрицание в булевом столбце не сбрасывало оператор «NOT».
References: #4618
Пространство имен
GenericFunction
переносится таким образом, чтобы поиск имен функций осуществлялся без учета регистра, поскольку функции SQL не сталкиваются при различии регистра, равно как и при использовании пользовательских функций или хранимых процедур. Поиск функций, объявленных с помощьюGenericFunction
, теперь осуществляется без учета регистра, однако поддерживается вариант, допускающий существование двух или более объектовGenericFunction
с одним и тем же именем в разных регистрах, что приведет к поиску с учетом регистра для данного имени, при этом при регистрации функции будет выдаваться предупреждение. Спасибо Адриану Берше за большую работу над этой сложной функцией.References: #4569
postgresql¶
Исправлена проблема, при которой предупреждение «number of rows matched» выдавалось, даже если диалект сообщал «supports_sane_multi_rowcount=False», как в случае psycogp2 с
use_batch_mode=True
и других.References: #4661
mysql¶
Добавлена поддержка ограничения DROP CHECK, которое требуется в MySQL 8.0.16 для снятия ограничения CHECK; MariaDB поддерживает простое DROP CONSTRAINT. Логика различает эти два синтаксиса, проверяя строку версии сервера на наличие MariaDB. Alembic migrations уже обошел эту проблему, реализовав собственный DROP для ограничений MySQL / MariaDB CHECK, однако данное изменение реализует его непосредственно в Core, чтобы он был доступен для общего использования. Pull request любезно предоставлен Ханнесом Хансеном (Hannes Hansen).
References: #4650
mssql¶
Добавлена поддержка фильтрованных индексов SQL Server с помощью параметра
mssql_where
, который работает аналогично функцииpostgresql_where
index в диалекте PostgreSQL.См.также
References: #4657
Добавлен код ошибки 20047 в «is_disconnect» для pymssql. Pull request любезно предоставлен Jon Schuff.
References: #4680
misc¶
Удален ошибочный символ «sqla_nose.py» из MANIFEST.in, который приводил к появлению нежелательного предупреждения.
References: #4625
1.3.3¶
Released: April 15, 2019orm¶
Исправлена ошибка 1.3 в новой логике запросов «неоднозначные FROM», введенной в Query.join() более явно обрабатывает неоднозначность в определении «левой» стороны, когда
Query
, явно помещающий сущность в предложение FROM с помощьюQuery.select_from()
, а также присоединяющийся к ней с помощьюQuery.join()
, впоследствии вызывал ошибку «неоднозначный FROM», если эта сущность использовалась в дополнительных присоединениях, поскольку сущность дважды появлялась в списке «from» вQuery
. Исправление устраняет эту двусмысленность, сворачивая отдельную сущность в соединение, частью которого она уже является, тем же способом, который в конечном итоге происходит при выводе оператора SELECT.References: #4584
Скорректирован метод
Query.filter_by()
, который не вызывает внутри себяand()
по нескольким критериям, а передает его вQuery.filter()
как серию критериев, а не один критерий. Это позволяетQuery.filter_by()
перейти к обработке переменного числа клаузул вQuery.filter()
, включая случай, когда список пуст. В этом случае объектQuery
не будет иметь.whereclause
, что позволяет последующим методам «no whereclause», таким какQuery.select_from()
, вести себя последовательно.References: #4606
postgresql¶
Исправлена регрессия из релиза 1.3.2, связанная с использованием #4562, когда URL, содержащий только строку запроса и не имеющий имени хоста, например, для указания служебного файла с информацией о соединении, переставал корректно передаваться в psycopg2. Изменение в #4562 было скорректировано в соответствии с требованиями psycopg2, согласно которым при наличии каких-либо параметров подключения параметр «dsn» больше не требуется, поэтому в данном случае передаются только параметры строки запроса.
References: #4601
mssql¶
Исправлена проблема в диалекте SQL Server, когда при наличии связанного параметра в выражении ORDER BY, который в конечном итоге не отображался в версии оператора SQL Server, параметры все равно становились частью параметров выполнения, что приводило к ошибкам на уровне DBAPI. Pull request любезно предоставлен Matt Lewellyn.
References: #4587
misc¶
Исправлена поведенческая регрессия, возникшая в результате отмены флага «use_threadlocal» для
Pool
, когдаSingletonThreadPool
больше не использует эту опцию, что приводит к логике «отката при возврате», когда один и тот жеEngine
используется несколько раз в контексте транзакции для подключения или неявного выполнения, тем самым отменяя транзакцию. Хотя такой способ работы с движками и соединениями не рекомендуется, он, тем не менее, является непонятным изменением поведения, поскольку при использованииSingletonThreadPool
транзакция должна оставаться открытой независимо от того, что еще делается с тем же движком в том же потоке. Флагuse_threadlocal
остается устаревшим, однако флагSingletonThreadPool
теперь реализует свою собственную версию той же логики.References: #4585
Исправлена ошибка, при которой использование
copy.copy()
илиcopy.deepcopy()
наMutableList
приводило к дублированию элементов в списке, что связано с несоответствием того, как Python pickle и copy используют__getstate__()
и__setstate__()
в отношении списков. Для решения этой проблемы необходимо было добавить метод__reduce_ex__
вMutableList
. Для сохранения обратной совместимости с существующими pickle, основанными на__getstate__()
, метод__setstate__()
также остался; тестовый набор утверждает, что pickle, созданные с использованием старой версии класса, по-прежнему могут быть десериализованы модулем pickle.References: #4603
1.3.2¶
Released: April 2, 2019orm¶
Восстановлена поддержка на уровне экземпляра простых дескрипторов Python, например, объектов
@property
, в сочетании с прокси ассоциаций, причем если проксируемый объект вообще не входит в область видимости ORM, то он классифицируется как «неоднозначный», но проксируется напрямую. Для доступа на уровне класса, базовый уровень класса``__get__()`` теперь возвращаетAmbiguousAssociationProxyInstance
напрямую, а не поднимает исключение, что является наиболее близким приближением к предыдущему поведению, которое возвращало самAssociationProxy
, насколько это возможно. Кроме того, улучшена структуризация этих объектов, чтобы они лучше описывали текущее состояние.Исправлена ошибка, при которой использование
with_polymorphic()
или другой псевдослужебной конструкции не адаптировалось должным образом, если псевдослужебная цель использовалась в качествеSelect.correlate_except()
цели подзапроса, используемого внутриcolumn_property()
. Это потребовало исправления механики адаптации клаузы для корректной работы с selectable, который отображается в списке «correlate except», аналогично тому, как это происходит с selectables, которые отображаются в списке «correlate». В конечном счете, это достаточно фундаментальная ошибка, которая существует уже давно, но с ней трудно столкнуться.References: #4537
Исправлена ошибка, при которой при попытке связать опцию отношения с AliasedClass без использования
PropComparator.of_type()
вместо этого выдавалось сообщение об ошибкеAttributeError
. Обратите внимание, что в версии 1.3 больше нельзя создавать путь к опции от простого отношения mapper кAliasedClass
без использованияPropComparator.of_type()
.References: #4566
sql¶
Благодаря Методы TypeEngine bind_expression, column_expression работают с Variant, типами-спецификами нам больше не нужно полагаться на рецепты, которые напрямую подклассифицируют диалектные типы,
TypeDecorator
теперь может справиться со всеми случаями. Кроме того, благодаря этому изменению несколько снизилась вероятность того, что прямой подкласс базового типа SQLAlchemy будет работать так, как ожидается, что могло бы ввести в заблуждение. Документация была обновлена, чтобы использоватьTypeDecorator
для этих примеров, включая пример типа данных PostgreSQL «ArrayOfEnum», а прямая поддержка «подкласса типа напрямую» была удалена.References: #4580
postgresql¶
Добавлена поддержка URL без параметров для диалекта psycopg2, т.е. URL может быть передан в
create_engine()
как"postgresql+psycopg2://"
без дополнительных аргументов для обозначения пустого DSN, передаваемого в libpq, который указывает на подключение к «localhost» без указания имени пользователя, пароля или базы данных. Pull request любезно предоставлен Julian Mehnle.References: #4562
Изменен параметр
Select.with_for_update.of
таким образом, что если передается join или другой составной selectable, то отдельные объектыTable
будут отфильтровываться из него, что позволяет передавать в параметр объект join(), как это обычно происходит при использовании наследования объединенных таблиц с помощью ORM. Pull request любезно предоставлен Raymond Lu.References: #4550
1.3.1¶
Released: March 9, 2019orm¶
Исправлена ошибка, при которой ассоциативный прокси, связанный с синонимом, переставал работать как на уровне экземпляра, так и на уровне класса.
References: #4522
mssql¶
После изменения уровня изоляции на SNAPSHOT выполняется commit(), поскольку и pyodbc, и pymssql открывают неявную транзакцию, которая блокирует выполнение последующих SQL в текущей транзакции.
This change is also backported to: 1.2.19
References: #4536
Исправлена регрессия в отражении SQL Server, связанная с #4393, когда удаление открытого
**kw
из типа данныхFloat
приводило к тому, что отражение этого типа не выполнялось из-за передачи аргумента «scale».References: #4525
1.3.0¶
Released: March 4, 2019orm¶
Метод
Query.get()
теперь может принимать словарь ключей и значений атрибутов в качестве средства указания значения первичного ключа для загрузки; это особенно полезно для составных первичных ключей. Pull request любезно предоставлен Sanjana S.References: #4316
Теперь SQL-выражение может быть присвоено атрибуту первичного ключа ORM flush таким же образом, как и обычные атрибуты, как описано в Встраивание выражений вставки/обновления SQL в промывку, где выражение будет оценено и затем возвращено в ORM с помощью RETURNING, или, в случае pysqlite, работает с помощью атрибута cursor.lastrowid. Требуется либо база данных, поддерживающая RETURNING (например, Postgresql, Oracle, SQL Server), либо pysqlite.
References: #3133
engine¶
Изменено форматирование для
StatementError
в строковом виде. Каждая деталь ошибки разбивается на несколько новых строк, а не выводится в одной строке. Кроме того, в SQL-представлении теперь строка SQL-оператора строится вместоrepr()
, так что новые строки отображаются как есть. Pull request любезно предоставлен Нейтом Кларком.References: #4500
sql¶
Класс
Alias
и связанные с ним подклассыCTE
,Lateral
иTableSample
были переработаны таким образом, чтобы исключить возможность непосредственного конструирования объектов пользователем. Эти конструкции требуют использования для инстанцирования новых объектов автономной функции конструирования или метода selectable-bound.References: #4509
schema¶
Добавлены новые параметры
Table.resolve_fks
иMetaData.reflect.resolve_fks
, которые при установке значения False отключают автоматическое отражение связанных таблиц, встречающихся в объектахForeignKey
, что позволяет как уменьшить накладные расходы на SQL для опущенных таблиц, так и избежать таблиц, которые не могут быть отражены по специфическим для базы данных причинам. Два объектаTable
, находящиеся в одной коллекцииMetaData
, могут ссылаться друг на друга, даже если отражение двух таблиц происходило отдельно.References: #4517
1.3.0b3¶
Released: February 8, 2019orm¶
Улучшено поведение
with_polymorphic()
в сочетании с опциями загрузчика, в частности, с операциями подстановочных знаков, а также сload_only()
. Полиморфный объект будет более точно нацелен на то, чтобы опции уровня столбца сущности корректно вступали в силу. Проблема является продолжением тех же вещей, которые были исправлены в #4468.References: #4469
orm declarative¶
Добавлены вспомогательные исключения, вызываемые при использовании отображения, основанного на
AbstractConcreteBase
,DeferredReflection
илиAutoMap
, до того, как отображение будет готово к использованию, которые содержат описательную информацию о классе, а не переходят в другие режимы отказа, менее информативные.References: #4470
sql¶
Полностью устранено поведение, при котором строки, переданные непосредственно в качестве компонентов объекта
select()
илиQuery
, автоматически приводились к конструкциямtext()
; теперь предупреждение выдается в виде ArgumentError или, в случае order_by() / group_by(), в виде CompileError. Предупреждение об этом выдается с версии 1.0, однако его наличие продолжает вызывать опасения по поводу возможности неправильного использования такого поведения.Обратите внимание, что для order_by() / group_by() были опубликованы публичные CVE, которые устранены данным фиксатором: CVE-2019-7164 CVE-2019-7548
References: #4481
Кавычки применяются к именам
Function
, которые обычно, но не обязательно, генерируются из конструкцииsqlalchemy.sql.expression.func
, во время компиляции, если они содержат недопустимые символы, такие как пробелы или знаки препинания. При этом имена, как и раньше, считаются нечувствительными к регистру, т.е. если они содержат символы прописного или смешанного регистра, то это само по себе не приводит к кавычкам. В настоящее время нечувствительность к регистру сохраняется для обратной совместимости.References: #4467
Добавлена «проверка SQL-фразы» для ключевых DDL-фраз, которые принимаются как обычные строки, включая
ForeignKeyConstraint.on_delete
,ForeignKeyConstraint.on_update
,ExcludeConstraint.using
,ForeignKeyConstraint.initially
, для областей, где ожидается только серия SQL-ключевых слов. Любые непробельные символы, указывающие на то, что фразу необходимо заключить в кавычки, будут вызывать ошибкуCompileError
. Это изменение связано с серией изменений, внесенных в рамках #4481.References: #4481
postgresql¶
Исправлена проблема, когда при использовании имени типа индекса (например, GIST, BTREE и т.д.) или ограничения EXCLUDE в верхнем регистре оно воспринималось как идентификатор, который необходимо взять в кавычки, а не отображалось как есть. Новое поведение преобразует эти типы в нижний регистр и гарантирует, что они содержат только допустимые символы SQL.
References: #4473
tests¶
В тестовой системе удалена поддержка Nose, который не поддерживается уже несколько лет и выдает предупреждения под Python 3. В настоящее время набор тестов стандартизирован на Pytest. Pull request любезно предоставлен Parth Shandilya.
References: #4460
misc¶
Реализована более полная операция присваивания (например, «массовая замена») при использовании ассоциативных прокси с наборами или словарями. Устранена проблема создания избыточных прокси-объектов взамен старых, что приводило к избыточным событиям и SQL, а в случае уникальных ограничений приводило к отказу в работе flush.
References: #2642
1.3.0b2¶
Released: January 25, 2019general¶
``DeprecationWarning``Так как интерпретатор Python 3 по умолчанию отображает предупреждения об устаревании, а современные наборы тестов, основанные на таких инструментах, как tox и pytest, обычно отображают предупреждения об устаревании, это изменение должно облегчить выявление устаревших функций API. Основное обоснование этого изменения заключается в том, что давно устаревшие функции, которые, тем не менее, продолжают использоваться в реальной жизни, могут быть, наконец, удалены в ближайшем будущем; наиболее ярким примером этого являются классы
SessionExtension
иMapperExtension
, а также несколько других хуков расширения preevent, которые были устаревшими с версии 0.7, но все еще остаются в библиотеке. Кроме того, планируется отменить несколько основных давно существующих моделей поведения, в том числе стратегию потокового локального движка, флаг convert_unicode и непервичные мапперы.References: #4393
orm¶
Реализована новая возможность: теперь конструкция
AliasedClass
может быть использована в качестве цели конструкцииrelationship()
. Это позволяет отказаться от концепции «непервичных отображателей», так какAliasedClass
гораздо проще настраивается и автоматически наследует все отношения отображаемого класса, а также сохраняет возможность нормальной работы опций загрузчика.References: #4423
Добавлено новое событие
MapperEvents.before_mapper_configured()
. Это событие дополняет другие события маппера этапа «configure» событием для каждого маппера, которое получает каждыйMapper
непосредственно перед его шагом configure, и дополнительно может быть использовано для предотвращения или задержки конфигурирования определенныхMapper
объектов с помощью нового возвращаемого значенияinterfaces.EXT_SKIP
. Пример см. по ссылке в документации.References: #4397
Добавлена новая функция
close_all_sessions()
, которая берет на себя задачу методаSession.close_all()
, который теперь устарел, так как является непонятным методом класса. Pull request любезно предоставлен Augustin Trancart.References: #4412
Исправлена давняя проблема, когда дублирование членов коллекции приводило к тому, что при удалении одного из дубликатов обратная ссылка удаляла ассоциацию между членом и его родительским объектом, что являлось побочным эффектом замены двух объектов в одном операторе.
См.также
Проверка обратных ссылок «многие-к-одному» на наличие дубликатов коллекций при операции удаления
References: #1103
Расширение исправления, впервые сделанного в #3287, когда опция загрузчика, сделанная для подкласса с использованием подстановочного знака, распространялась на применение подстановочного знака и к атрибутам суперклассов, до «связанной» опции загрузчика, например, в выражении
Load(SomeSubClass).load_only('foo')
. Столбцы, входящие в родительский классSomeSubClass
, также будут исключены так же, как и при использовании несвязанной опцииload_only('foo')
.References: #4373
Улучшены сообщения об ошибках, выдаваемые ORM в области обхода опций загрузчика. Это включает раннее обнаружение несовпадающих стратегий загрузчика и более четкое объяснение причин несовпадения этих стратегий.
References: #4433
Событие «remove» для коллекций теперь вызывается до удаления элемента в случае метода
collection.remove()
, что соответствует поведению для большинства других форм удаления элементов коллекции (таких как__delitem__
, замена при__setitem__
). Для методовpop()
событие remove по-прежнему срабатывает после выполнения операции.В Core и ORM добавлены аксессоры для опций выполнения через
Query.get_execution_options()
,Connection.get_execution_options()
,Engine.get_execution_options()
иExecutable.get_execution_options()
. PR любезно предоставлен Дэниелом Листером.References: #4464
Исправлена проблема в ассоциативном прокси, связанная с #3423, из-за которой использование пользовательских объектов
PropComparator
с гибридными атрибутами, как в примереdictlike-polymorphic
, не работало в ассоциативном прокси. Строгость, которая была добавлена в #3423, была ослаблена, и добавлена дополнительная логика для учета ассоциативного прокси, связанного с пользовательским гибридом.References: #4446
Реализован метод
.get_history()
, предполагающий также наличиеAttributeState.history
, для атрибутовsynonym()
. Ранее попытка получить доступ к истории атрибутов через синоним приводила к появлению ошибкиAttributeError
.References: #3777
orm declarative¶
В
ColumnProperty
добавлен метод__clause_element__()
, который может позволить использовать не полностью объявленный столбец или отложенный атрибут в декларативном сопоставленном классе несколько более дружелюбно, когда он используется в ограничении или другом ориентированном на столбец сценарии внутри объявления класса, хотя это все еще не может работать в открытых выражениях; лучше вызывать атрибутColumnProperty.expression
при полученииTypeError
.References: #4372
engine¶
Добавлен публичный аксессор
QueuePool.timeout()
, возвращающий настроенный таймаут для объектаQueuePool
. Pull request любезно предоставлен Ириной Деламаре.References: #3689
Стратегия движка «threadlocal», унаследованная от SQLAlchemy примерно с версии 0.2, теперь устарела, как и параметр
Pool.threadlocal
Pool
, который не имеет никакого значения в большинстве современных случаев использования.References: #4393
sql¶
Внесены изменения в класс
AnsiFunction
, являющийся основой таких распространенных SQL-функций, какCURRENT_TIMESTAMP
, чтобы он принимал позиционные аргументы как обычная специальная функция. Это сделано для того, чтобы многие из этих функций на специфических бэкендах принимали аргументы типа точности «дробные секунды» и т.п. Если функция создана с аргументами, то она выводит скобки и аргументы. Если аргументы отсутствуют, то компилятор генерирует непарентезированную форму.References: #4386
Параметры
create_engine.convert_unicode
иString.convert_unicode
устарели. Эти параметры были созданы в те времена, когда большинство Python DBAPI практически не поддерживали объекты Python Unicode, и SQLAlchemy приходилось брать на себя очень сложную задачу маршалинга данных и строк SQL между Unicode и байтстрингами в системе с высокой производительностью. Благодаря Python 3, DBAPI были вынуждены адаптироваться к Unicode-aware API, и сегодня все DBAPI, поддерживаемые SQLAlchemy, поддерживают Unicode нативно, в том числе и на Python 2, что позволило наконец-то (в основном) избавиться от этой давней и очень сложной особенности. Конечно, в Python 2 все еще остается несколько крайних случаев, когда SQLAlchemy приходится иметь дело с Unicode, но они обрабатываются автоматически; в современном использовании не должно быть необходимости во взаимодействии конечного пользователя с этими флагами.См.также
References: #4393
mssql¶
Для типов данных
literal_processor
дляUnicode
иUnicodeText
теперь перед литеральным строковым выражением выводится символN
, как того требует SQL Server для строковых значений Unicode, выводимых в SQL-выражениях.References: #4442
misc¶
В версии 1.3.0b1 исправлена ошибка #3423, из-за которой объекты прокси ассоциации, обращающиеся к атрибуту, который присутствует только в полиморфном подклассе, вызывали ошибку
AttributeError
, даже если реальный экземпляр, к которому осуществляется обращение, являлся экземпляром этого подкласса.References: #4401
1.3.0b1¶
Released: November 16, 2018orm¶
Добавлена новая функция
Query.only_return_tuples()
. Приводит к тому, что объектQuery
возвращает объекты кортежей с ключами безусловно, даже если запрос выполняется к одной сущности. Pull request любезно предоставлен Эриком Аткиным.This change is also backported to: 1.2.5
В метод
Session.bulk_save_objects()
добавлен новый флагSession.bulk_save_objects.preserve_order
, который по умолчанию принимает значение True. При значении False заданные отображения будут сгруппированы на вставки и обновления по каждому типу объектов, что позволит расширить возможности пакетной обработки общих операций. Pull request любезно предоставлен Alessandro Cucci.Стратегия загрузчика «selectin» теперь не использует JOIN в случае простой загрузки «один ко многим», а загружает данные только из связанной таблицы, полагаясь на столбцы внешних ключей связанной таблицы, чтобы они совпадали с первичными ключами родительской таблицы. Эту оптимизацию можно отключить, установив флаг
relationship.omit_join
в значение False. Большое спасибо Джейсону Рейсу за проделанную работу.References: #4340
В класс
InstanceState
добавлен словарь.info
- объект, получаемый при вызовеinspect()
на сопоставленном объекте.References: #4257
Исправлена ошибка, при которой использование конструкции
Lateral
в сочетании сQuery.join()
, а такжеQuery.select_entity_from()
не приводило к применению адаптации клаузы к правой части соединения. «Боковой» вводит случай, когда правая часть соединения является коррелируемой. Ранее адаптация этой клаузы не рассматривалась. Заметим, что только в версии 1.2 selectable, вводимый функциейQuery.subquery()
, по-прежнему не адаптируется из-за #4304; selectable должен быть произведен функциейselect()
, чтобы быть правой стороной «бокового» соединения.This change is also backported to: 1.2.12
References: #4334
Исправлена проблема, связанная с passive_deletes=»all», когда атрибут внешнего ключа объекта сохранял свое значение даже после удаления объекта из родительской коллекции. Ранее единица работы устанавливала это значение в NULL, даже если passive_deletes указывал, что его не следует изменять.
References: #3844
Улучшено поведение выражения для объектов, связанных отношениями «многие к одному», в результате чего получение значений столбцов связанного объекта теперь устойчиво к отсоединению объекта от родительского
Session
, даже если срок действия атрибута истек. Новые возможности вInstanceState
используются для запоминания последнего известного значения атрибута столбца до истечения срока его действия, так что выражение все еще может быть оценено при одновременном отсоединении и истечении срока действия объекта. Также улучшены условия возникновения ошибок с использованием современных возможностей состояния атрибутов для выдачи более специфических сообщений.References: #4359
ORM теперь удваивает предложение «FOR UPDATE» в подзапросе, который в некоторых случаях выполняется совместно с объединенной ускоренной загрузкой, так как было замечено, что MySQL не блокирует строки из подзапроса. Это означает, что запрос отображается с двумя предложениями FOR UPDATE; обратите внимание, что в некоторых бэкендах, таких как Oracle, предложения FOR UPDATE в подзапросах молча игнорируются, поскольку они не нужны. Кроме того, в случае с предложением «OF», используемым в основном в PostgreSQL, FOR UPDATE выводится только во внутреннем подзапросе, когда он используется для того, чтобы selectable мог быть направлен на таблицу в операторе SELECT.
См.также
Предложение FOR UPDATE отображается как внутри объединенного подзапроса eager load, так и вне его
References: #4246
Рефакторинг
Query.join()
для дальнейшего уточнения отдельных компонентов структурирования присоединения. Этот рефактор добавляет возможность дляQuery.join()
определять наиболее подходящую «левую» сторону соединения, если в списке FROM имеется более одного элемента или запрос выполняется к нескольким сущностям. Если совпадает более одного FROM/сущности, то выдается ошибка, требующая указать предложение ON для разрешения неоднозначности. В частности, это касается регрессии, которую мы видели в #4363, но также имеет и общее применение. Теперь кодовые пути внутриQuery.join()
стали более понятными, а случаи ошибок определяются более конкретно на более ранних этапах работы.References: #4365
Исправлена давняя проблема в
Query
, когда скалярный подзапрос, создаваемыйQuery.exists()
,Query.as_scalar()
и другими производными отQuery.statement
, некорректно адаптировался при использовании в новомQuery
, требующем адаптации сущности, например, при превращении запроса в объединение, или в from_self(), и т.д. Данное изменение удаляет аннотацию «без адаптации» из объектаselect()
, создаваемого аксессоромQuery.statement
.References: #4304
Информативное исключение возникает, когда значение первичного ключа не сортируется в Python во время ORM flush под Python 3, например,
Enum
, не имеющий метода__lt__()
; обычно Python 3 в этом случае выдаетTypeError
. Процесс flush сортирует постоянные объекты по первичному ключу в Python, поэтому значения должны быть сортируемыми.References: #4232
Удален конвертер коллекций, используемый классом
MappedCollection
. Этот конвертер использовался только для проверки соответствия входящих ключей словаря ключам соответствующих объектов и только во время операции bulk set. Конвертер может помешать работе пользовательского валидатора илиAttributeEvents.bulk_replace()
слушателя, который захочет преобразовывать входящие значения дальше. Убрана ошибкаTypeError
, которая возникала бы при несовпадении входящего ключа со значением; входящие значения при массовом присваивании будут привязываться к ключу, сгенерированному значением, а не к ключу, явно присутствующему в словаре.В целом, @converter вытеснен обработчиком событий
AttributeEvents.bulk_replace()
, добавленным в состав #3896.References: #3604
Добавлено новое поведение ленивой загрузки при получении «старого» значения many-to-one, в результате чего исключения, которые были бы вызваны либо
lazy="raise"
, либо ошибкой отсоединенной сессии, пропускаются.См.также
Замена «многие к одному» не будет подниматься для «raiseload» или отделяться для «старого» объекта
References: #4353
По давнему недосмотру ORM метод
__delete__
для отношений «многие-к-одному» был нефункционален, например, для такой операции, какdel a.b
. Теперь это реализовано и эквивалентно установке атрибута в значениеNone
.См.также
References: #4354
orm declarative¶
Исправлена ошибка, из-за которой при добавлении или удалении дополнительных атрибутов после вызова и мемоизации коллекций атрибутов отображения декларативная функция не обновляла состояние
Mapper
в части наличия атрибутов. Кроме того, теперь при удалении полностью отображаемого атрибута (например, столбца, отношения и т.д.) из класса, который в данный момент отображается, возникает ошибкаNotImplementedError
, поскольку при удалении атрибута отображатель будет работать некорректно.References: #4133
engine¶
В
QueuePool
добавлен новый режим «lifo», который обычно включается установкой флагаcreate_engine.pool_use_lifo
в значение True. Режим «lifo» означает, что то же самое соединение, которое только что было проверено, будет первым проверено снова, что позволяет очищать лишние соединения со стороны сервера в периоды, когда пул используется лишь частично. Pull request любезно предоставлен Таем Парком.
sql¶
Рефакторинг
SQLCompiler
для отображения методаSQLCompiler.group_by_clause()
, аналогичного методамSQLCompiler.order_by_clause()
иSQLCompiler.limit_clause()
, который может быть переопределен диалектами для настройки отображения GROUP BY. Pull request любезно предоставлен Samuel Chou.This change is also backported to: 1.2.13
В систему «string SQL» добавлена функция
Sequence
, которая при стрингейтинге без диалекта оператора, включающего выражение «sequence nextvalue», выводит осмысленное строковое выражение ("<next sequence value: my_sequence>"
), а не приводит к ошибке компиляции.References: #4144
Добавлены новые лексемы
column_0N_name
,column_0_N_name
и т.д., которые выводят имена / ключи / метки для всех столбцов, на которые ссылается конкретное ограничение, в виде последовательности. Для того чтобы учесть длину такого соглашения об именовании, функция автоматического усечения в компиляторе SQL теперь применяется и к именам ограничений, что позволяет создать сокращенное, детерминированное имя ограничения, которое будет применимо к целевому бэкенду без превышения лимита символов этого бэкенда.Изменения также устраняют две другие проблемы. Одна из них заключается в том, что маркер
column_0_key
был недоступен, хотя этот маркер был задокументирован, другая - в том, что маркерreferred_column_0_name
случайно приводил к отображению.key
, а не.name
столбца, если эти два значения были разными.References: #3989
Добавлена новая логика в функцию привязки параметров «расширяющийся IN», при которой, если заданный список пуст, генерируется специальное выражение «пустой набор», специфичное для различных бэкендов, что позволяет полностью динамизировать выражения IN, включая пустые выражения IN.
References: #4271
Теперь для объекта «свойства» SQLAlchemy, например, коллекции столбцов Core, поддерживается встроенная строка Python
dir()
(например,.c
),mapper.attrs
и т.д. Позволяет также работать автозаполнению iPython. Pull request любезно предоставлен Уве Корном.Добавлена новая возможность
FunctionElement.as_comparison()
, позволяющая SQL-функции выступать в качестве операции бинарного сравнения, которая может работать в рамках ORM.References: #3831
В качестве операторов сравнения добавлены операторы на основе «like», включая
ColumnOperators.startswith()
ColumnOperators.endswith()
ColumnOperators.ilike()
ColumnOperators.notilike()
и многие другие, так что все эти операторы могут быть положены в основу условия ORM «primaryjoin».References: #4302
Исправлена проблема с методами
TypeEngine.bind_expression()
иTypeEngine.column_expression()
, когда эти методы не работали, если целевой тип был частьюVariant
или другим целевым типомTypeDecorator
. Кроме того, компилятор SQL теперь обращается к реализации на уровне диалекта при отображении этих методов, так что диалекты теперь могут обеспечивать обработку встроенных типов на уровне SQL.См.также
Методы TypeEngine bind_expression, column_expression работают с Variant, типами-спецификами
References: #3981
postgresql¶
Добавлен новый PG-тип
REGCLASS
, который помогает приводить имена таблиц к значениям OID. Pull request любезно предоставлен Себастьяном Банком.This change is also backported to: 1.2.7
References: #4160
Добавлена рудиментарная поддержка отражения разделенных таблиц PostgreSQL, например, добавление relkind=“p“ в запросы на отражение, возвращающие информацию о таблице.
References: #4237
mysql¶
Добавлена поддержка синтаксиса «WITH PARSER» для CREATE FULLTEXT INDEX в MySQL, использующего аргумент ключевого слова
mysql_with_parser
. Также поддерживается рефлексия, которая позволяет использовать специальный формат комментариев MySQL для создания отчетов по этой опции. Кроме того, префиксы индексов «FULLTEXT» и «SPATIAL» теперь отражаются обратно в индексную опциюmysql_prefix
.References: #4219
Добавлена поддержка упорядочивания параметров в операторе ON DUPLICATE KEY UPDATE на MySQL, поскольку порядок параметров в предложении MySQL UPDATE имеет значение, аналогично тому, как это описано в Упорядоченные по параметрам обновления. Pull request любезно предоставлен Максимом Бублисом.
Функция «pre-ping» пула соединений теперь использует метод
ping()
для соединения DBAPI в случае mysqlclient, PyMySQL и mysql-connector-python. Pull request любезно предоставлен Максимом Бублисом.
sqlite¶
Добавлена поддержка json-функционала SQLite через новую реализацию SQLite для
JSON
,JSON
. В качестве имени типа используетсяJSON
, в соответствии с примером, найденным в собственной документации SQLite. Pull request любезно предоставлен Ilja Everilä.См.также
References: #3850
Реализовано предложение SQLite
ON CONFLICT
, понимаемое на уровне DDL, например, для ограничений primary key, unique и CHECK, а также заданное наColumn
для удовлетворения inline primary key и NOT NULL. Pull request любезно предоставлен Денисом Катаевым.References: #4360
mssql¶
В диалект SQL Server pyodbc добавлен параметр
fast_executemany=True
, позволяющий использовать одноименную новую функцию производительности pyodbc при использовании драйверов Microsoft ODBC.См.также
References: #4158
Отменено использование
Sequence
с SQL Server для влияния на «начало» и «приращение» значения IDENTITY, в пользу новых параметровmssql_identity_start
иmssql_identity_increment
, которые задают эти параметры напрямую. ПараметрыSequence
будут использованы для генерации реальногоCREATE SEQUENCE
DDL с SQL Server в одном из будущих выпусков.References: #4362
oracle¶
Добавлено новое событие, используемое в настоящее время только диалектом cx_Oracle,
DialectEvents.setiputsizes()
. Это событие передает словарь объектовBindParameter
в объекты типов, специфичных для DBAPI, которые после преобразования в имена параметров будут переданы методу cx_Oraclecursor.setinputsizes()
. Это позволяет как наблюдать за процессом setinputsizes, так и изменять поведение типов данных, передаваемых в этот метод.This change is also backported to: 1.2.9
References: #4290
Обновлены параметры, которые могут быть переданы в cx_Oracle DBAPI, с учетом всех текущих параметров, а также будущих параметров, которые еще не добавлены. Кроме того, удалены неиспользуемые параметры, которые были устаревшими в версии 1.2, а для параметра «threaded» по умолчанию установлено значение False.
References: #4369
Диалект Oracle больше не будет использовать типы данных NCHAR/NCLOB для представления общих юникодных строк или полей clob в сочетании с
Unicode
иUnicodeText
, если вcreate_engine()
не передан флагuse_nchar_for_unicode=True
- это касается поведения CREATE TABLE, а такжеsetinputsizes()
для связанных параметров. На стороне чтения в строки результатов CHAR/VARCHAR/CLOB добавлено автоматическое преобразование Unicode под Python 2, чтобы соответствовать поведению cx_Oracle под Python 3. Для снижения падения производительности под Python 2 в SQLAlchemy используются очень производительные (при наличии C-расширений) нативные Unicode-обработчики под Python 2.References: #4242
misc¶
Добавлен новый атрибут
Query.lazy_loaded_from
, который заполняется атрибутомInstanceState
, использующим данныйQuery
для ленивой загрузки отношения. Смысл этого заключается в том, что он служит подсказкой для использования функции горизонтального шардинга, так что идентификационный маркер состояния может быть использован в качестве идентификационного маркера по умолчанию для запроса в функции id_chooser().This change is also backported to: 1.2.9
References: #4243
Добавлена новая функция
BakedQuery.to_query()
, которая позволяет использовать одинBakedQuery
в качестве подзапроса внутри другогоBakedQuery
без необходимости явного обращения кSession
.References: #4318
В
AssociationProxy
теперь доступны стандартные операции сравнения столбцов, такие какColumnOperators.like()
иColumnOperators.startswith()
, когда целевым атрибутом является обычный столбец - выражение EXISTS, которое присоединяется к целевой таблице, отображается как обычно, но выражение столбца затем используется в критерии WHERE этого EXISTS. Обратите внимание, что при этом изменяется поведение метода.contains()
на прокси ассоциации, чтобы использоватьColumnOperators.contains()
при использовании для атрибута, основанного на столбце.References: #4351
В класс
ShardedQuery
в рамках расширения горизонтального шардинга добавлена поддержка массовыхQuery.update()
иQuery.delete()
. Это также добавляет дополнительный крючок расширения к методам массового обновления/удаленияQuery._execute_crud()
.References: #4196
Переработан метод
AssociationProxy
для хранения состояния, специфичного для родительского класса, в отдельном объекте, так что одинAssociationProxy
может служить для нескольких родительских классов, как это свойственно наследованию, без какой-либо двусмысленности в возвращаемом им состоянии. Для проверки состояния, специфичного для класса, добавлен новый методAssociationProxy.for_class()
.References: #3423
В настоящее время изменено поведение, при котором коллекция ассоциативных прокси сохраняла только слабую ссылку на родительский объект; теперь прокси будет сохранять сильную ссылку на родительский объект до тех пор, пока сама коллекция прокси находится в памяти, что устраняет ошибку «устаревший ассоциативный прокси». Это изменение вносится в экспериментальном порядке, чтобы проверить, не возникнут ли случаи, когда оно приведет к побочным эффектам.
References: #4268
Исправлены многочисленные проблемы, связанные с деассоциацией скалярных объектов с ассоциативным прокси. Теперь работает
del
, а также добавлен новый флагAssociationProxy.cascade_scalar_deletes
, который при установке в True указывает, что установка скалярного атрибута вNone
или удаление черезdel
также установит исходную ассоциацию вNone
.References: #4308