1.3 Changelog

1.3.25

no release date

orm

  • [orm] [bug]

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

    References: #6392

schema

  • [schema] [bug]

    Объект Table теперь выдает информативное сообщение об ошибке, если он инстанцируется без позиционной передачи хотя бы аргументов Table.name и Table.metadata. Ранее, если они передавались как аргументы ключевого слова, то объект молча не инициализировался.

    References: #6135

postgresql

  • [postgresql] [bug] [regression]

    Исправлена регрессия, вызванная #6023, когда оператор приведения PostgreSQL, применяемый к элементам внутри ARRAY при использовании psycopg2, не мог использовать правильный тип в случае, если тип данных также был встроен в экземпляр адаптера Variant.

    Кроме того, исправлена поддержка корректной выдачи CREATE TYPE при использовании Variant(ARRAY(some_schema_type)).

    References: #6182

mysql

  • [mysql] [bug] [mariadb]

    Исправления, связанные с переходом на серию MariaDB 10.6, включают несовместимые с предыдущими версиями изменения как в Python-драйвере mariadb-connector (поддерживается только в SQLAlchemy 1.4), так и в собственных клиентских библиотеках 10.6, которые автоматически используются DBAPI mysqlclient (применимо как к 1.3, так и к 1.4). Символ кодировки «utf8mb3» теперь сообщается этими клиентскими библиотеками, когда кодировка указана как «utf8», что приводит к ошибкам поиска и кодировки в диалекте MySQL, который не ожидает этого символа. Обновлены как базовая библиотека MySQL для учета этого символа utf8mb3, так и тестовый набор. Спасибо Георгу Рихтеру за поддержку.

    References: #7115, #7136

sqlite

  • [sqlite] [bug]

    Добавить примечание относительно прагм, связанных с шифрованием, для pysqlcipher, передаваемого в url.

    References: #6589

1.3.24

Released: March 30, 2021

orm

  • [orm] [bug]

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

    References: #5983

  • [orm] [bug]

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

    References: #5952

  • [orm] [bug]

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

    References: #6001

engine

  • [engine] [bug]

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

    References: #5929

schema

  • [schema] [bug]

    Исправлена ошибка, впервые появившаяся в виде некоторой комбинации #2892, #2919 и #3832, когда события присоединения для TypeDecorator удваивались по отношению к классу «impl», если «impl» также являлся SchemaType. В реальном случае любой TypeDecorator против Enum или Boolean получит удвоенный CheckConstraint при установленном флаге create_constraint=True.

    References: #6152

  • [schema] [bug] [sqlite]

    Исправлена проблема, при которой ограничение CHECK, сгенерированное с помощью Boolean или Enum, после первой компиляции не могло корректно отобразить соглашение об именовании из-за непреднамеренного изменения состояния в имени, заданном ограничению. Впервые эта проблема была обнаружена в 0.9 в исправлении проблемы #3067, и данное исправление пересматривает принятый в то время подход, который, как оказалось, был более сложным, чем требовалось.

    References: #6007

  • [schema] [bug]

    Исправлена / реализована поддержка соглашений об именовании ограничений первичного ключа, использующих в качестве части соглашения имена столбцов/ключей/etc. В частности, это включает в себя то, что объект PrimaryKeyConstraint, автоматически связанный с Table, будет обновлять свое имя по мере добавления новых объектов первичного ключа Column в таблицу, а затем и в ограничение. Теперь учитываются внутренние режимы отказов, связанные с процессом построения ограничений, включая отсутствие столбцов, отсутствие имени или наличие пустого имени.

    References: #5919

  • [schema] [bug]

    Скорректирована логика выдачи операторов DROP для объектов Sequence при сбросе нескольких таблиц таким образом, что все объекты Sequence сбрасываются после всех таблиц, даже если данный Sequence связан только с объектом Table, а не непосредственно с общим объектом MetaData. В данном случае поддерживается возможность одновременного связывания одного и того же Sequence с несколькими Table.

    References: #6071

postgresql

  • [postgresql] [bug]

    Исправлена проблема, при которой использование aggregate_order_by при определенных условиях возвращало ARRAY(NullType), что мешало объекту result корректно возвращать данные.

    References: #5989

  • [postgresql] [bug] [reflection]

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

    References: #6161

  • [postgresql] [bug] [types]

    Настроен диалект psycopg2 на выдачу явного приведения в стиле PostgreSQL для связанных параметров, содержащих элементы ARRAY. Это позволяет корректно использовать весь спектр типов данных в массивах. Диалект asyncpg уже генерировал эти внутренние касты в финальном операторе. Также реализована поддержка обновления срезов массива и специфического для PostgreSQL метода ARRAY.contains().

    References: #6023

mssql

  • [mssql] [bug] [reflection]

    Исправлена проблема с отражением SQL Server для старой версии SQL Server 2005, когда вызов sp_columns выполнялся некорректно без префикса ключевого слова EXEC. В текущей версии 1.4 этот метод не используется.

    References: #5921

1.3.23

Released: February 1, 2021

sql

  • [sql] [bug]

    Исправлена ошибка, когда при использовании метода TypeEngine.with_variant() на типе TypeDecorator не учитывались используемые диалектные отображения, из-за правила в TypeDecorator, которое вместо этого пыталось проверить цепочки экземпляров TypeDecorator.

    References: #5816

postgresql

  • [postgresql] [bug]

    Только для SQLAlchemy 1.3 файл setup.py переводит pg8000 на версию ниже 1.16.6. Версия 1.16.6 и выше поддерживается SQLAlchemy 1.4. Pull request любезно предоставлен Джузеппе Люмией.

    References: #5645

  • [postgresql] [bug]

    Исправлена проблема, при которой использование Table.to_metadata() (в 1.3 он назывался Table.tometadata()) совместно с PostgreSQL ExcludeConstraint, в котором использовались специальные выражения для столбцов, приводило к некорректному копированию.

    References: #5850

mysql

  • [mysql] [usecase]

    Приведение к FLOAT теперь поддерживается в MySQL >= (8, 0, 17) и MariaDb >= (10, 4, 5).

    References: #5808

  • [mysql] [bug] [reflection]

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

    References: #5860

  • [mysql] [bug]

    Исправлена давняя ошибка в диалекте MySQL, когда максимальная длина идентификатора 255 была слишком велика для имен всех типов ограничений, а не только индексов, которые имеют ограничение на размер 64. Поскольку соглашения об именовании метаданных могут создавать слишком длинные имена в этой области, примените ограничение к генератору идентификаторов в компиляторе DDL.

    References: #5898

  • [mysql] [bug]

    Исправлены предупреждения об устаревании, возникшие в результате выхода PyMySQL 1.0, в том числе предупреждения об устаревании параметров «db» и «passwd», которые теперь заменены на «database» и «password».

    References: #5821

  • [mysql] [bug]

    Исправлена регрессия из SQLAlchemy 1.3.20, связанная с исправлением ошибки #5462, добавляющей двойную парентезу для функциональных выражений MySQL в индексах, как того требует бэкенд. Эта ошибка непроизвольно распространилась на произвольные выражения text(), а также на внутренний текстовый компонент Alembic, который требуется Alembic для произвольных индексных выражений, не предполагающих двойной парентезы. Проверка была сужена до включения непосредственно только двоичных/унарных/функциональных выражений.

    References: #5800

oracle

  • [oracle] [bug]

    Исправлена ошибка в диалекте Oracle, введенная #4894 в SQLAlchemy 1.3.11, когда использование SQL-выражения в RETURNING для UPDATE не компилировалось из-за проверки на «server_default», когда произвольное SQL-выражение не является столбцом.

    References: #5813

  • [oracle] [bug]

    Исправлена ошибка в диалекте Oracle, когда получение столбца CLOB/BLOB через Insert.returning() приводило к ошибке, так как при возврате необходимо было считывать значение LOB; дополнительно исправлена поддержка получения значений Unicode через RETURNING под Python 2.

    References: #5812

misc

  • [bug] [ext]

    Исправлена проблема, при которой стрингизация, иногда вызываемая при попытке сгенерировать «ключ» для коллекции .c на selectable, терпела неудачу, если столбец был немаркированной пользовательской SQL-конструкцией, использующей расширение sqlalchemy.ext.compiler, и не предоставлял форму компиляции по умолчанию; хотя это кажется необычным случаем, он может быть вызван в некоторых ORM-сценариях, например, когда выражение используется в «порядке по» в сочетании с объединенной ускоренной загрузкой. Проблема заключается в том, что отсутствие функции компиляции по умолчанию приводило к появлению CompileError, а не UnsupportedCompilationError.

    References: #5836

1.3.22

Released: December 18, 2020

oracle

  • [oracle] [bug]

    Исправлена регрессия, возникавшая из-за того, что в #5755 была реализована поддержка уровня изоляции для Oracle. Сообщалось, что многие учетные записи Oracle не имеют прав на запросы к представлению v$transaction, поэтому эта функция была изменена таким образом, чтобы при неудачном подключении к базе данных она изящно отступала назад, при этом диалект будет считать, что «READ COMMITTED» является уровнем изоляции по умолчанию, как это было до SQLAlchemy 1.3.21. Однако явное использование метода Connection.get_isolation_level() теперь должно обязательно вызывать исключение, поскольку базы данных Oracle с этим ограничением явно запрещают пользователю читать текущий уровень изоляции.

    References: #5784

1.3.21

Released: December 17, 2020

orm

  • [orm] [bug]

    Добавлена комплексная проверка и информативное сообщение об ошибке для случая, когда в relationship.secondary передается сопоставленный класс или строковое имя сопоставленного класса. Это очень распространенная ошибка, которая требует четкого сообщения.

    Кроме того, добавлено новое правило для разрешения реестра классов, согласно которому для параметра relationship.secondary, если сопоставленный класс и его таблица имеют одинаковое строковое имя, то при разрешении этого параметра предпочтение будет отдаваться Table. Во всех остальных случаях предпочтение по-прежнему отдается классу, если класс и таблица имеют одинаковое имя.

    References: #5774

  • [orm] [bug]

    Исправлена ошибка в Query.update(), когда объекты в _ormsession.Session, срок действия которых уже истек, излишне SELECTировались по отдельности при их обновлении с помощью стратегии «evaluate «synchronize.

    References: #5664

  • [orm] [bug]

    Исправлена ошибка, связанная с тем, что флаг restore_load_context в событиях ORM, таких как InstanceEvents.load(), не переносился на подклассы, которые были отображены после создания обработчика события.

    References: #5737

sql

  • [sql] [bug]

    Если метод returning(), например Insert.returning(), вызывается несколько раз, то выдается предупреждение, так как этот метод еще не поддерживает аддитивную операцию. В версии 1.4 для этого будет реализована поддержка аддитивной операции. Кроме того, любая комбинация методов Insert.returning() и ValuesBase.return_defaults() теперь приводит к ошибке, так как эти методы являются взаимоисключающими; ранее операция выполнялась без звука.

    References: #5691

  • [sql] [bug]

    Исправлена проблема структурного компилятора, когда некоторые конструкции, такие как MySQL / PostgreSQL «on conflict / on duplicate key», полагались на состояние объекта Compiler, зафиксированное в их утверждении как утверждение верхнего уровня, что приводило к ошибкам в случаях, когда эти утверждения ветвились из другого контекста, например, DDL-конструкции, связанной с SQL-утверждением.

    References: #5656

postgresql

  • [postgresql] [usecase]

    В объект ExcludeConstraint добавлен новый параметр ExcludeConstraint.ops для поддержки спецификации класса оператора с этим ограничением. Pull request любезно предоставлен Alon Menczer.

    References: #5604

  • [postgresql] [bug] [mysql]

    Исправлена регрессия, появившаяся в 1.3.2 для диалекта PostgreSQL и перенесенная в 1.3.18 на диалект MySQL, когда использование конструкции не Table, например text(), в качестве аргумента Select.with_for_update.of не могло быть корректно учтено компиляторами PostgreSQL или MySQL.

    References: #5729

mysql

  • [mysql] [bug] [reflection]

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

    References: #5744

  • [mysql] [sql]

    В список RESERVED_WORDS добавлены недостающие ключевые слова для диалекта MySQL: action, level, mode, status, text, time. Pull request любезно предоставлен Оскаром Батори.

    References: #5696

sqlite

  • [sqlite] [usecase]

    Добавлено ключевое слово диалекта sqlite_with_rowid=False, позволяющее создавать таблицы в виде CREATE TABLE WITHOUT ROWID. Патч любезно предоставлен Шоном Андерсоном.

    References: #5685

mssql

  • [mssql] [bug]

    Исправлена ошибка, при которой оператор CREATE INDEX отображался некорректно, если были указаны mssql-include и mssql_where. Pull request любезно предоставлен @Adiorz.

    References: #5751

  • [mssql] [bug]

    В список кодов отключения добавлен код SQL Server «01000».

    References: #5646

  • [mssql] [reflection] [sqlite]

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

    References: #5661

oracle

1.3.20

Released: October 12, 2020

orm

  • [orm] [bug]

    Если в качестве целевого параметра для Query.join() задан не отображаемый объект, то теперь выдается сообщение ArgumentError с более подробной информацией. До этого изменения выдавался менее подробный AttributeError. Pull request любезно предоставлен Ramon Williams.

    References: #4428

  • [orm] [bug]

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

    References: #4589

engine

  • [engine] [bug]

    Исправлена проблема, при которой нестроковый объект, переданный в SQLAlchemyError или подкласс, как это происходит в некоторых сторонних диалектах, не мог корректно стробироваться. Pull request любезно предоставлен Andrzej Bartosiński.

    References: #5599

  • [engine] [bug]

    Исправлен импорт на уровне функций, при котором не использовалась стандартная система позднего импорта SQLAlchemy в модуле sqlalchemy.exc.

    References: #5632

sql

  • [sql] [bug]

    Исправлена проблема, при которой операция pickle.dumps() против конструкции Over приводила к переполнению рекурсии.

    References: #5644

  • [sql] [bug]

    Исправлена ошибка, при которой не возникала ошибка в случае, когда column() добавлялись более чем к одному table() одновременно. При этом ошибка возникала корректно для объектов Column и Table. Теперь при возникновении такой ситуации выдается сообщение ArgumentError.

    References: #5618

postgresql

  • [postgresql] [usecase]

    Диалект psycopg2 теперь поддерживает многохостовые соединения с PostgreSQL, передавая в строке запроса комбинации хост/порт. Pull request любезно предоставлен Рамоном Уильямсом.

    References: #4392

  • [postgresql] [bug]

    В методах Comparator.any() и Comparator.all() реализована прямая операция «НЕ» для отрицания, а не отрицание оператора сравнения.

    References: #5518

  • [postgresql] [bug]

    Исправлена проблема, при которой тип ENUM при выдаче CREATE TYPE или DROP TYPE не обращался к карте трансляции схемы во время проверки на существование или отсутствие типа. Кроме того, исправлена проблема, при которой, если одно и то же перечисление встречалось несколько раз в одной последовательности DDL, запрос «проверка» выполнялся повторно, а не полагался на кэшированное значение.

    References: #5520

mysql

  • [mysql] [usecase]

    Скорректирован диалект MySQL для корректного перевода функциональных индексных выражений в круглые скобки, как это принято в MySQL 8. Pull request любезно предоставлен Рамоном Уильямсом.

    References: #5462

  • [mysql] [change]

    Добавить новые зарезервированные слова MySQL: cube, lateral добавлены в MySQL 8.0.1 и 8.0.14 соответственно; это указывает на то, что при использовании этих терминов в качестве имен идентификаторов таблиц или столбцов они будут заключаться в кавычки.

    References: #5539

  • [mysql] [bug]

    Ключевое слово «skip_locked», используемое вместе с with_for_update(), при использовании на бэкендах MariaDB будет выдавать предупреждение, а затем игнорироваться. Это устаревшее поведение, которое будет отменено в SQLAlchemy 1.4, поскольку приложение, запрашивающее «skip locked», ищет неблокирующую операцию, которая недоступна на этих бэкендах.

    References: #5568

  • [mysql] [bug]

    Исправлена ошибка, из-за которой при выполнении оператора UPDATE с JOIN, использующего многотабличный формат MySQL, не включался префикс таблицы для целевой таблицы, если в операторе отсутствовал пункт WHERE, поскольку для обнаружения «многотабличного обновления» в этот момент сканировались только пункты WHERE. Теперь целевая таблица также сканируется, если это JOIN, чтобы получить самую левую таблицу в качестве первичной, а дополнительные записи - в качестве дополнительных записей FROM.

    References: #5617

mssql

  • [mssql] [bug]

    Исправлена проблема, при которой URI подключения SQLAlchemy к Azure DW, содержащий authentication=ActiveDirectoryIntegrated (и не содержащий имя пользователя+пароль), не формировал строку ODBC-соединения таким образом, который был приемлем для экземпляра Azure DW.

    References: #5592

tests

  • [tests] [bug]

    Исправлена несовместимость тестового набора при работе с Pytest 6.x.

    References: #5635

misc

  • [bug] [pool]

    Исправлена проблема, при которой следующие параметры пула не распространялись на новый пул, созданный при вызове Engine.dispose(): pre_ping, use_lifo. Кроме того, для класса AssertionPool теперь распространяются параметры recycle и reset_on_return.

    References: #5582

  • [bug] [associationproxy] [ext]

    При попытке использовать прокси-элемент ассоциации в качестве обычного выражения столбца для SELECT из или использования в SQL-функции теперь выдается информационная ошибка; в настоящее время такой вариант использования не поддерживается.

    References: #5541, #5542

1.3.19

Released: August 17, 2020

orm

  • [orm] [usecase]

    Настроена работа аксессора Mapper.all_orm_descriptors() для детерминированного представления атрибутов в порядке их расположения, что предполагает использование Python 3.6 и выше, который сохраняет порядок сортировки атрибутов класса в зависимости от того, как они были объявлены. Однако не гарантируется, что эта сортировка будет соответствовать объявленному порядку атрибутов во всех случаях; точную схему см. в документации к методу.

    References: #5494

orm declarative

  • [orm] [declarative] [usecase]

    Имя виртуального столбца, используемого при использовании классов AbstractConcreteBase и ConcreteBase, теперь может быть настроено, что позволяет использовать модели, имеющие столбец с реальным именем type. Pull request любезно предоставлен Jesse-Bakker.

    References: #5513

sql

  • [sql] [bug]

    Исправлена проблема, когда при выводе выражения «ORDER BY», содержащего имя метки, а не полное выражение, что особенно важно для SQL Server, в некоторых случаях не выполнялось, если выражение было заключено в круглую скобку. Этот случай был добавлен для проверки поддержки. Данное изменение дополнительно корректирует поведение ORM-запроса «автоматически добавлять столбцы ORDER BY при наличии DISTINCT», устаревшее в 1.4, для более точного определения уже присутствующих выражений столбцов.

    References: #5470

  • [sql] [bug] [datatypes]

    Теперь сообщение LookupError будет предоставлять пользователю до четырех возможных значений, на которые ограничивается столбец с помощью Enum. Значения длиной более 11 символов будут усекаться и заменяться многоточиями. Pull request любезно предоставлен Ramon Williams.

    References: #4733

  • [sql] [bug]

    Исправлена проблема, при которой функция Connection.execution_options.schema_translate_map не вступала в силу, если в параметре Column.server_default использовалась функция Sequence.next_value() для Sequence и выполнялся DDL create table.

    References: #5500

postgresql

  • [postgresql] [bug]

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

    References: #5476

mysql

  • [mysql] [usecase]

    Диалект MySQL отобразит FROM DUAL для оператора SELECT, в котором нет предложения FROM, но есть предложение WHERE. Это позволяет использовать запросы типа «SELECT 1 WHERE EXISTS (subquery)», а также другие варианты использования.

    References: #5481

  • [mysql] [bug]

    Исправлена проблема, при которой в операторах CREATE TABLE неправильно указывалось ключевое слово COLLATE.

    References: #5411

  • [mysql] [bug]

    В список кодов «отключения» добавлен код MariaDB 1927, так как последние версии MariaDB, по-видимому, используют этот код, когда сервер базы данных был остановлен.

    References: #5493

sqlite

  • [sqlite] [bug] [mssql] [reflection]

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

    References: #5456

mssql

  • [mssql] [bug] [sql]

    Исправлена ошибка, при которой диалект mssql некорректно экранировал имена объектов, содержащие символы „]“.

    References: #5467

misc

  • [usecase] [py3k]

    В метод DeclarativeMeta.__init__() добавлен аргумент **kw. Это позволяет классу поддерживать крючок метакласса PEP 487 __init_subclass__. Pull request любезно предоставлен Ewen Gillies.

    References: ##5357

1.3.18

Released: June 25, 2020

orm

  • [orm] [usecase]

    Улучшено сообщение об ошибке при использовании Query.filter_by() в запросе, в котором первая сущность не является сопоставленным классом.

    References: #5326

  • [orm] [usecase]

    В конструкцию query_expression() добавлен новый параметр query_expression.default_expr, который будет автоматически применяться к запросам, если не используется опция with_expression(). Pull request любезно предоставлен Haoyu Sun.

    References: #5198

examples

  • [examples] [change]

    В набор examples.performance добавлена новая опция --raw, которая позволяет сбрасывать необработанный тест профиля для использования любыми средствами визуализации профилей. Удалена опция «runsnake», так как на данный момент собрать runsnake очень сложно;

engine

  • [engine] [bug]

    Доработаны исправления агента «reset», исправленного в #5326, который теперь выдает предупреждение при некорректном вызове и исправляет поведение. Были выявлены и исправлены дополнительные сценарии, в которых выдавалось это предупреждение.

    References: #5326

  • [engine] [bug]

    Исправлена проблема в объекте URL, когда при строковой обработке объекта не происходило URL-кодирование специальных символов, из-за чего URL не мог быть пересчитан как настоящий URL. Pull request любезно предоставлен Мигелем Гринбергом.

    References: #5341

sql

  • [sql] [usecase]

    В конструкцию table() добавлен параметр «.schema», позволяющий специальным табличным выражениям также включать имя схемы. Pull request любезно предоставлен Диланом Модеситтом.

    References: #5309

  • [sql] [change] [sybase]

    В диалект sybase добавлена поддержка .offset. Pull request любезно предоставлен Аланом Д. Сноу.

    References: #5294

  • [sql] [bug]

    Корректно применять self_group в элементе type_coerce.

    Элемент type coerce некорректно применял правила группировки при использовании в выражении

    References: #5344

  • [sql] [bug]

    Добавлен вывод Select.with_hint() в общую SQL-строку, формируемую при вызове str() на операторе. Ранее этот пункт опускался, поскольку предполагалось, что он зависит от диалекта. Текст подсказки представлен в скобках для того, чтобы показать, что в разных бэкендах такие подсказки отображаются по-разному.

    References: #5353

  • [sql] [schema]

    Ввести IdentityOptions для хранения общих параметров для последовательностей и столбцов идентичности.

    References: #5324

schema

  • [schema] [bug]

    Исправлена проблема, когда при копировании объекта базы данных (например, Table) с помощью tometadata() опускались символы dialect_options.

    References: #5276

mysql

  • [mysql] [usecase]

    Реализована поддержка блокировки на уровне строк для mysql. Pull request любезно предоставлен Квентином Сомервиллем.

    References: #4860

sqlite

  • [sqlite] [usecase]

    В SQLite 3.31 добавлена поддержка вычисляемых колонок. Это изменение обеспечивает их поддержку в SQLAlchemy при работе с SQLite.

    References: #5297

  • [sqlite] [bug]

    В список зарезервированных слов для SQLite добавлено слово «exists», поэтому при использовании его в качестве метки или имени колонки оно будет заключаться в кавычки. Pull request любезно предоставлен Thodoris Sotiropoulos.

    References: #5395

mssql

  • [mssql] [change]

    Перемещено требование supports_sane_rowcount_returning = False с уровня PyODBCConnector на уровень MSDialect_pyodbc, поскольку в некоторых условиях pyodbc работает корректно.

    References: #5321

  • [mssql] [bug]

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

    References: #5364, #5366

  • [mssql] [bug] [pyodbc]

    В коннекторе pyodbc исправлена ошибка, из-за которой при использовании абсолютно пустого URL выдавалось предупреждение о «drivername» pyodbc. Пустые URL являются нормальным явлением при создании неподключенного объекта диалекта или при использовании аргумента «creator» в create_engine(). Теперь предупреждение выдается только в том случае, если имя драйвера отсутствует, но другие параметры присутствуют.

    References: #5346

  • [mssql] [bug]

    Исправлена проблема со сборкой строки подключения к ODBC для pyodbc DBAPI. Токены, содержащие точки с запятой и/или скобки «{}», неправильно экранировались, что приводило к неправильной интерпретации драйвером ODBC атрибутов строки подключения.

    References: #5373

  • [mssql] [bug]

    Исправлена проблема, когда параметры datetime.time преобразовывались в datetime.datetime, что делало их несовместимыми со сравнениями типа >= с реальным столбцом TIME.

    References: #5339

  • [mssql] [bug]

    Исправлена проблема, при которой функция is_disconnect в диалекте SQL Server pyodbc некорректно сообщала о состоянии разъединения, когда сообщение об исключении содержало подстроку, соответствующую коду ошибки SQL Server ODBC.

    References: #5359

oracle

  • [oracle] [bug] [reflection]

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

    References: #5421

1.3.17

Released: May 13, 2020

orm

  • [orm] [usecase]

    Добавлен аксессор Comparator.expressions, обеспечивающий доступ к группе колонок, отображаемых по многоколоночному атрибуту ColumnProperty.

    References: #5262

  • [orm] [usecase]

    Ввести флаг relationship.sync_backref в отношениях для контроля добавления событий синхронизации, изменяющих атрибуты in-Python. Это заменяет предыдущее изменение #5149, которое предупреждало, что viewonly=True целевой объект отношения, имеющий конфигурацию back_populates или backref, будет запрещен.

    References: #5237

  • [orm] [bug]

    Исправлена ошибка, при которой использование with_polymorphic() в качестве цели join через RelationshipComparator.of_type() на mapper, который уже имеет настройку with_polymorphic на основе подзапроса, эквивалентную запрашиваемой, не приводило к корректному псевдониму предложения ON в join.

    References: #5288

  • [orm] [bug]

    Исправлена проблема взаимодействия опций загрузчика, таких как selectinload(), с системой запеченных запросов: кэширование запроса не должно происходить, если в самих опциях загрузчика присутствуют элементы типа with_polymorphic(), которые в настоящее время не совместимы с кэшем. В некоторых случаях загрузчик baked loader мог не полностью завершить свою работу в таких сценариях, что приводило к пропуску ускоренной загрузки.

    References: #5303

  • [orm] [bug]

    Модифицирована внутренняя реализация «identity set», представляющая собой набор, который хэширует объекты по их id(), а не по хэш-значениям, чтобы не вызывать метод __hash__() у объектов, которые обычно являются пользовательскими объектами. Некоторые методы вызывали этот метод в качестве побочного эффекта реализации.

    References: #5304

  • [orm] [bug]

    Информационное сообщение об ошибке выдается в том случае, если ORM пытается выполнить сравнение «многие-к-одному» с объектом, не являющимся реальным сопоставленным экземпляром. Сравнения, например, со скалярными подзапросами не поддерживаются; обобщенное сравнение с подзапросами лучше выполнять с помощью Comparator.has().

    References: #5269

engine

  • [engine] [bug]

    Исправлена довольно критичная проблема, когда DBAPI-соединение могло быть возвращено в пул соединений, находясь в состоянии un-rolled-back. Агент сброса, отвечающий за откат соединения, мог быть поврежден в случае «закрытия» транзакции без отката или фиксации, что может происходить в некоторых сценариях при использовании ORM-сессий и выполнении .close() в определенном паттерне с точками сохранения. Исправление гарантирует, что агент сброса всегда активен.

    References: #5326

schema

  • [schema] [bug]

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

    References: #5298

  • [schema] [bug]

    Предупреждение выдается, если при использовании атрибута MetaData.sorted_tables и функции sort_tables() заданные таблицы не могут быть корректно отсортированы из-за циклической зависимости между ограничениями по внешнему ключу. В этом случае функции больше не будут сортировать задействованные таблицы по внешнему ключу, о чем будет выдано предупреждение. Другие таблицы, не входящие в цикл, по-прежнему будут возвращаться в порядке зависимости. Ранее функции sorted_table при обнаружении цикла возвращали коллекцию, в которой безусловно опускались все иностранные ключи, и предупреждение не выдавалось.

    References: #5316

  • [schema]

    Добавить атрибут comment к методу Column __repr__.

    References: #4138

postgresql

  • [postgresql] [usecase]

    Добавлена поддержка столбцов или типа ARRAY из Enum, JSON или JSONB в PostgreSQL. Ранее в этих случаях требовалось обходное решение.

    References: #5265

  • [postgresql] [usecase]

    Вызывает явную ошибку CompileError при добавлении таблицы со столбцом типа ARRAY из Enum, в котором Enum.native_enum установлен в False, когда Enum.create_constraint не установлен в False

    References: #5266

mssql

  • [mssql] [bug] [reflection]

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

    References: #5255

  • [mssql] [bug] [reflection]

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

    References: #5271

oracle

  • [oracle] [bug]

    Некоторые изменения в настройке диалекта cx_oracle на обработку типов вывода по столбцам для LOB и числовых типов данных для адаптации к возможным изменениям в cx_Oracle 8.

    References: #5246

  • [oracle] [bug] [performance]

    Изменена реализация получения CLOB- и BLOB-объектов для использования собственной реализации cx_Oracle, которая получает CLOB/BLOB-объекты в один ряд с другими колонками результата, а не выполняет отдельную выборку. Как обычно, это можно отключить, установив для параметра auto_convert_lobs значение False.

    В рамках этого изменения поведение CLOB, которому была присвоена пустая строка при INSERT, теперь возвращает None при SELECT, что соответствует поведению VARCHAR в Oracle.

    References: #5314

misc

  • [change] [firebird]

    Скорректирована загрузка диалекта для URI firebird://, так что внешний диалект sqlalchemy-firebird будет использоваться, если он был установлен, в противном случае будет возвращаться к (теперь уже устаревшему) внутреннему диалекту Firebird.

    References: #5278

1.3.16

Released: April 7, 2020

orm

  • [orm] [performance]

    В запросах, используемых в subqueryload и selectinload, изменен порядок следования по первичному ключу родительской сущности; этот порядок был использован для того, чтобы строки по мере их поступления копировались в списки напрямую с минимальным уровнем свертки на стороне Python. Однако эти условия ORDER BY могут негативно повлиять на производительность запроса, поскольку во многих сценариях эти столбцы получены из подзапроса или не являются столбцами с первичным ключом, что не позволяет планировщикам SQL использовать индексы. Свертка на стороне Python использует встроенную функцию itertools.group_by() для свертки входящих строк и была модифицирована, чтобы позволить собирать несколько групп строк по одному родителю с помощью list.extend(), что должно обеспечить относительно высокую производительность на стороне Python. Для отношений, включающих явный параметр order_by, по-прежнему будет присутствовать ORDER BY, однако это единственный ORDER BY, который будет добавлен в запрос для обоих типов загрузки.

    References: #5162

  • [orm] [bug]

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

    References: #5228

  • [orm] [bug]

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

    References: #5210

orm declarative

  • [orm] [declarative] [bug]

    Строковый аргумент, принимаемый в качестве первого позиционного аргумента функцией relationship() при использовании Декларативного API, больше не интерпретируется с помощью функции Python eval(); вместо этого имя разделяется точками, и имена ищутся непосредственно в словаре разрешения имен, не рассматривая значение как выражение Python. Однако при передаче строкового аргумента другим параметрам relationship(), которые обязательно должны принимать выражения Python, по-прежнему будет использоваться функция eval(); документация была уточнена, чтобы исключить двусмысленность использования этой функции.

    См.также

    Оценка аргументов в пользу отношений - подробности об оценке строк

    References: #5238

sql

  • [sql] [types]

    Добавлена возможность буквальной компиляции DateTime, Date или Time при использовании строкового диалекта для целей отладки. Данное изменение не влияет на реальные реализации диалекта, которые сохраняют свое текущее поведение.

    References: #5052

schema

  • [schema] [reflection]

    Добавлена поддержка отражения «вычисляемых» столбцов, которые теперь возвращаются как часть структуры, возвращаемой командой Inspector.get_columns(). При отражении полных объектов Table вычисляемые столбцы будут представлены с помощью конструкции Computed.

    References: #5063

postgresql

  • [postgresql] [bug]

    Исправлена проблема, при которой «покрывающий» индекс, например, имеющий предложение INCLUDE, отражался, включая все столбцы в предложении INCLUDE как обычные столбцы. Теперь при обнаружении таких дополнительных столбцов выдается предупреждение о том, что в данный момент они игнорируются. Обратите внимание, что полная поддержка «покрывающих» индексов является частью #4458. Pull request любезно предоставлен Маратом Шарафутдиновым.

    References: #5205

mysql

  • [mysql] [bug]

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

    References: #5239

sqlite

  • [sqlite] [usecase]

    Реализован уровень изоляции AUTOCOMMIT для SQLite при использовании pysqlite.

    References: #5164

mssql

oracle

  • [oracle] [usecase]

    Реализован уровень изоляции AUTOCOMMIT для Oracle при использовании cx_Oracle. Также добавлен фиксированный уровень изоляции по умолчанию READ COMMITTED для Oracle.

    References: #5200

  • [oracle] [bug] [reflection]

    Исправлена регрессия / некорректное исправление, вызванное исправлением для #5146, когда диалект Oracle читал из представления «all_tab_comments» для получения комментариев к таблице, но не учитывал текущего владельца запрашиваемой таблицы, что приводило к чтению неправильного комментария, если несколько таблиц с одинаковым именем существовали в нескольких схемах.

    References: #5146

tests

  • [tests] [bug]

    Исправлена проблема, из-за которой тестовый набор не мог работать с недавно выпущенной версией py.test 5.4.0.

    References: #5201

misc

  • [enum] [types]

    Тип Enum теперь поддерживает параметр Enum.length для указания длины создаваемого столбца VARCHAR при использовании неродных перечислений путем установки Enum.native_enum в значение False.

    References: #5183

  • [installer]

    Убедились, что файл «pyproject.toml» не включается в сборки, поскольку наличие этого файла указывает pip на необходимость использования процесса установки pep-517. Поскольку данный режим работы, по-видимому, не очень хорошо поддерживается текущими инструментами / дистрибутивами, в рамках установки SQLAlchemy эти проблемы можно избежать, исключив этот файл.

    References: #5207

1.3.15

Released: March 11, 2020

orm

  • [orm] [bug]

    Скорректировано сообщение об ошибке, выдаваемое методом Query.join(), когда левая сторона не может быть найдена, что метод Query.select_from() является наилучшим способом решения проблемы. Также в серии 1.3 использовано детерминированное упорядочивание при определении предложения FROM по заданной сущности столбца, передаваемой в Query, так что каждый раз определяется одно и то же выражение.

    References: #5194

  • [orm] [bug]

    В версии 1.3.14 исправлена регрессия #4849, из-за которой вызов sys.exc_info() не вызывался корректно при возникновении ошибки flush. Для этого случая добавлено тестовое покрытие.

    References: #5196

1.3.14

Released: March 10, 2020

general

  • [general] [bug] [py3k]

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

    References: #4849

orm

  • [orm] [usecase]

    В события InstanceEvents.load(), InstanceEvents.refresh() и SessionEvents.loaded_as_persistent() добавлен новый флаг InstanceEvents.restore_load_context и SessionEvents.restore_load_context, который при установке восстанавливает «контекст загрузки» объекта после вызова хука события. Это гарантирует, что объект останется в «контексте загрузчика» уже выполняющейся операции загрузки, а не будет переведен в новый контекст загрузки из-за операций обновления, которые могли произойти в событии. Теперь при возникновении этого условия выдается предупреждение, в котором рекомендуется использовать флаг для разрешения этой ситуации. Флаг является «опциональным», поэтому не представляет никакого риска для существующих приложений.

    Изменение дополнительно добавляет поддержку флага raw=True в событиях жизненного цикла сессии.

    References: #5129

  • [orm] [bug]

    Исправлена регрессия, вызванная в 1.3.13 ошибкой #5056, когда в результате рефакторинга системы реестра путей ORM путь больше не мог сравниваться с пустым кортежем, что может иметь место в определенном типе объединенных путей с ускоренной загрузкой. Случай использования «пустого кортежа» был решен таким образом, что реестр путей сравнивается с реестром путей во всех случаях; сам объект PathRegistry теперь реализует методы __eq__() и __ne__(), которые будут иметь место для всех сравнений равенства и продолжат успешно работать в непредвиденном случае, когда сравнивается не PathRegistry объект, выдавая при этом предупреждение, что этот объект не должен быть объектом сравнения.

    References: #5110

  • [orm] [bug]

    Установка отношения в viewonly=True, которое также является целью конфигурации back_populates или backref, теперь будет выдавать предупреждение и в конечном итоге будет запрещена. back_populates относится именно к мутации атрибута или коллекции, которая запрещена, если атрибут имеет viewonly=True. Атрибут viewonly не подчиняется поведению персистентности, что означает, что он не будет отражать корректные результаты при локальном изменении.

    References: #5149

  • [orm] [bug]

    Исправлена дополнительная регрессия в той же области, что и в #5080, введенная в 1.3.0b3 через #4468, когда возможность создания объединенного варианта через with_polymorphic() в отношение к базовому классу этого класса with_polymorphic, а затем далее в обычные отображаемые отношения приводила к неудаче, поскольку компонент базового класса не добавлял себя в путь загрузки таким образом, чтобы его можно было найти с помощью стратегии загрузчика. Изменения, примененные в #5080, были доработаны с учетом этого сценария.

    References: #5121

engine

  • [engine] [bug]

    Расширена область действия очистки курсора/соединения при выполнении оператора: теперь она включает случаи, когда не удается построить объект результата, когда событие after_cursor_execute() приводит к ошибке или когда не удается выполнить autocommit / autoclose. Это позволяет очищать курсор DBAPI при сбое, а при выполнении без соединения - закрывать соединение и возвращать его в пул соединений, где ранее ожидание сборки мусора приводило к возврату пула.

    References: #5182

sql

  • [sql] [bug] [postgresql]

    Исправлена ошибка, при которой CTE оператора INSERT/UPDATE/DELETE, также использующего RETURNING, нельзя было напрямую выбрать, так как внутреннее состояние компилятора пыталось рассматривать внешний SELECT как оператор DELETE и обращаться к несуществующему состоянию.

    References: #5181

postgresql

  • [postgresql] [bug]

    Исправлена проблема, при которой функция «schema_translate_map» не работала с собственным типом перечисления PostgreSQL (т.е. Enum, ENUM), в то время как оператор «CREATE TYPE» выдавался с правильной схемой, схема не отображалась в операторе CREATE TABLE в точке, в которой происходило обращение к перечислению.

    References: #5158

  • [postgresql] [bug] [reflection]

    Исправлена ошибка, из-за которой при отражении в PostgreSQL ограничений CHECK не удавалось разобрать ограничение, если в тексте SQL содержались символы новой строки. Регулярное выражение было скорректировано для этого случая. Pull request любезно предоставлен Эриком Борчуком.

    References: #5170

mysql

  • [mysql] [bug]

    Исправлена проблема в конструкции MySQL Insert.on_duplicate_key_update(), когда использование SQL-функции или другого составного выражения для аргумента столбца приводило к неправильному отображению ключевого слова VALUES, окружающего сам столбец.

    References: #5173

mssql

  • [mssql] [bug]

    Исправлена проблема, при которой тип DATETIMEOFFSET не принимал значение None, введенная в рамках серии исправлений для этого типа, впервые появившихся в #4983, #5045. Кроме того, добавлена поддержка передачи через этот тип строки с форматированием даты, характерной для бэкенда, как это обычно делается для типов дата/время в большинстве других DBAPI.

    References: #5132

oracle

  • [oracle] [bug]

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

    References: #5146

misc

  • [usecase] [ext]

    В функцию MutableList.sort() добавлены аргументы в виде ключевых слов, чтобы можно было указать как ключевую функцию, так и аргумент в виде ключевого слова «reverse».

    References: #5114

  • [bug] [performance]

    Исправлено внутреннее изменение в тестовой системе, добавленное в результате #5085, когда модуль, связанный с тестированием, загружается безусловно при использовании диалекта, втягивая в пространство импорта модулей фреймворк тестирования SQLAlchemy, а также ORM. Это лишь незначительно повлияет на время начального запуска и память, однако лучше, чтобы эти дополнительные модули не были обратно зависимы от прямого использования Core.

    References: #5180

  • [bug] [installation]

    Вендоризация функции inspect.formatannotation внутри sqlalchemy.util.compat, которая необходима для вендоризованной версии inspect.formatargspec. Эта функция не документирована в cPython и не гарантируется, что она будет доступна в будущих версиях Python.

    References: #5138

1.3.13

Released: January 22, 2020

orm

  • [orm] [performance]

    Выявлена проблема с производительностью системы, в которой соединение строится на основе сопоставленных отношений. Система адаптации клаузул будет использоваться для большинства выражений присоединения, в том числе и в распространенном случае, когда адаптация не требуется. Условия, при которых происходит адаптация, были уточнены таким образом, что в среднем при построении несглаженных соединений на основе простого отношения без «вторичной» таблицы используется примерно на 70% меньше вызовов функций.

  • [orm] [bug] [engine]

    Добавлена поддержка тестов и исправлено множество ненужных циклов ссылок, созданных для короткоживущих объектов, в основном в области ORM-запросов. Большое спасибо Карсону Ипу за помощь в этом вопросе.

    References: #5050, #5056, #5071

  • [orm] [bug]

    Исправлена регрессия в опциях загрузчика, появившаяся в 1.3.0b3 через #4468, когда при создании опции загрузчика с помощью PropComparator.of_type(), нацеленной на псевдосущность, являющуюся наследующим подклассом сущности, на которую ссылается предыдущее отношение, не удавалось получить соответствующий путь. См. также исправление #5082 в этом же выпуске, связанное с аналогичной проблемой.

    References: #5107

  • [orm] [bug]

    В 1.3.0b3 исправлена регрессия в загрузке объединенных опций через #4468, когда возможность создания объединенной опции через with_polymorphic() в полиморфный подкласс с помощью RelationshipProperty.of_type() и далее по обычным отображаемым связям приводила к ошибке, так как полиморфный подкласс не добавлял себя в путь загрузки таким образом, чтобы его можно было найти с помощью стратегии загрузчика. Для решения этой проблемы была сделана поправка.

    References: #5082

  • [orm] [bug]

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

    References: #5068

  • [orm] [bug]

    Исправлена ошибка, при которой использование объединенной ускоренной загрузки не позволяло обернуть запрос внутри подзапроса, если в запросе использовались Query.group_by(). При использовании любого подхода к ограничению результатов, например, DISTINCT, LIMIT, OFFSET, объединенная ускоренная загрузка вставляет запрос с ограничением строк внутрь подзапроса, чтобы не влиять на результаты коллекции. По какой-то причине наличие GROUP BY не было включено в этот критерий, хотя оно имеет тот же эффект, что и использование DISTINCT. Кроме того, эта ошибка не позволяет вообще использовать GROUP BY для объединенного запроса с ускоренной загрузкой для большинства платформ баз данных, которые запрещают наличие в запросе неагрегированных и негруппированных столбцов, поскольку дополнительные столбцы для объединенной ускоренной загрузки не будут восприняты базой данных.

    References: #5065

engine

  • [engine] [bug]

    Исправлена проблема, при которой коллекция процессоров значений на объекте Compiled мутировала при использовании «расширяющих IN» параметров с типом данных, имеющим процессоры значений bind; в частности, это означало, что при использовании кэширования операторов и/или запекаемых запросов одна и та же коллекция compiled._bind_processors мутировала параллельно. Поскольку эти процессоры каждый раз выполняют одну и ту же функцию для данного пространства имен bind-параметров, фактического негативного эффекта от этой проблемы не было, однако выполнение объекта Compiled никогда не должно приводить к изменению его состояния, особенно если учесть, что они предназначены для потокобезопасности и многократного использования после полного построения.

    References: #5048

sql

  • [sql] [usecase]

    В функции, созданной с помощью GenericFunction, теперь можно указать, что имя функции должно отображаться с кавычками или без них, присвоив элементу .name объекта конструкцию quoted_name. До версии 1.3.4 кавычки к именам функций не применялись, а в #4467 были введены некоторые кавычки, но не было средств принудительного приведения имени в смешанном регистре. Кроме того, конструкция quoted_name при использовании в качестве имени правильно регистрирует свое имя в нижнем регистре в реестре функций, так что имя по-прежнему доступно через реестр func..

    См.также

    GenericFunction

    References: #5079

postgresql

  • [postgresql] [usecase]

    Добавлена поддержка префиксов к конструкции CTE, что позволяет поддерживать фразы Postgresql 12 «МАТЕРИАЛИЗОВАНО» и «НЕ МАТЕРИАЛИЗОВАНО». Pull request любезно предоставлен Маратом Шарафутдиновым.

    См.также

    HasCTE.cte()

    References: #5040

  • [postgresql] [bug]

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

    References: #5039

mssql

  • [mssql] [bug]

    Исправлена проблема, при которой в значении datetime, преобразуемом в строку для использования в качестве параметра столбца DATETIMEOFFSET, отсутствовали дробные секунды.

    References: #5045

tests

  • [tests] [bug]

    Исправлено несколько сбоев в тестах, возникавших под Windows из-за проблем с блокировкой файлов SQLite, а также некоторые проблемы со временем в тестах, связанных с пулом соединений; запрос на выгрузку любезно предоставлен Федерико Казелли.

    References: #4946

  • [tests] [postgresql]

    Улучшено обнаружение требования двухфазных транзакций для базы данных PostgreSQL путем проверки того, что max_prepared_transactions установлен в значение больше 0. Pull request любезно предоставлен Федерико Казелли.

    References: #5057

misc

  • [bug] [ext]

    Исправлена ошибка в sqlalchemy.ext.serializer, когда уникальный объект BindParameter мог конфликтовать сам с собой, если он присутствовал в самом отображении, а также в условии фильтрации запроса, так как с одной стороны использовалась не десериализованная версия, а с другой - десериализованная. В BindParameter добавлена логика, аналогичная его методу «clone», которая при десериализации будет уникализировать имя параметра, чтобы он не конфликтовал с оригиналом.

    References: #5086

1.3.12

Released: December 16, 2019

orm

  • [orm] [bug]

    Исправлена проблема, связанная со стратегией lazy="raise", когда при удалении объекта в ORM возникала ошибка для простых отношений типа «use-get» типа «многие-к-одному», для которых было настроено lazy=»raise». Это противоречит изменению, внесенному в 1.3 в рамках #4353, где было установлено, что операция истории, которая не ожидает выдачи SQL, должна обходить проверку lazy="raise", а вместо этого эффективно рассматривать ее как lazy="raise_on_sql" для данного случая. Исправление корректирует стратегию ленивого загрузчика таким образом, чтобы не поднимать вопрос для случая, когда ленивая загрузка была проинструктирована, что она не должна испускать SQL, если объект не присутствует.

    References: #4997

  • [orm] [bug]

    В версии 1.3.0 исправлена ошибка, связанная с рефактором ассоциативного прокси в #4351, из-за которой атрибуты composite() не работали в терминах ассоциативного прокси, ссылающегося на них.

    References: #5000

  • [orm] [bug]

    Установка флагов, связанных с персистентностью, для relationship() при одновременном задании viewonly=True теперь будет выдавать обычное предупреждение, поскольку эти флаги не имеют смысла для отношения viewonly=True. В частности, настройки «каскада» имеют собственное предупреждение, которое генерируется на основе отдельных значений, например, «delete, delete-orphan», которые не должны применяться к отношениям viewonly. Заметим, однако, что в случае «каскада» эти настройки ошибочно продолжают действовать, даже если отношение настроено как «только для просмотра». Для решения этой проблемы в версии 1.4 все каскадные настройки, связанные с персистентностью, будут запрещены для отношений viewonly=True.

    References: #4993

  • [orm] [bug] [py3k]

    Исправлена проблема, при которой при назначении коллекции самой себе в качестве среза операция мутации заканчивалась неудачей, так как сначала непреднамеренно стиралась назначенная коллекция. Поскольку присваивание, не изменяющее содержимое коллекции, не должно генерировать события, операция теперь не работает. Обратите внимание, что исправление применимо только к Python 3; в Python 2 хук __setitem__ в этом случае не вызывается; вместо него используется __setslice__, который во всех случаях воссоздает список элемент за элементом.

    References: #4990

  • [orm] [bug]

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

    References: #5034

sql

  • [sql] [bug]

    Исправлена ошибка, при которой ключевое слово «distinct», передаваемое в select(), не рассматривало строковое значение как «ссылку на метку» так же, как это делает select.distinct(); вместо этого происходило безусловное повышение. Этот ключевой аргумент и другие, передаваемые в select(), в конечном итоге будут устаревшими для SQLAlchemy 2.0.

    References: #5028

  • [sql] [bug]

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

sqlite

  • [sqlite] [bug]

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

    References: #5014

mssql

  • [mssql] [bug]

    Исправлена поддержка типа данных DATETIMEOFFSET в PyODBC путем добавления обработчиков результатов на уровне PyODBC, так как в нем нет нативной поддержки этого типа данных. Это включает использование подкласса tzinfo «timezone» из Python 3 для установки часового пояса, который на Python 2 использует минимальный бэкпорт «timezone» в sqlalchemy.util.

    References: #4983

1.3.11

Released: November 11, 2019

orm

  • [orm] [usecase]

    Добавлен аксессор Query.is_single_entity() к Query, который указывает, будет ли результат, возвращаемый этим Query, списком сущностей ORM, или кортежем сущностей или выражений столбцов. SQLAlchemy надеется улучшить поведение одиночных сущностей / кортежей в будущих выпусках, чтобы это поведение было явным заранее, однако этот атрибут должен быть полезен для текущего поведения. Pull request любезно предоставлен Патриком Хейсом.

    References: #4934

  • [orm] [bug]

    Флаг relationship.omit_join не был предназначен для ручной установки в True, и теперь при возникновении такой ситуации будет выдаваться предупреждение. Оптимизация omit_join обнаруживается автоматически, и флаг omit_join был предназначен только для отключения оптимизации в гипотетическом случае, когда оптимизация могла помешать корректному результату, чего не наблюдалось в современной версии этой функции. Установка флага в True, когда он не определяется автоматически, может привести к некорректной работе функции selectin load при использовании нестандартного условия первичного соединения.

    References: #4954

  • [orm] [bug]

    Если в Query.get() передается значение первичного ключа, состоящее из None для всех позиций столбцов первичного ключа, то выдается предупреждение. Ранее передача одиночного None вне кортежа вызывала предупреждение TypeError, а передача составного None (кортежа из значений None) проходила молча. Теперь исправление принудительно помещает одиночное None в кортеж, где оно обрабатывается последовательно с другими условиями None. Спасибо Льву Израилевичу за помощь.

    References: #4915

  • [orm] [bug]

    BakedQuery не будет кэшировать запрос, который был изменен событием QueryEvents.before_compile(), так что крючки компиляции, которые могут применять специальные изменения к запросам, будут действовать при каждом запуске. В частности, это полезно для событий, модифицирующих запросы, используемые в ленивой загрузке, а также в нетерпеливой загрузке, такой как загрузка «select in». Для повторного включения кэширования для запроса, модифицированного этим событием, добавлен новый флаг bake_ok; подробнее см. раздел Использование события before_compile.

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

    References: #4947

  • [orm] [bug]

    Исправлена ошибка ORM, когда «вторичная» таблица, ссылающаяся на selectable, который каким-либо образом ссылается на локальную первичную таблицу, применяла алиасинг к обеим сторонам условия join, когда генерировались связанные с отношениями join, либо через Query.join(), либо через joinedload(). Теперь «локальная» сторона исключена.

    References: #4974

engine

  • [engine] [bug]

    Исправлена ошибка, при которой параметр repr, используемый в логах и отчетах об ошибках, нуждался в дополнительном контексте, чтобы отличить список параметров для одного оператора от списка списков параметров, поскольку структура «список списков» могла также указывать на список из одного параметра, где первый параметр сам является списком, например, для параметра массива. Теперь движок/соединение передает дополнительный булев, указывающий на то, как следует учитывать параметры. Единственным бэкендом SQLAlchemy, который ожидает массивы в качестве параметров, является psycopg2, использующий параметры pyformat, поэтому эта проблема не слишком заметна, однако по мере того, как другие драйверы, использующие позиционные параметры, получают все больше возможностей, важно, чтобы это поддерживалось. Кроме того, это избавляет функцию parameter repr от необходимости угадывать структуру передаваемого параметра.

    References: #4902

  • [engine] [bug] [postgresql]

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

    References: #4955

sql

  • [sql] [usecase]

    Добавлены новые аксессоры к выражениям типа JSON для доступа и сравнения конкретных типов данных, охватывающие строки, целые числа, числовые и булевы элементы. Это пересматривает документированный подход CASTing to string при сравнении значений, вместо этого в диалекты PostgreSQL, SQlite, MySQL добавлена специальная функциональность для надежного предоставления этих базовых типов во всех случаях.

    References: #4276

  • [sql] [usecase]

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

    References: #4933

  • [sql] [bug] [py3k]

    Изменена конструкция repr() из quoted_name для использования регулярной строки repr() под Python 3, а не для выполнения экранирования «backslashreplace», которое может вводить в заблуждение.

    References: #4931

schema

  • [schema] [usecase]

    Добавлена поддержка DDL для «вычисляемых колонок»; это спецификации DDL для колонок, значение которых вычисляется сервером либо при SELECT (так называемые «виртуальные»), либо в момент INSERT или UPDATEd (так называемые «хранимые»). Поддерживаются Postgresql, MySQL, Oracle SQL Server и Firebird. Спасибо Федерико Казелли за большую работу над этим проектом.

    References: #4894

  • [schema] [bug]

    Исправлена ошибка, при которой в таблице, где метка столбца перекрывалась с обычным именем столбца, например, «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

  • [mysql] [bug]

    Добавлено сообщение «Connection was killed», интерпретируемое из базового класса pymysql.Error для обнаружения закрытого соединения, на основании сообщений о том, что это сообщение приходит через объект pymysql.InternalError(), что указывает на то, что pymysql обрабатывает его некорректно.

    References: #4945

mssql

  • [mssql] [bug]

    Исправлена проблема в диалекте MSSQL, когда значение OFFSET, основанное на выражении, в SELECT отклонялось, даже если диалект может отобразить это выражение внутри конструкции LIMIT/OFFSET, ориентированной на ROW NUMBER.

    References: #4973

  • [mssql] [bug]

    Исправлена проблема в методе Engine.table_names(), когда в функцию таблицы уровня диалекта передавалось имя схемы по умолчанию диалекта, которое в случае SQL Server интерпретировалось как имя схемы с точкой в соответствии с диалектом mssql, что приводило к ошибке в случае, если имя пользователя базы данных действительно содержало точку внутри него. В версии 1.3 этот метод по-прежнему используется функцией MetaData.reflect(), поэтому является заметным кодовым путем. В версии 1.4, которая является текущей мастер-веткой разработки, этой проблемы не существует, так как MetaData.reflect() не использует этот метод и не передает имя схемы по умолчанию в явном виде. Тем не менее, исправление защищает возвращаемое диалектом значение имени сервера по умолчанию от интерпретации как ток-енизированного имени при любых обстоятельствах, оборачивая его в quoted_name().

    References: #4923

oracle

  • [oracle] [usecase]

    В диалект cx_Oracle добавлен флаг уровня диалекта encoding_errors, который может быть указан как часть флага create_engine(). Он передается в конвертер декодирования юникода SQLAlchemy под Python 2 и в объект cx_Oracle cursor.var() в качестве параметра encodingErrors под Python 3 для очень необычного случая, когда в целевой базе данных присутствуют неработающие кодировки, которые не могут быть извлечены, если не ослаблена обработка ошибок. В конечном счете, это значение является одним из параметров Python «encoding errors», передаваемых в decode().

    References: #4799

  • [oracle] [bug] [firebird]

    Изменен подход к «нормализации имен» для диалектов Oracle и Firebird, при котором преобразование из UPPERCASE-as-case-insensitive, принятого в этих диалектах, в lowercase-as-case-insensitive для SQLAlchemy, чтобы не применять автоматически конструкцию quoted_name к имени, которое само совпадает при преобразовании в верхний или нижний регистр, как это происходит для многих неевропейских символов. Все имена, используемые в структурах метаданных, в любом случае преобразуются в объекты quoted_name; изменение здесь повлияет только на вывод некоторых функций проверки.

    References: #4931

  • [oracle] [bug]

    Тип данных NCHAR теперь будет связываться с привязкой данных cx_Oracle.FIXED_NCHAR DBAPI при использовании в связанном параметре, что обеспечивает корректное поведение при сравнении со строкой переменной длины. Ранее тип данных NCHAR связывался с cx_oracle.NCHAR, который не имеет фиксированной длины; тип данных CHAR уже связывается с cx_Oracle.FIXED_CHAR, так что в настоящее время вполне логично, что NCHAR связывается с cx_Oracle.FIXED_NCHAR.

    References: #4913

tests

  • [tests] [bug]

    Исправлены сбои в тестировании, возникающие в новых версиях SQLite, начиная с версии 3.30 и выше, связанные с добавлением синтаксиса упорядочивания nulls, а также с новыми ограничениями на агрегатные функции. Pull request любезно предоставлен Nils Philippsen.

    References: #4920

misc

  • [bug] [installation] [windows]

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

    References: #4967

  • [bug] [firebird]

    В обнаружение отключения Firebird добавлено дополнительное сообщение «Ошибка записи данных в соединение». Pull request любезно предоставлен lukens.

    References: #4903

1.3.10

Released: October 9, 2019

mssql

  • [mssql] [bug]

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

    References: #4857

oracle

  • [oracle] [bug]

    Исправлена регрессия в диалекте Oracle, из-за которой на сервере Oracle 12.2 и выше непроизвольно использовалась максимальная длина идентификатора 128 символов, хотя по условиям контракта для оставшихся версий серии 1.3 это значение остается равным 30 до версии SQLAlchemy 1.4. Также исправлены проблемы с получением версии «совместимости» и убрано предупреждение, выдаваемое при недоступности представления «v$parameter», так как это приводило к путанице пользователей.

    References: #4857, #4898

1.3.9

Released: October 4, 2019

orm

  • [orm] [bug]

    Исправлена регрессия в стратегии загрузчика selectinload, вызванная использованием #4775 (выпущен в версии 1.3.6), в результате которой атрибут Many-to-one, равный None, больше не заполнялся загрузчиком. Хотя обычно это было незаметно из-за того, что lazyloader заполнял None при получении, при отсоединении объекта это приводило к ошибке detached instance.

    References: #4872

  • [orm] [bug]

    Передача обычного строкового выражения в Session.query() является устаревшей, так как все строковые принуждения были удалены в #4481, а это должно было быть включено. Функция literal_column() может быть использована для получения текстового выражения столбца.

    References: #4873

  • [orm] [bug]

    Предупреждение выдается для случая, когда Session может неявно поменять объект из карты идентификации на другой объект с тем же первичным ключом, отсоединив старый, что может быть результатом операций загрузки, выполняемых в рамках хука SessionEvents.after_flush(). Предупреждение призвано уведомить пользователя о том, что это произошло по каким-то особым условиям и что предыдущий объект может находиться не в ожидаемом состоянии.

    References: #4890

engine

  • [engine] [usecase]

    Добавлен новый параметр create_engine() create_engine.max_identifier_length. Он переопределяет кодируемую диалектом «максимальную длину идентификатора» для учета баз данных, в которых эта длина была недавно изменена, а диалект SQLAlchemy еще не был настроен для ее определения. Этот параметр взаимодействует с существующим параметром create_engine.label_length в том, что он устанавливает максимальное значение (и значение по умолчанию) для анонимно сгенерированных меток. Кроме того, в систему диалектов было добавлено определение максимальной длины идентификатора после подключения. Эта возможность впервые используется в диалекте Oracle.

    См.также

    Максимальная длина идентификатора - в документации по диалекту Oracle

    References: #4857

sql

  • [sql] [usecase]

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

    References: #4847

  • [sql] [bug]

    Символы, мешающие форматам «pyformat» или «named» в связанных параметрах, а именно %, (, ) и символ пробела, а также некоторые другие обычно нежелательные символы, удаляются раньше для bindparam(), использующего анонимизированное имя, которое обычно генерируется автоматически из именованного столбца, который сам включает эти символы в свое имя и не использует .key, чтобы они не мешали ни использованию компилятором SQLAlchemy форматирования строк, ни разбору параметра на уровне драйвера, что можно было продемонстрировать до исправления. Данное изменение относится только к анонимизированным именам параметров, которые генерируются и потребляются внутри системы, а не к именам, определяемым конечным пользователем, поэтому оно не должно повлиять на существующий код. В частности, это относится к драйверу psycopg2, который в противном случае не цитирует специальные имена параметров, а также удаляет ведущие символы подчеркивания в угоду Oracle (но пока не ведущие цифры, поскольку некоторые параметры anon в настоящее время полностью основаны на цифрах/незачеркнутых символах); Oracle в любом случае продолжает цитировать имена параметров, содержащие специальные символы.

    References: #4837

sqlite

  • [sqlite] [usecase]

    Добавлена поддержка соединений sqlite «URI», позволяющих передавать в строке запроса специфические для sqlite флаги, например, «только чтение», для поддерживающих это драйверов Python sqlite3.

    См.также

    Связи URI

    References: #4863

mssql

  • [mssql] [bug]

    Добавлена кавычка идентификатора для имени схемы, применяемая в операторе «use», который вызывается, когда в отражаемом Table используется многокомпонентное имя схемы SQL Server, а также для методов Inspector, таких как Inspector.get_table_names(); это учитывает наличие специальных символов или пробелов в имени базы данных. Кроме того, оператор «use» не выдается, если текущая база данных совпадает с передаваемым именем базы данных владельца цели.

    References: #4883

oracle

  • [oracle] [usecase]

    Диалект 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

  • [oracle] [bug]

    Восстановлено добавление cx_Oracle.DATETIME в вызов setinputsizes() при использовании типа данных SQLAlchemy Date, DateTime или Time, так как в некоторых сложных запросах это необходимо. В серии 1.2 это было удалено по произвольным причинам.

    References: #4886

tests

  • [tests] [bug]

    В версии 1.3.8 исправлена регрессия в модульных тестах, которая приводила к сбоям в работе Oracle, SQL Server и других неродных ENUM-платформ из-за новых тестов перечислений, добавленных как часть сортировки перечислений #4285 в модуле работы; перечисления создавали ограничения, которые дублировались по имени.

    References: #4285

1.3.8

Released: August 27, 2019

orm

  • [orm] [usecase]

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

    References: #4285

  • [orm] [bug]

    Исправлена ошибка, при которой объекты Load не были pickleable из-за состояния mapper/relationship во внутреннем контекстном словаре. Теперь эти объекты преобразуются в picklable с помощью тех же приемов, что и другие элементы в системе опций загрузчика, которые уже давно являются сериализуемыми.

    References: #4823

engine

  • [engine] [feature]

    Добавлен новый параметр create_engine.hide_parameters, при установке которого в значение True параметры SQL больше не будут регистрироваться и выводиться в строковое представление объекта StatementError.

    References: #4815

  • [engine] [bug]

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

    References: #4807

postgresql

  • [postgresql] [usecase]

    Добавлена поддержка отражения ограничений CHECK, включающих специальный квалификатор PostgreSQL «NOT VALID», который может присутствовать для ограничений CHECK, добавленных в существующую таблицу с указанием, что они не должны применяться к существующим данным в таблице. Словарь PostgreSQL для CHECK-ограничений, возвращаемый командой Inspector.get_check_constraints(), может включать дополнительную запись dialect_options, которая в случае обнаружения этого символа будет содержать запись "not_valid": True. Pull request любезно предоставлен Биллом Финном.

    References: #4824

  • [postgresql] [bug]

    Переработан подход для только что добавленной поддержки функции psycopg2 «execute_values()», добавленной в 1.3.7 для #4623. В данном подходе использовалось регулярное выражение, которое не подходило для более сложного оператора INSERT, например, с подзапросами. Новый подход обеспечивает точное соответствие строке, которая была выведена в качестве предложения VALUES.

    References: #4623

  • [postgresql] [bug]

    Исправлена ошибка, при которой операторы Postgresql, такие как Comparator.contains() и Comparator.contained_by(), не работали корректно для нецелых значений при использовании их против объекта array, что было связано с ошибочным утверждением assert.

    References: #4822

sqlite

  • [sqlite] [bug] [reflection]

    Исправлена ошибка, при которой FOREIGN KEY, настроенный на ссылку на родительскую таблицу только по имени таблицы без указания имен столбцов, не отражался корректно в части настройки «ссылающихся столбцов», поскольку PRAGMA SQLite не сообщает об этих столбцах, если они не заданы явно. По какой-то причине в этом случае жестко кодировалось имя локального столбца, что, возможно, работает в некоторых случаях, но не является корректным. Новый подход отражает первичный ключ ссылающейся таблицы и использует список столбцов ограничений в качестве списка ссылающихся столбцов, если удаленный столбец (столбцы) не присутствует в отраженной прагме напрямую.

    References: #4810

1.3.7

Released: August 14, 2019

orm

  • [orm] [bug]

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

    References: #4777

  • [orm] [bug]

    Исправлена ошибка, при которой использование Query.first() или выражения slice в сочетании с запросом, в котором применено выражение, основанное на «смещении», приводило к ошибке TypeError из-за того, что условное «или» в отношении «смещения» не ожидало, что оно является выражением SQL, а не целым числом или None.

    References: #4803

sql

  • [sql] [bug]

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

    References: #4778

  • [sql] [bug]

    Исправлена ошибка, при которой метод TypeEngine.column_expression() не применялся к последующим операторам SELECT внутри UNION или других _selectable.CompoundSelect, даже если операторы SELECT отображались на самом верхнем уровне оператора. Новая логика теперь различает вывод выражения столбца, который необходим для всех SELECT в списке, и сбор возвращаемого типа данных для строки результата, который необходим только для первого SELECT.

    References: #4787

  • [sql] [bug]

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

    References: #4780

postgresql

  • [postgresql] [usecase]

    Добавлен новый флаг диалекта psycopg2, executemany_mode, который заменяет предыдущий экспериментальный флаг use_batch_mode. executemany_mode поддерживает функции «execute batch» и «execute values», предоставляемые psycopg2, последняя из которых используется для компилируемых конструкций insert(). Pull request любезно предоставлен Ювалом Динари.

    References: #4623

mysql

  • [mysql] [usecase]

    В список зарезервированных слов MySQL добавлены зарезервированные слова ARRAY и MEMBER, поскольку в MySQL 8.0 они стали зарезервированными.

    References: #4783

  • [mysql] [bug]

    Диалекты 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] [bug]

    Добавлено еще одно исправление проблемы, связанной с тем, что в MySQL 8 имя таблицы, чувствительное к регистру, некорректно отражается в отражении ограничений внешнего ключа. Это продолжение исправления, впервые добавленного для #4344, которое касалось имени столбца, чувствительного к регистру. Новая проблема возникает в MySQL 8.0.17, поэтому общая логика исправления 88718 остается прежней.

    См.также

    https://bugs.mysql.com/bug.php?id=96365 - ошибка в восходящем потоке

    References: #4751

sqlite

  • [sqlite] [bug]

    Диалекты, поддерживающие json, должны принимать аргументы json_serializer и json_deserializer на уровне create_engine(), однако диалект SQLite называет их _json_serializer и _json_deserilalizer. Имена были исправлены, старые имена принимаются с предупреждением об изменении, и теперь эти параметры документируются как create_engine.json_serializer и create_engine.json_deserializer.

    References: #4798

  • [sqlite] [bug]

    Исправлена ошибка, при которой использование «PRAGMA table_info» в диалекте SQLite приводило к тому, что функции отражения для определения существования таблицы, списка столбцов таблицы и списка внешних ключей по умолчанию использовали любую таблицу в любой подключенной базе данных, если имя схемы не было задано и таблица не существовала в базовой схеме. Исправление явно запускает PRAGMA для «основной» схемы, а затем для «временной» схемы, если «основная» не вернула ни одной строки, чтобы сохранить поведение таблиц + временных таблиц в пространстве имен «без схемы», а присоединенных таблиц - только в пространстве имен «схема».

    References: #4793

mssql

  • [mssql] [usecase]

    Добавлена новая конструкция try_cast() для SQL Server, которая использует синтаксис «TRY_CAST». Pull request любезно предоставлен Leonel Atencio.

    References: #4782

misc

  • [bug] [events]

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

    References: #4794

1.3.6

Released: July 21, 2019

orm

  • [orm] [feature]

    Добавлен новый метод опций загрузчика Load.options(), который позволяет строить опции загрузчика иерархически, так что к определенному пути можно применить множество под-опций без необходимости многократного вызова defaultload(). Спасибо Алессио Богону за идею.

    References: #4736

  • [orm] [performance]

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

    References: #4775

  • [orm] [bug]

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

    References: #4773

  • [orm] [bug]

    Исправлена проблема, при которой метод _ORMJoin.join(), являющийся не используемым внутри ORM-уровня методом, раскрывающим то, что обычно является внутренним процессом Query.join(), некорректно распространял аргументы ключевых слов full и outerjoin. Pull request любезно предоставлен Денисом Катаевым.

    References: #4713

  • [orm] [bug]

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

    References: #4772

  • [orm] [bug]

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

    References: #4772

  • [orm] [bug]

    Исправлена ошибка, при которой синоним, созданный для еще не существующего отображенного атрибута, как это бывает, когда он ссылается на backref до настройки отображателей, вызывал ошибки рекурсии при попытке проверить наличие у него атрибутов, которые в итоге не существуют (как это происходит при запуске классов через Sphinx autodoc), так как ненастроенное состояние синонима приводило его в цикл attribute not found.

    References: #4767

engine

  • [engine] [bug]

    Исправлена ошибка, при которой использование функции отражения MetaData.reflect() с объектом Engine, к которому были применены опции выполнения, приводило к неудаче, поскольку полученный объект OptionEngine proxy не включал атрибут .engine, используемый в процедуре отражения.

    References: #4754

sql

  • [sql] [bug]

    Скорректирована инициализация для Enum, чтобы минимизировать частоту обращения к атрибуту .__members__ данного объекта перечисления PEP-435, для случая, когда обращение к этому атрибуту требует больших затрат, как в некоторых популярных сторонних библиотеках перечислений.

    References: #4758

  • [sql] [bug] [postgresql]

    Исправлена проблема, при которой конструкция array_agg в комбинации с FunctionElement.filter() не давала правильного предшествования операторов в комбинации с оператором индекса массива.

    References: #4760

  • [sql] [bug]

    Исправлена маловероятная проблема, когда процедура «соответствующий столбец» для объединений и других объектов _selectable.CompoundSelect могла возвращать неправильный столбец в некоторых ситуациях с перекрывающимися столбцами, что могло повлиять на некоторые операции ORM при использовании операций set, если базовые конструкции select() использовались ранее в других подобных процедурах, из-за того, что не было очищено кэшированное значение.

    References: #4747

postgresql

  • [postgresql] [usecase]

    Добавлена поддержка отражения индексов на разделенных таблицах PostgreSQL, которая была добавлена в PostgreSQL начиная с версии 11.

    References: #4771

  • [postgresql] [usecase]

    Добавлена поддержка литералов многомерных массивов Postgresql путем вложения объекта array внутрь другого объекта. Тип многомерного массива определяется автоматически.

    См.также

    array

    References: #4756

mysql

  • [mysql] [bug]

    Исправлена ошибка, при которой специальная логика отображения «NULL» для типа данных TIMESTAMP при nullable=True не работала, если тип данных столбца был TypeDecorator или Variant. Теперь логика обеспечивает разворачивание до исходного TIMESTAMP, чтобы это ключевое слово NULL в особом случае корректно отображалось при запросе.

    References: #4743

  • [mysql] [bug]

    Усовершенствован разбор строк версий MySQL/MariaDB для учета экзотических строк версий MariaDB, в которых слово «MariaDB» вписано среди других буквенно-цифровых символов, например, «MariaDBV1». Это обнаружение необходимо для корректной работы с функциями API, которые разделились между MySQL и MariaDB, например, системной переменной «transaction_isolation».

    References: #4624

sqlite

  • [sqlite] [usecase]

    Добавлена поддержка составных (кортежных) операторов IN с SQLite, за счет рендеринга ключевого слова VALUES для этого бэкенда. Поскольку известно, что другие бэкенды, такие как DB2, используют аналогичный синтаксис, он включен в базовый компилятор с помощью флага диалектного уровня tuple_in_values. Изменение также включает поддержку выражений «пустой кортеж IN» для SQLite при использовании «in_()» между значением кортежа и пустым множеством.

    References: #4766

mssql

  • [mssql] [bug]

    Убедились, что в запросах, используемых для отражения индексов и определений представлений, строковые параметры будут явно CAST в NVARCHAR, поскольку многие драйверы SQL Server часто рассматривают строковые значения, особенно те, которые содержат неаскриптивные символы или большие строковые значения, как TEXT, которые часто по какой-то причине некорректно сравниваются с символами VARCHAR в таблицах информационных схем SQL Server. Эти операции CAST уже выполняются при отражении запросов к таблицам SQL Server information_schema., но отсутствовали в трех дополнительных запросах к таблицам sys..

    References: #4745

1.3.5

Released: June 17, 2019

orm

  • [orm] [bug]

    Исправлена серия ошибок, связанных с наследованием объединенных таблиц на глубине более двух уровней в сочетании с изменением значений первичных ключей, когда столбцы первичных ключей также связаны между собой отношениями внешнего ключа, что характерно для наследования объединенных таблиц. Промежуточная таблица в трехуровневой иерархии наследования теперь получит UPDATE, если изменилось только значение первичного ключа и passive_updates=False (например, ограничения внешнего ключа не выполняются), тогда как раньше она пропускалась; аналогично, при passive_updates=True (например, действует ON UPDATE CASCADE) таблица третьего уровня не получит оператора UPDATE, как это было ранее, что привело бы к неудаче, поскольку CASCADE уже изменил ее. В связи с этим отношение, связанное с трехуровневой иерархией наследования по первичному ключу промежуточной таблицы объединенной иерархии наследования, также будет корректно обновлять свой столбец внешнего ключа при изменении первичного ключа родительского объекта, даже если этот родительский объект является подклассом связанного родительского класса, тогда как раньше такие классы не учитывались.

    References: #4723

  • [orm] [bug]

    Исправлена ошибка, при которой аксессор Mapper.all_orm_descriptors возвращал запись для самого Mapper под декларативным ключом __mapper__, когда это не являлось дескриптором. Теперь используется флаг .is_attribute, присутствующий на всех объектах InspectionAttr, который также был изменен на True для ассоциативного прокси, так как для этого объекта он ошибочно был установлен в False.

    References: #4729

  • [orm] [bug]

    Исправлена ошибка в Query.join(), при которой флаг aliased=True не мог правильно применить адаптацию клаузы к критериям фильтрации, если предыдущее присоединение было выполнено к той же сущности. Это происходило из-за того, что адаптеры располагались в неправильном порядке. Порядок был изменен таким образом, что приоритет имеет адаптер для самого последнего вызова aliased=True, как это было в версии 1.2 и более ранних. Это, в частности, привело к поломке примеров «elementtree».

    References: #4704

  • [orm] [bug] [py3k]

    Заменена подпрограмма совместимости с Python для функции getfullargspec() на полностью вендорную версию из Python 3.3. Первоначально Python выдавал предупреждения об устаревании этой функции в альфа-версии Python 3.8. Хотя это изменение было отменено, было замечено, что реализации Python 3 для getfullargspec() на порядок медленнее, чем в серии 3.4, где она была переписана на Signature. Хотя Python планирует улучшить эту ситуацию, в проектах SQLAlchemy пока используется простая замена, чтобы избежать проблем в будущем.

    References: #4674

  • [orm] [bug]

    Переработана механика атрибутов, используемая AliasedClass, чтобы больше не полагаться на вызов __getattribute__ на MRO обернутого класса, а вместо этого разрешать атрибут обычно на обернутом классе с помощью getattr(), а затем разворачивать/адаптировать его. Это позволяет использовать более широкий спектр стилей атрибутов в сопоставленном классе, включая специальные схемы __getattr__(), но при этом упрощает код и делает его более устойчивым в целом.

    References: #4694

sql

  • [sql] [bug]

    Исправлена серия проблем с цитированием, связанных с конструкцией literal_column(), которая при «передаче» через подзапрос метки, совпадающей с ее текстом, не применяла правила кавычек, даже если строка Label была задана как конструкция quoted_name. Неприменение кавычек к тексту Label является ошибкой, поскольку этот текст является строго именем SQL-идентификатора, а не SQL-выражением, и строка не должна иметь встроенных в нее кавычек, в отличие от literal_column(), к которому она может быть применена. Существующее поведение, при котором немаркированный literal_column() распространяется как есть вне подзапроса, сохраняется для того, чтобы помочь при использовании ручных схем кавычек, хотя в любом случае неясно, может ли быть сгенерирован корректный SQL для такой конструкции.

    References: #4730

postgresql

  • [postgresql] [usecase]

    Добавлена поддержка флагов сортировки столбцов при отражении индексов для PostgreSQL, включая ASC, DESC, NULLSFIRST, NULLSLAST. Также эта возможность добавлена в систему отражения в целом, что может быть применено к другим диалектам в будущих релизах. Pull request любезно предоставлен Eli Collins.

    References: #4717

  • [postgresql] [bug]

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

    References: #4701

mysql

  • [mysql] [bug]

    Исправлена ошибка, при которой MySQL ON DUPLICATE KEY UPDATE не принимал установку столбца в значение NULL. Pull request любезно предоставлен Лукашем Баничем (Lukáš Banič).

    References: #4715

1.3.4

Released: May 27, 2019

orm

  • [orm] [bug]

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

    References: #4695

  • [orm] [bug]

    Исправлена ошибка, из-за которой новая система ассоциативных прокси не проксировала гибридные атрибуты, когда они использовали декоратор @hybrid_property.expression для возврата альтернативного SQL-выражения, или когда гибрид возвращал произвольное PropComparator на уровне выражения. Это потребовало дальнейшего обобщения эвристики, используемой для определения типа проксируемого объекта на уровне QueryableAttribute, чтобы лучше определять, служит ли дескриптор в конечном итоге отображаемым классам или выражениям столбцов.

    References: #4690

  • [orm] [bug]

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

    References: #4686

  • [orm] [bug]

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

    References: #4647

  • [orm] [bug]

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

    References: #4676

engine

  • [engine] [bug] [postgresql]

    Переместили «откат», который происходит во время инициализации диалекта, так, чтобы он происходил после дополнительных шагов инициализации, специфичных для диалекта, в частности, для диалекта psycopg2, который непреднамеренно оставляет транзакционное состояние при первом новом соединении, что может помешать работе некоторых API, специфичных для psycopg2, которые требуют, чтобы транзакция не начиналась. Pull request любезно предоставлен Мэтью Уилксом.

    References: #4663

sql

  • [sql] [bug]

    Исправлено, что класс GenericFunction случайно регистрировал себя в качестве одной из именованных функций. Pull request любезно предоставлен Adrien Berchet.

    References: #4653

  • [sql] [bug]

    Исправлена проблема, при которой двойное отрицание в булевом столбце не сбрасывало оператор «NOT».

    References: #4618

  • [sql] [bug]

    Пространство имен GenericFunction переносится таким образом, чтобы поиск имен функций осуществлялся без учета регистра, поскольку функции SQL не сталкиваются при различии регистра, равно как и при использовании пользовательских функций или хранимых процедур. Поиск функций, объявленных с помощью GenericFunction, теперь осуществляется без учета регистра, однако поддерживается вариант, допускающий существование двух или более объектов GenericFunction с одним и тем же именем в разных регистрах, что приведет к поиску с учетом регистра для данного имени, при этом при регистрации функции будет выдаваться предупреждение. Спасибо Адриану Берше за большую работу над этой сложной функцией.

    References: #4569

postgresql

  • [postgresql] [bug] [orm]

    Исправлена проблема, при которой предупреждение «number of rows matched» выдавалось, даже если диалект сообщал «supports_sane_multi_rowcount=False», как в случае psycogp2 с use_batch_mode=True и других.

    References: #4661

mysql

  • [mysql] [bug]

    Добавлена поддержка ограничения 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

  • [mssql] [feature]

    Добавлена поддержка фильтрованных индексов SQL Server с помощью параметра mssql_where, который работает аналогично функции postgresql_where index в диалекте PostgreSQL.

    References: #4657

  • [mssql] [bug]

    Добавлен код ошибки 20047 в «is_disconnect» для pymssql. Pull request любезно предоставлен Jon Schuff.

    References: #4680

misc

  • [misc] [bug]

    Удален ошибочный символ «sqla_nose.py» из MANIFEST.in, который приводил к появлению нежелательного предупреждения.

    References: #4625

1.3.3

Released: April 15, 2019

orm

  • [orm] [bug]

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

    References: #4584

  • [orm] [bug]

    Скорректирован метод Query.filter_by(), который не вызывает внутри себя and() по нескольким критериям, а передает его в Query.filter() как серию критериев, а не один критерий. Это позволяет Query.filter_by() перейти к обработке переменного числа клаузул в Query.filter(), включая случай, когда список пуст. В этом случае объект Query не будет иметь .whereclause, что позволяет последующим методам «no whereclause», таким как Query.select_from(), вести себя последовательно.

    References: #4606

postgresql

  • [postgresql] [bug]

    Исправлена регрессия из релиза 1.3.2, связанная с использованием #4562, когда URL, содержащий только строку запроса и не имеющий имени хоста, например, для указания служебного файла с информацией о соединении, переставал корректно передаваться в psycopg2. Изменение в #4562 было скорректировано в соответствии с требованиями psycopg2, согласно которым при наличии каких-либо параметров подключения параметр «dsn» больше не требуется, поэтому в данном случае передаются только параметры строки запроса.

    References: #4601

mssql

  • [mssql] [bug]

    Исправлена проблема в диалекте SQL Server, когда при наличии связанного параметра в выражении ORDER BY, который в конечном итоге не отображался в версии оператора SQL Server, параметры все равно становились частью параметров выполнения, что приводило к ошибкам на уровне DBAPI. Pull request любезно предоставлен Matt Lewellyn.

    References: #4587

misc

  • [bug] [pool]

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

    References: #4585

  • [bug] [ext]

    Исправлена ошибка, при которой использование 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, 2019

orm

  • [orm] [bug] [ext]

    Восстановлена поддержка на уровне экземпляра простых дескрипторов Python, например, объектов @property, в сочетании с прокси ассоциаций, причем если проксируемый объект вообще не входит в область видимости ORM, то он классифицируется как «неоднозначный», но проксируется напрямую. Для доступа на уровне класса, базовый уровень класса``__get__()`` теперь возвращает AmbiguousAssociationProxyInstance напрямую, а не поднимает исключение, что является наиболее близким приближением к предыдущему поведению, которое возвращало сам AssociationProxy, насколько это возможно. Кроме того, улучшена структуризация этих объектов, чтобы они лучше описывали текущее состояние.

    References: #4573, #4574

  • [orm] [bug]

    Исправлена ошибка, при которой использование with_polymorphic() или другой псевдослужебной конструкции не адаптировалось должным образом, если псевдослужебная цель использовалась в качестве Select.correlate_except() цели подзапроса, используемого внутри column_property(). Это потребовало исправления механики адаптации клаузы для корректной работы с selectable, который отображается в списке «correlate except», аналогично тому, как это происходит с selectables, которые отображаются в списке «correlate». В конечном счете, это достаточно фундаментальная ошибка, которая существует уже давно, но с ней трудно столкнуться.

    References: #4537

  • [orm] [bug]

    Исправлена ошибка, при которой при попытке связать опцию отношения с AliasedClass без использования PropComparator.of_type() вместо этого выдавалось сообщение об ошибке AttributeError. Обратите внимание, что в версии 1.3 больше нельзя создавать путь к опции от простого отношения mapper к AliasedClass без использования PropComparator.of_type().

    References: #4566

sql

  • [sql] [bug] [documentation]

    Благодаря Методы TypeEngine bind_expression, column_expression работают с Variant, типами-спецификами нам больше не нужно полагаться на рецепты, которые напрямую подклассифицируют диалектные типы, TypeDecorator теперь может справиться со всеми случаями. Кроме того, благодаря этому изменению несколько снизилась вероятность того, что прямой подкласс базового типа SQLAlchemy будет работать так, как ожидается, что могло бы ввести в заблуждение. Документация была обновлена, чтобы использовать TypeDecorator для этих примеров, включая пример типа данных PostgreSQL «ArrayOfEnum», а прямая поддержка «подкласса типа напрямую» была удалена.

    References: #4580

postgresql

  • [postgresql] [feature]

    Добавлена поддержка URL без параметров для диалекта psycopg2, т.е. URL может быть передан в create_engine() как "postgresql+psycopg2://" без дополнительных аргументов для обозначения пустого DSN, передаваемого в libpq, который указывает на подключение к «localhost» без указания имени пользователя, пароля или базы данных. Pull request любезно предоставлен Julian Mehnle.

    References: #4562

  • [postgresql] [bug]

    Изменен параметр Select.with_for_update.of таким образом, что если передается join или другой составной selectable, то отдельные объекты Table будут отфильтровываться из него, что позволяет передавать в параметр объект join(), как это обычно происходит при использовании наследования объединенных таблиц с помощью ORM. Pull request любезно предоставлен Raymond Lu.

    References: #4550

1.3.1

Released: March 9, 2019

orm

  • [orm] [bug] [ext]

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

    References: #4522

mssql

  • [mssql] [bug]

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

    This change is also backported to: 1.2.19

    References: #4536

  • [mssql] [bug]

    Исправлена регрессия в отражении SQL Server, связанная с #4393, когда удаление открытого **kw из типа данных Float приводило к тому, что отражение этого типа не выполнялось из-за передачи аргумента «scale».

    References: #4525

1.3.0

Released: March 4, 2019

orm

  • [orm] [feature]

    Метод Query.get() теперь может принимать словарь ключей и значений атрибутов в качестве средства указания значения первичного ключа для загрузки; это особенно полезно для составных первичных ключей. Pull request любезно предоставлен Sanjana S.

    References: #4316

  • [orm] [feature]

    Теперь SQL-выражение может быть присвоено атрибуту первичного ключа ORM flush таким же образом, как и обычные атрибуты, как описано в Встраивание выражений вставки/обновления SQL в промывку, где выражение будет оценено и затем возвращено в ORM с помощью RETURNING, или, в случае pysqlite, работает с помощью атрибута cursor.lastrowid. Требуется либо база данных, поддерживающая RETURNING (например, Postgresql, Oracle, SQL Server), либо pysqlite.

    References: #3133

engine

  • [engine] [feature]

    Изменено форматирование для StatementError в строковом виде. Каждая деталь ошибки разбивается на несколько новых строк, а не выводится в одной строке. Кроме того, в SQL-представлении теперь строка SQL-оператора строится вместо repr(), так что новые строки отображаются как есть. Pull request любезно предоставлен Нейтом Кларком.

    References: #4500

sql

  • [sql] [bug]

    Класс Alias и связанные с ним подклассы CTE, Lateral и TableSample были переработаны таким образом, чтобы исключить возможность непосредственного конструирования объектов пользователем. Эти конструкции требуют использования для инстанцирования новых объектов автономной функции конструирования или метода selectable-bound.

    References: #4509

schema

  • [schema] [feature]

    Добавлены новые параметры Table.resolve_fks и MetaData.reflect.resolve_fks, которые при установке значения False отключают автоматическое отражение связанных таблиц, встречающихся в объектах ForeignKey, что позволяет как уменьшить накладные расходы на SQL для опущенных таблиц, так и избежать таблиц, которые не могут быть отражены по специфическим для базы данных причинам. Два объекта Table, находящиеся в одной коллекции MetaData, могут ссылаться друг на друга, даже если отражение двух таблиц происходило отдельно.

    References: #4517

1.3.0b3

Released: February 8, 2019

orm

  • [orm] [bug]

    Улучшено поведение with_polymorphic() в сочетании с опциями загрузчика, в частности, с операциями подстановочных знаков, а также с load_only(). Полиморфный объект будет более точно нацелен на то, чтобы опции уровня столбца сущности корректно вступали в силу. Проблема является продолжением тех же вещей, которые были исправлены в #4468.

    References: #4469

orm declarative

  • [orm] [declarative] [bug]

    Добавлены вспомогательные исключения, вызываемые при использовании отображения, основанного на AbstractConcreteBase, DeferredReflection или AutoMap, до того, как отображение будет готово к использованию, которые содержат описательную информацию о классе, а не переходят в другие режимы отказа, менее информативные.

    References: #4470

sql

  • [sql] [bug]

    Полностью устранено поведение, при котором строки, переданные непосредственно в качестве компонентов объекта select() или Query, автоматически приводились к конструкциям text(); теперь предупреждение выдается в виде ArgumentError или, в случае order_by() / group_by(), в виде CompileError. Предупреждение об этом выдается с версии 1.0, однако его наличие продолжает вызывать опасения по поводу возможности неправильного использования такого поведения.

    Обратите внимание, что для order_by() / group_by() были опубликованы публичные CVE, которые устранены данным фиксатором: CVE-2019-7164 CVE-2019-7548

    References: #4481

  • [sql] [bug]

    Кавычки применяются к именам Function, которые обычно, но не обязательно, генерируются из конструкции sqlalchemy.sql.expression.func, во время компиляции, если они содержат недопустимые символы, такие как пробелы или знаки препинания. При этом имена, как и раньше, считаются нечувствительными к регистру, т.е. если они содержат символы прописного или смешанного регистра, то это само по себе не приводит к кавычкам. В настоящее время нечувствительность к регистру сохраняется для обратной совместимости.

    References: #4467

  • [sql] [bug]

    Добавлена «проверка SQL-фразы» для ключевых DDL-фраз, которые принимаются как обычные строки, включая ForeignKeyConstraint.on_delete, ForeignKeyConstraint.on_update, ExcludeConstraint.using, ForeignKeyConstraint.initially, для областей, где ожидается только серия SQL-ключевых слов. Любые непробельные символы, указывающие на то, что фразу необходимо заключить в кавычки, будут вызывать ошибку CompileError. Это изменение связано с серией изменений, внесенных в рамках #4481.

    References: #4481

postgresql

  • [postgresql] [bug]

    Исправлена проблема, когда при использовании имени типа индекса (например, GIST, BTREE и т.д.) или ограничения EXCLUDE в верхнем регистре оно воспринималось как идентификатор, который необходимо взять в кавычки, а не отображалось как есть. Новое поведение преобразует эти типы в нижний регистр и гарантирует, что они содержат только допустимые символы SQL.

    References: #4473

tests

  • [tests] [change]

    В тестовой системе удалена поддержка Nose, который не поддерживается уже несколько лет и выдает предупреждения под Python 3. В настоящее время набор тестов стандартизирован на Pytest. Pull request любезно предоставлен Parth Shandilya.

    References: #4460

misc

  • [bug] [ext]

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

    References: #2642

1.3.0b2

Released: January 25, 2019

general

  • [general] [change]

    ``DeprecationWarning``Так как интерпретатор Python 3 по умолчанию отображает предупреждения об устаревании, а современные наборы тестов, основанные на таких инструментах, как tox и pytest, обычно отображают предупреждения об устаревании, это изменение должно облегчить выявление устаревших функций API. Основное обоснование этого изменения заключается в том, что давно устаревшие функции, которые, тем не менее, продолжают использоваться в реальной жизни, могут быть, наконец, удалены в ближайшем будущем; наиболее ярким примером этого являются классы SessionExtension и MapperExtension, а также несколько других хуков расширения preevent, которые были устаревшими с версии 0.7, но все еще остаются в библиотеке. Кроме того, планируется отменить несколько основных давно существующих моделей поведения, в том числе стратегию потокового локального движка, флаг convert_unicode и непервичные мапперы.

    References: #4393

orm

  • [orm] [feature]

    Реализована новая возможность: теперь конструкция AliasedClass может быть использована в качестве цели конструкции relationship(). Это позволяет отказаться от концепции «непервичных отображателей», так как AliasedClass гораздо проще настраивается и автоматически наследует все отношения отображаемого класса, а также сохраняет возможность нормальной работы опций загрузчика.

    References: #4423

  • [orm] [feature]

    Добавлено новое событие MapperEvents.before_mapper_configured(). Это событие дополняет другие события маппера этапа «configure» событием для каждого маппера, которое получает каждый Mapper непосредственно перед его шагом configure, и дополнительно может быть использовано для предотвращения или задержки конфигурирования определенных Mapper объектов с помощью нового возвращаемого значения interfaces.EXT_SKIP. Пример см. по ссылке в документации.

    References: #4397

  • [orm] [change]

    Добавлена новая функция close_all_sessions(), которая берет на себя задачу метода Session.close_all(), который теперь устарел, так как является непонятным методом класса. Pull request любезно предоставлен Augustin Trancart.

    References: #4412

  • [orm] [bug]

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

    References: #1103

  • [orm] [bug]

    Расширение исправления, впервые сделанного в #3287, когда опция загрузчика, сделанная для подкласса с использованием подстановочного знака, распространялась на применение подстановочного знака и к атрибутам суперклассов, до «связанной» опции загрузчика, например, в выражении Load(SomeSubClass).load_only('foo'). Столбцы, входящие в родительский класс SomeSubClass, также будут исключены так же, как и при использовании несвязанной опции load_only('foo').

    References: #4373

  • [orm] [bug]

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

    References: #4433

  • [orm] [bug]

    Событие «remove» для коллекций теперь вызывается до удаления элемента в случае метода collection.remove(), что соответствует поведению для большинства других форм удаления элементов коллекции (таких как __delitem__, замена при __setitem__). Для методов pop() событие remove по-прежнему срабатывает после выполнения операции.

  • [orm] [bug] [engine]

    В Core и ORM добавлены аксессоры для опций выполнения через Query.get_execution_options(), Connection.get_execution_options(), Engine.get_execution_options() и Executable.get_execution_options(). PR любезно предоставлен Дэниелом Листером.

    References: #4464

  • [orm] [bug]

    Исправлена проблема в ассоциативном прокси, связанная с #3423, из-за которой использование пользовательских объектов PropComparator с гибридными атрибутами, как в примере dictlike-polymorphic, не работало в ассоциативном прокси. Строгость, которая была добавлена в #3423, была ослаблена, и добавлена дополнительная логика для учета ассоциативного прокси, связанного с пользовательским гибридом.

    References: #4446

  • [orm] [bug]

    Реализован метод .get_history(), предполагающий также наличие AttributeState.history, для атрибутов synonym(). Ранее попытка получить доступ к истории атрибутов через синоним приводила к появлению ошибки AttributeError.

    References: #3777

orm declarative

  • [bug] [orm declarative]

    В ColumnProperty добавлен метод __clause_element__(), который может позволить использовать не полностью объявленный столбец или отложенный атрибут в декларативном сопоставленном классе несколько более дружелюбно, когда он используется в ограничении или другом ориентированном на столбец сценарии внутри объявления класса, хотя это все еще не может работать в открытых выражениях; лучше вызывать атрибут ColumnProperty.expression при получении TypeError.

    References: #4372

engine

  • [engine] [feature]

    Добавлен публичный аксессор QueuePool.timeout(), возвращающий настроенный таймаут для объекта QueuePool. Pull request любезно предоставлен Ириной Деламаре.

    References: #3689

  • [engine] [change]

    Стратегия движка «threadlocal», унаследованная от SQLAlchemy примерно с версии 0.2, теперь устарела, как и параметр Pool.threadlocal Pool, который не имеет никакого значения в большинстве современных случаев использования.

    References: #4393

sql

  • [sql] [feature]

    Внесены изменения в класс AnsiFunction, являющийся основой таких распространенных SQL-функций, как CURRENT_TIMESTAMP, чтобы он принимал позиционные аргументы как обычная специальная функция. Это сделано для того, чтобы многие из этих функций на специфических бэкендах принимали аргументы типа точности «дробные секунды» и т.п. Если функция создана с аргументами, то она выводит скобки и аргументы. Если аргументы отсутствуют, то компилятор генерирует непарентезированную форму.

    References: #4386

  • [sql] [change]

    Параметры 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

  • [mssql] [bug]

    Для типов данных literal_processor для Unicode и UnicodeText теперь перед литеральным строковым выражением выводится символ N, как того требует SQL Server для строковых значений Unicode, выводимых в SQL-выражениях.

    References: #4442

misc

  • [bug] [ext]

    В версии 1.3.0b1 исправлена ошибка #3423, из-за которой объекты прокси ассоциации, обращающиеся к атрибуту, который присутствует только в полиморфном подклассе, вызывали ошибку AttributeError, даже если реальный экземпляр, к которому осуществляется обращение, являлся экземпляром этого подкласса.

    References: #4401

1.3.0b1

Released: November 16, 2018

orm

  • [orm] [feature]

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

    This change is also backported to: 1.2.5

  • [orm] [feature]

    В метод Session.bulk_save_objects() добавлен новый флаг Session.bulk_save_objects.preserve_order, который по умолчанию принимает значение True. При значении False заданные отображения будут сгруппированы на вставки и обновления по каждому типу объектов, что позволит расширить возможности пакетной обработки общих операций. Pull request любезно предоставлен Alessandro Cucci.

  • [orm] [feature]

    Стратегия загрузчика «selectin» теперь не использует JOIN в случае простой загрузки «один ко многим», а загружает данные только из связанной таблицы, полагаясь на столбцы внешних ключей связанной таблицы, чтобы они совпадали с первичными ключами родительской таблицы. Эту оптимизацию можно отключить, установив флаг relationship.omit_join в значение False. Большое спасибо Джейсону Рейсу за проделанную работу.

    References: #4340

  • [orm] [feature]

    В класс InstanceState добавлен словарь .info - объект, получаемый при вызове inspect() на сопоставленном объекте.

    References: #4257

  • [orm] [bug]

    Исправлена ошибка, при которой использование конструкции 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

  • [orm] [bug]

    Исправлена проблема, связанная с passive_deletes=»all», когда атрибут внешнего ключа объекта сохранял свое значение даже после удаления объекта из родительской коллекции. Ранее единица работы устанавливала это значение в NULL, даже если passive_deletes указывал, что его не следует изменять.

    References: #3844

  • [orm] [bug]

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

    References: #4359

  • [orm] [bug] [mysql] [postgresql]

    ORM теперь удваивает предложение «FOR UPDATE» в подзапросе, который в некоторых случаях выполняется совместно с объединенной ускоренной загрузкой, так как было замечено, что MySQL не блокирует строки из подзапроса. Это означает, что запрос отображается с двумя предложениями FOR UPDATE; обратите внимание, что в некоторых бэкендах, таких как Oracle, предложения FOR UPDATE в подзапросах молча игнорируются, поскольку они не нужны. Кроме того, в случае с предложением «OF», используемым в основном в PostgreSQL, FOR UPDATE выводится только во внутреннем подзапросе, когда он используется для того, чтобы selectable мог быть направлен на таблицу в операторе SELECT.

    References: #4246

  • [orm] [bug]

    Рефакторинг Query.join() для дальнейшего уточнения отдельных компонентов структурирования присоединения. Этот рефактор добавляет возможность для Query.join() определять наиболее подходящую «левую» сторону соединения, если в списке FROM имеется более одного элемента или запрос выполняется к нескольким сущностям. Если совпадает более одного FROM/сущности, то выдается ошибка, требующая указать предложение ON для разрешения неоднозначности. В частности, это касается регрессии, которую мы видели в #4363, но также имеет и общее применение. Теперь кодовые пути внутри Query.join() стали более понятными, а случаи ошибок определяются более конкретно на более ранних этапах работы.

    References: #4365

  • [orm] [bug]

    Исправлена давняя проблема в Query, когда скалярный подзапрос, создаваемый Query.exists(), Query.as_scalar() и другими производными от Query.statement, некорректно адаптировался при использовании в новом Query, требующем адаптации сущности, например, при превращении запроса в объединение, или в from_self(), и т.д. Данное изменение удаляет аннотацию «без адаптации» из объекта select(), создаваемого аксессором Query.statement.

    References: #4304

  • [orm] [bug]

    Информативное исключение возникает, когда значение первичного ключа не сортируется в Python во время ORM flush под Python 3, например, Enum, не имеющий метода __lt__(); обычно Python 3 в этом случае выдает TypeError. Процесс flush сортирует постоянные объекты по первичному ключу в Python, поэтому значения должны быть сортируемыми.

    References: #4232

  • [orm] [bug]

    Удален конвертер коллекций, используемый классом MappedCollection. Этот конвертер использовался только для проверки соответствия входящих ключей словаря ключам соответствующих объектов и только во время операции bulk set. Конвертер может помешать работе пользовательского валидатора или AttributeEvents.bulk_replace() слушателя, который захочет преобразовывать входящие значения дальше. Убрана ошибка TypeError, которая возникала бы при несовпадении входящего ключа со значением; входящие значения при массовом присваивании будут привязываться к ключу, сгенерированному значением, а не к ключу, явно присутствующему в словаре.

    В целом, @converter вытеснен обработчиком событий AttributeEvents.bulk_replace(), добавленным в состав #3896.

    References: #3604

  • [orm] [bug]

    Добавлено новое поведение ленивой загрузки при получении «старого» значения many-to-one, в результате чего исключения, которые были бы вызваны либо lazy="raise", либо ошибкой отсоединенной сессии, пропускаются.

    References: #4353

  • [orm] [bug]

    По давнему недосмотру ORM метод __delete__ для отношений «многие-к-одному» был нефункционален, например, для такой операции, как del a.b. Теперь это реализовано и эквивалентно установке атрибута в значение None.

    References: #4354

orm declarative

  • [orm] [declarative] [bug]

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

    References: #4133

engine

  • [engine] [feature]

    В QueuePool добавлен новый режим «lifo», который обычно включается установкой флага create_engine.pool_use_lifo в значение True. Режим «lifo» означает, что то же самое соединение, которое только что было проверено, будет первым проверено снова, что позволяет очищать лишние соединения со стороны сервера в периоды, когда пул используется лишь частично. Pull request любезно предоставлен Таем Парком.

sql

  • [sql] [feature]

    Рефакторинг 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

  • [sql] [feature]

    В систему «string SQL» добавлена функция Sequence, которая при стрингейтинге без диалекта оператора, включающего выражение «sequence nextvalue», выводит осмысленное строковое выражение ("<next sequence value: my_sequence>"), а не приводит к ошибке компиляции.

    References: #4144

  • [sql] [feature]

    Добавлены новые лексемы column_0N_name, column_0_N_name и т.д., которые выводят имена / ключи / метки для всех столбцов, на которые ссылается конкретное ограничение, в виде последовательности. Для того чтобы учесть длину такого соглашения об именовании, функция автоматического усечения в компиляторе SQL теперь применяется и к именам ограничений, что позволяет создать сокращенное, детерминированное имя ограничения, которое будет применимо к целевому бэкенду без превышения лимита символов этого бэкенда.

    Изменения также устраняют две другие проблемы. Одна из них заключается в том, что маркер column_0_key был недоступен, хотя этот маркер был задокументирован, другая - в том, что маркер referred_column_0_name случайно приводил к отображению .key, а не .name столбца, если эти два значения были разными.

    References: #3989

  • [sql] [feature]

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

    References: #4271

  • [sql] [feature]

    Теперь для объекта «свойства» SQLAlchemy, например, коллекции столбцов Core, поддерживается встроенная строка Python dir() (например, .c), mapper.attrs и т.д. Позволяет также работать автозаполнению iPython. Pull request любезно предоставлен Уве Корном.

  • [sql] [feature]

    Добавлена новая возможность FunctionElement.as_comparison(), позволяющая SQL-функции выступать в качестве операции бинарного сравнения, которая может работать в рамках ORM.

    References: #3831

  • [sql] [bug]

    В качестве операторов сравнения добавлены операторы на основе «like», включая ColumnOperators.startswith() ColumnOperators.endswith() ColumnOperators.ilike() ColumnOperators.notilike() и многие другие, так что все эти операторы могут быть положены в основу условия ORM «primaryjoin».

    References: #4302

  • [sql] [bug]

    Исправлена проблема с методами TypeEngine.bind_expression() и TypeEngine.column_expression(), когда эти методы не работали, если целевой тип был частью Variant или другим целевым типом TypeDecorator. Кроме того, компилятор SQL теперь обращается к реализации на уровне диалекта при отображении этих методов, так что диалекты теперь могут обеспечивать обработку встроенных типов на уровне SQL.

    References: #3981

postgresql

  • [postgresql] [feature]

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

    This change is also backported to: 1.2.7

    References: #4160

  • [postgresql] [feature]

    Добавлена рудиментарная поддержка отражения разделенных таблиц PostgreSQL, например, добавление relkind=“p“ в запросы на отражение, возвращающие информацию о таблице.

    References: #4237

mysql

  • [mysql] [feature]

    Добавлена поддержка синтаксиса «WITH PARSER» для CREATE FULLTEXT INDEX в MySQL, использующего аргумент ключевого слова mysql_with_parser. Также поддерживается рефлексия, которая позволяет использовать специальный формат комментариев MySQL для создания отчетов по этой опции. Кроме того, префиксы индексов «FULLTEXT» и «SPATIAL» теперь отражаются обратно в индексную опцию mysql_prefix.

    References: #4219

  • [mysql] [feature]

    Добавлена поддержка упорядочивания параметров в операторе ON DUPLICATE KEY UPDATE на MySQL, поскольку порядок параметров в предложении MySQL UPDATE имеет значение, аналогично тому, как это описано в Упорядоченные по параметрам обновления. Pull request любезно предоставлен Максимом Бублисом.

  • [mysql] [feature]

    Функция «pre-ping» пула соединений теперь использует метод ping() для соединения DBAPI в случае mysqlclient, PyMySQL и mysql-connector-python. Pull request любезно предоставлен Максимом Бублисом.

sqlite

  • [sqlite] [feature]

    Добавлена поддержка json-функционала SQLite через новую реализацию SQLite для JSON, JSON. В качестве имени типа используется JSON, в соответствии с примером, найденным в собственной документации SQLite. Pull request любезно предоставлен Ilja Everilä.

    References: #3850

  • [sqlite] [feature]

    Реализовано предложение SQLite ON CONFLICT, понимаемое на уровне DDL, например, для ограничений primary key, unique и CHECK, а также заданное на Column для удовлетворения inline primary key и NOT NULL. Pull request любезно предоставлен Денисом Катаевым.

    References: #4360

mssql

  • [mssql] [feature]

    В диалект SQL Server pyodbc добавлен параметр fast_executemany=True, позволяющий использовать одноименную новую функцию производительности pyodbc при использовании драйверов Microsoft ODBC.

    References: #4158

  • [mssql] [bug]

    Отменено использование Sequence с SQL Server для влияния на «начало» и «приращение» значения IDENTITY, в пользу новых параметров mssql_identity_start и mssql_identity_increment, которые задают эти параметры напрямую. Параметры Sequence будут использованы для генерации реального CREATE SEQUENCE DDL с SQL Server в одном из будущих выпусков.

    References: #4362

oracle

  • [oracle] [feature]

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

    This change is also backported to: 1.2.9

    References: #4290

  • [oracle] [bug]

    Обновлены параметры, которые могут быть переданы в cx_Oracle DBAPI, с учетом всех текущих параметров, а также будущих параметров, которые еще не добавлены. Кроме того, удалены неиспользуемые параметры, которые были устаревшими в версии 1.2, а для параметра «threaded» по умолчанию установлено значение False.

    References: #4369

  • [oracle] [bug]

    Диалект 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

  • [feature] [ext]

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

    This change is also backported to: 1.2.9

    References: #4243

  • [feature] [ext]

    Добавлена новая функция BakedQuery.to_query(), которая позволяет использовать один BakedQuery в качестве подзапроса внутри другого BakedQuery без необходимости явного обращения к Session.

    References: #4318

  • [feature] [ext]

    В AssociationProxy теперь доступны стандартные операции сравнения столбцов, такие как ColumnOperators.like() и ColumnOperators.startswith(), когда целевым атрибутом является обычный столбец - выражение EXISTS, которое присоединяется к целевой таблице, отображается как обычно, но выражение столбца затем используется в критерии WHERE этого EXISTS. Обратите внимание, что при этом изменяется поведение метода .contains() на прокси ассоциации, чтобы использовать ColumnOperators.contains() при использовании для атрибута, основанного на столбце.

    References: #4351

  • [feature] [ext]

    В класс ShardedQuery в рамках расширения горизонтального шардинга добавлена поддержка массовых Query.update() и Query.delete(). Это также добавляет дополнительный крючок расширения к методам массового обновления/удаления Query._execute_crud().

    References: #4196

  • [bug] [ext]

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

    References: #3423

  • [bug] [ext]

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

    References: #4268

  • [bug] [ext]

    Исправлены многочисленные проблемы, связанные с деассоциацией скалярных объектов с ассоциативным прокси. Теперь работает del, а также добавлен новый флаг AssociationProxy.cascade_scalar_deletes, который при установке в True указывает, что установка скалярного атрибута в None или удаление через del также установит исходную ассоциацию в None.

    References: #4308

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