0.9 Changelog

0.9.10

Released: July 22, 2015

orm

  • [orm] [feature]

    В словари, возвращаемые командой Query.column_descriptions, добавлена новая запись "entity". Она относится к первичному отображаемому классу ORM или псевдоклассу, на который ссылается выражение. По сравнению с существующей записью для "type", это всегда будет сопоставленная сущность, даже если она извлечена из столбцового выражения, или None, если данное выражение является чистым выражением ядра. См. также #3403, в котором исправлена регрессия в этой функции, которая не была выпущена в версии 0.9.10, но была выпущена в версии 1.0.

    References: #3320

  • [orm] [bug]

    Query не поддерживает объединения, подселекты или специальные предложения FROM при использовании методов Query.update() или Query.delete(); вместо того чтобы молча игнорировать эти поля, если были вызваны методы типа Query.join() или Query.select_from(), выдается предупреждение. Начиная с версии 1.0.0b5 это приведет к ошибке.

    References: #3349

  • [orm] [bug]

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

    References: #3352

engine

  • [engine] [bug]

    В качестве синонима параметра None добавлено строковое значение "none", принимаемое параметром Pool.reset_on_return, так что строковые значения могут использоваться для всех параметров, что позволяет без проблем использовать утилиты типа engine_from_config().

    References: #3375

sql

  • [sql] [feature]

    Добавлена официальная поддержка CTE, используемого SELECT, присутствующего внутри Insert.from_select(). Такое поведение случайно работало до версии 0.9.9, когда оно перестало работать из-за не связанных с этим изменений в составе #3248. Заметим, что в данном случае предложение WITH отображается после INSERT и перед SELECT; полная функциональность CTE, отображаемых на верхнем уровне INSERT, UPDATE, DELETE, - это новая возможность, которая будет реализована в более позднем выпуске.

    References: #3418

  • [sql] [bug]

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

    References: #3362

postgresql

  • [postgresql] [bug]

    Исправлена давняя ошибка, при которой тип Enum, используемый в диалекте psycopg2 в сочетании со значениями, отличными от аскии и native_enum=False, не мог правильно декодировать возвращаемые результаты. Это было связано с тем, что тип PG ENUM раньше был отдельным типом без опции «non native».

    References: #3354

mysql

  • [mysql] [bug] [pymysql]

    Исправлена поддержка юникода для PyMySQL при использовании операции «executemany» с юникодными параметрами. Теперь SQLAlchemy передает как оператор, так и связанные параметры в виде юникодных объектов, поскольку PyMySQL обычно использует внутреннюю интерполяцию строк для создания конечного оператора, а в случае executemany выполняет шаг «кодирования» только для конечного оператора.

    References: #3337

  • [mysql] [bug] [py3k]

    Исправлен тип BIT на Py3K, который некорректно использовал функцию ord(). Pull request любезно предоставлен Дэвидом Марином.

    References: #3333

sqlite

  • [sqlite] [bug]

    Исправлена ошибка в диалекте SQLite, при которой отражение UNIQUE-ограничений, включающих в имена неалфавитные символы, например точки или пробелы, не отражалось их именем.

    References: #3495

tests

  • [tests] [bug] [pypy]

    Исправлен импорт, не позволявший корректно работать с файлом «pypy setup.py test».

    References: #3406

misc

  • [bug] [ext]

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

    References: #3408

  • [bug] [ext]

    Исправлена регрессия из 0.9.9, при которой из пространства имен sqlalchemy.ext.declarative удалялся символ as_declarative().

    References: #3324

0.9.9

Released: March 10, 2015

orm

  • [orm] [feature]

    Добавлен новый параметр Session.connection.execution_options, который может быть использован для установки опций выполнения для Connection при первой проверке, до начала транзакции. Это используется для настройки таких параметров, как уровень изоляции соединения перед началом транзакции.

    См.также

    Настройка уровней изоляции транзакций / DBAPI AUTOCOMMIT - новый раздел документации, в котором подробно описаны лучшие практики настройки изоляции транзакций с помощью сессий.

    References: #3296

  • [orm] [feature]

    Добавлен новый метод Session.invalidate(), функционирующий аналогично Session.close(), за исключением того, что он вызывает Connection.invalidate() для всех соединений, гарантируя, что они не будут возвращены в пул соединений. Это полезно в ситуациях, например, при работе с таймаутами gevent, когда дальнейшее использование соединения небезопасно, даже для отката.

  • [orm] [bug]

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

    References: #3310

  • [orm] [bug]

    Исправлена ошибка, при которой внутреннее утверждение не выполнялось в случае, когда обработчик after_rollback() для Session некорректно добавляет состояние к этому Session внутри обработчика, а задание на предупреждение и удаление этого состояния (установленное #2389) пытается продолжить работу.

    References: #3309

  • [orm] [bug]

    Исправлена ошибка, когда при вызове Query.join() с неизвестными аргументами kw возникала собственная ошибка TypeError, связанная с нарушением форматирования. Pull request любезно предоставлен Malthe Borch.

  • [orm] [bug]

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

    References: #3300

  • [orm] [bug]

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

    References: #3287

  • [orm] [bug] [pypy]

    Исправлена ошибка, из-за которой, если исключение возникало в начале Query до получения результатов, особенно когда процессоры строк не могут быть сформированы, курсор оставался открытым с ожиданием результатов и фактически не закрывался. Обычно это является проблемой только в интерпретаторах типа PyPy, где курсор не сразу обрабатывается GC, и в некоторых случаях может привести к тому, что транзакции/блокировки будут открыты дольше, чем это желательно.

    References: #3285

  • [orm] [bug]

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

    References: #3251

  • [orm] [bug] [sqlite]

    Исправлена ошибка, связанная с мутацией выражений, которая могла проявляться в виде ошибки «Could not locate column» при использовании Query для выбора из нескольких анонимных колонок при запросе к SQLite, что являлось побочным эффектом функции «join rewriting», используемой диалектом SQLite.

    References: #3241

  • [orm] [bug]

    Исправлена ошибка, при которой в предложении ON для Query.join() и Query.outerjoin() к подклассу с одним наследованием, использующему of_type(), не выводился «критерий одной таблицы» в предложении ON, если был установлен флаг from_joinpoint=True.

    References: #3232

examples

  • [examples] [bug]

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

  • [examples] [bug]

    Исправлена ошибка в примере examples/generic_associations/discriminator_on_association.py, когда подклассы AddressAssociation не отображались как «однотабличное наследование», что приводило к проблемам при дальнейшей попытке использования отображений.

engine

  • [engine] [feature]

    Добавлены новые аксессоры пользовательского пространства для просмотра уровней изоляции транзакций; Connection.get_isolation_level(), Connection.default_isolation_level.

  • [engine] [bug]

    Исправлена ошибка в Connection и пуле, когда метод Connection.invalidate() или аннулирование из-за разъединения базы данных при использовании параметра isolation_level с параметром Connection.execution_options() приводили к ошибке; при этом «финализатор», сбрасывающий уровень изоляции, вызывался на уже не открытом соединении.

    References: #3302

  • [engine] [bug]

    Предупреждение выдается, если параметр isolation_level используется с Connection.execution_options() при наличии Transaction; DBAPI и/или диалекты SQLAlchemy, такие как psycopg2, MySQLdb, могут неявно откатить или зафиксировать транзакцию, или не изменять настройку до следующей транзакции, так что это никогда не будет безопасно.

    References: #3296

sql

  • [sql] [bug]

    Добавлен флаг native_enum для вывода __repr__() из Enum, что особенно важно при использовании его с автогенератором Alembic. Pull request любезно предоставлен Dimitris Theodorou.

  • [sql] [bug]

    Исправлена ошибка, при которой использование TypeDecorator, реализующего тип, который также является TypeDecorator, приводило к ошибке Python «Cannot create a consistent method resolution order (MRO)», когда к объекту, использующему этот тип, применялось любое выражение сравнения SQL.

    References: #3278

  • [sql] [bug]

    Исправлена проблема, при которой столбцы из SELECT, встроенного в INSERT, либо через предложение values, либо как «from select», загрязняли типы столбцов, используемые в наборе результатов, формируемом предложением RETURNING, когда столбцы из обоих операторов имели одинаковые имена, что приводило к потенциальным ошибкам или неправильной адаптации при извлечении возвращаемых строк.

    References: #3248

schema

  • [schema] [bug]

    Исправлена ошибка в системе настройки внешних ключей в 0.9, из-за которой логика, используемая для связи ForeignKey с его родителем, могла не работать, когда внешний ключ использовал «link_to_name=True» в сочетании с целевым Table, который получал свой родительский столбец только позже, например, в сценарии reflection + «useexisting», если целевой столбец фактически имел значение ключа, отличное от его имени, как это происходит в reflection, если события column reflect используются для изменения . ключа отражаемых объектов Column таким образом, что ссылка_на_имя становится значимой. Также была исправлена поддержка типа столбца через передачу FK аналогичным образом, когда целевые столбцы имели другой ключ и на них ссылались с помощью link_to_name.

    References: #1765, #3298

postgresql

  • [postgresql] [feature]

    Добавлена поддержка ключевого слова CONCURRENTLY с индексами PostgreSQL, устанавливаемыми с помощью postgresql_concurrently. Pull request любезно предоставлен Iuri de Silvio.

  • [postgresql] [bug]

    Исправлена поддержка типов PostgreSQL UUID в сочетании с типом ARRAY при использовании psycopg2. Диалект psycopg2 теперь использует хук psycopg2.extras.register_uuid(), благодаря чему значения UUID всегда передаются в/из DBAPI как объекты UUID(). Флаг UUID.as_uuid по-прежнему соблюдается, только в psycopg2 при его отключении необходимо преобразовывать возвращаемые UUID-объекты обратно в строки.

    References: #2940

  • [postgresql] [bug]

    Добавлена поддержка типа данных postgresql.JSONB при использовании psycopg2 2.5.4 и выше, в котором реализована нативная конвертация данных JSONB, поэтому конвертеры SQLAlchemy должны быть отключены; дополнительно добавлено расширение psycopg2 extras.register_default_jsonb, которое используется для установки десериализатора JSON, передаваемого диалекту через аргумент json_deserializer. Также исправлены тесты интеграции с PostgreSQL, которые на самом деле обходили тип JSONB, а не JSON. Pull request любезно предоставлен Матеушем Сусиком.

  • [postgresql] [bug]

    Исправлено использование флага «array_oid» при регистрации типа HSTORE на старых версиях psycopg2 < 2.4.3, не поддерживающих этот флаг, а также использование хука нативного json-сериализатора «register_default_json» с пользовательским значением json_deserializer на psycopg2 версии < 2.5, не включающей нативный json.

  • [postgresql] [bug]

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

    References: #3174

mysql

  • [mysql] [change]

    Диалект gaerdbms больше не нужен и выдает предупреждение об устаревании. Теперь Google рекомендует использовать диалект MySQLdb напрямую.

    References: #3275

  • [mysql] [bug]

    Добавлена проверка версии диалекта MySQLdb, окружающая проверку колляции „utf8_bin“, так как на сервере MySQL < 5.0 она не работает.

    References: #3274

sqlite

  • [sqlite] [feature]

    Добавлена поддержка частичных индексов (например, с предложением WHERE) на SQLite. Pull request любезно предоставлен Каем Гронером.

  • [sqlite] [feature]

    Добавлен новый бэкенд SQLite для бэкенда SQLCipher. Этот бэкенд обеспечивает шифрование баз данных SQLite с помощью Python-драйвера pysqlcipher, который очень похож на драйвер pysqlite.

    См.также

    pysqlcipher

misc

  • [bug] [ext] [py3k]

    Исправлена ошибка, из-за которой класс association proxy list некорректно интерпретировал срезы под Py3K. Pull request любезно предоставлен Gilles Dartiguelongue.

0.9.8

Released: October 13, 2014

orm

  • [orm] [bug] [engine]

    Исправлена ошибка, затрагивавшая в целом те же классы событий, что и при использовании параметра #3199, когда использовался параметр named=True. Некоторые события не регистрировались, а другие некорректно вызывали аргументы события, как правило, в том случае, если событие было «обернуто» для адаптации каким-либо другим способом. Механика «именования» была изменена таким образом, чтобы не мешать сигнатуре аргументов, ожидаемой внутренними функциями-обертками.

    References: #3197

  • [orm] [bug]

    Исправлена ошибка, затрагивающая многие классы событий, в частности, события ORM, а также события движка, когда обычная логика «де-дублирования» избыточного вызова listen() с теми же аргументами не срабатывала для тех событий, где функция слушателя обернута. Утверждение должно было быть сбито в файле registry.py. Теперь это утверждение интегрировано в проверку дедупликации, что позволяет упростить проверку дедупликации в целом.

    References: #3199

  • [orm] [bug]

    Исправлено предупреждение, которое выдавалось, если сложный самореферентный primaryjoin содержал функции, и при этом была указана remote_side; предупреждение предлагало установить «remote side». Теперь оно выдается только в том случае, если remote_side отсутствует.

    References: #3194

orm declarative

  • [orm] [declarative] [bug]

    Исправлена ошибка «„NoneType“ объект не имеет атрибута „concrete“» при использовании AbstractConcreteBase совместно с подклассом, в котором объявлен __abstract__.

    References: #3185

engine

  • [engine] [bug]

    Опции выполнения, передаваемые в Engine через create_engine.execution_options или Engine.update_execution_options(), не передаются в специальный Connection, используемый для инициализации диалекта в событии «первое подключение»; обычно диалекты выполняют собственные запросы на этом этапе, и ни одна из имеющихся опций не должна применяться здесь. В частности, опция «autocommit» приводила к тому, что попытка автокоммита в этом начальном соединении завершалась с ошибкой AttributeError из-за нестандартного состояния Connection.

    References: #3200

  • [engine] [bug]

    Строковые ключи, используемые для определения столбцов, на которые оказывается воздействие при INSERT или UPDATE, теперь сортируются, когда они вносят вклад в ключ кэша «скомпилированный кэш». Ранее эти ключи не были детерминированно упорядочены, что означало, что один и тот же оператор мог быть кэширован несколько раз по эквивалентным ключам, что приводило к затратам как памяти, так и производительности.

    References: #3165

sql

  • [sql] [bug]

    Исправлена ошибка, из-за которой большое количество SQL-элементов в пакете sql не могли успешно выполнить __repr__() из-за отсутствия атрибута description, что приводило к переполнению рекурсии, когда внутренняя ошибка AttributeError вызывала __repr__().

    References: #3195

  • [sql] [bug]

    Настроено отражение таблицы/индекса таким образом, что если индекс сообщает о столбце, который не обнаружен в таблице, то выдается предупреждение и столбец пропускается. Это может происходить в некоторых особых ситуациях с системными столбцами, как это наблюдалось в Oracle.

    References: #3180

  • [sql] [bug]

    Исправлена ошибка в CTE, когда аргумент компилятора literal_binds не всегда корректно распространялся, когда один CTE ссылался на другой алиасированный CTE в операторе.

    References: #3154

  • [sql] [bug]

    Исправлена регрессия 0.9.7, вызванная использованием #3067 в сочетании с неправильно названным юнит-тестом, в результате чего так называемые «схемные» типы, такие как Boolean и Enum, больше не могли быть замаринованы.

    References: #3067, #3144

postgresql

  • [postgresql] [feature] [pg8000]

    Добавлена поддержка «вменяемого подсчета нескольких строк» в драйвере pg8000, что в основном относится к использованию версионности в ORM. Функция определяется по версии используемого драйвера pg8000 1.9.14 или выше. Pull request любезно предоставлен Tony Locke.

  • [postgresql] [bug]

    Возвращаясь к этой проблеме, впервые исправленной в 0.9.5, следует отметить, что, по-видимому, аксессор psycopg2 .closed не так надежен, как мы предполагали, поэтому мы добавили явную проверку на наличие сообщений исключений «SSL SYSCALL error: Bad file descriptor» и «SSL SYSCALL error: EOF detected» при обнаружении сценария is-disconnect. В качестве первой проверки мы продолжим обращаться к файлу connection.closed в psycopg2.

    References: #3021

  • [postgresql] [bug]

    Исправлена ошибка, при которой тип PostgreSQL JSON не мог сохранить или иным образом отобразить значение столбца SQL NULL, а не JSON-кодировку 'null'. Для поддержки этого случая изменения заключаются в следующем:

    • Теперь можно указать значение null(), которое всегда будет приводить к NULL-значению в результате выполнения оператора.

    • Добавлен новый параметр JSON.none_as_null, который при значении True указывает, что значение Python None должно сохраняться как SQL NULL, а не как JSON-кодировка 'null'.

    Получение NULL как None также исправлено для DBAPI, отличных от psycopg2, а именно pg8000.

    References: #3159

  • [postgresql] [bug]

    Система обёртывания исключений для ошибок DBAPI теперь может работать с нестандартными исключениями DBAPI, такими как psycopg2 TransactionRollbackError. Теперь эти исключения будут вызываться с использованием ближайшего доступного подкласса в sqlalchemy.exc, в случае TransactionRollbackError - sqlalchemy.exc.OperationalError.

    References: #3075

  • [postgresql] [bug]

    Исправлена ошибка в объекте array, когда при сравнении с обычным списком Python не использовался корректный конструктор массива. Pull request любезно предоставлен Andrew.

    References: #3141

  • [postgresql] [bug]

    Добавлен поддерживаемый метод FunctionElement.alias() в функции, например, в конструкцию func. Ранее поведение этого метода было неопределенным. Текущее поведение имитирует поведение до версии 0.9.4. Функция превращается в одноколоночное предложение FROM с заданным именем псевдонима, где сам столбец является анонимным.

    References: #3137

mysql

  • [mysql] [bug] [mysqlconnector]

    Mysqlconnector начиная с версии 2.0, вероятно, как побочный эффект слияния с python 3, теперь не ожидает, что знаки процента (например, используемые в операторе modulus и других) будут удвоены, даже при использовании формата связанных параметров «pyformat» (это изменение не документировано Mysqlconnector). Диалект теперь проверяет наличие py2k и mysqlconnector меньше версии 2.0 при определении того, следует ли оператор modulus отображать как %% или %.

  • [mysql] [bug] [mysqlconnector]

    Unicode SQL теперь передается для MySQLconnector версии 2.0 и выше; для Py2k и MySQL < 2.0 строки кодируются.

sqlite

  • [sqlite] [bug]

    При выборе из UNION с использованием вложенного файла базы данных драйвер pysqlite передает имена столбцов в cursor.description как „dbname.tablename.colname“, а не „tablename.colname“, как это обычно делается для UNION (заметим, что для обоих случаев должно быть просто „colname“, но мы это обходим). Логика трансляции столбцов здесь была скорректирована таким образом, чтобы получать крайний правый токен, а не второй, поэтому она работает в обоих случаях. Обходной путь предоставлен Тони Робертсом.

    References: #3211

mssql

  • [mssql] [bug]

    Исправлено определение строки версии в диалекте pymssql для работы с Microsoft SQL Azure, при котором слово «SQL Server» меняется на «SQL Azure».

    References: #3151

oracle

  • [oracle] [bug]

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

    References: #2138

misc

  • [bug] [declarative]

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

    References: #3208

  • [bug] [ext]

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

    References: #3191

  • [bug] [ext]

    Исправлена ошибка, при которой MutableDict не реализовывал метод словаря update(), в результате чего не перехватывались изменения. Pull request любезно предоставлен Matt Chisholm.

  • [bug] [ext]

    Исправлена ошибка, при которой пользовательский подкласс MutableDict не отображался в операции «coerce», а вместо него возвращался обычный MutableDict. Pull request любезно предоставлен Matt Chisholm.

  • [bug] [pool]

    Исправлена ошибка в логировании пула соединений, при которой отладочное сообщение «соединение проверено» не выдавалось, если логирование было настроено с использованием флага logging.setLevel(), а не с использованием флага echo_pool. Добавлены тесты для проверки этого протоколирования. Это регрессия, которая была внесена в 0.9.0.

    References: #3168

0.9.7

Released: July 22, 2014

orm

  • [orm] [bug] [eagerloading]

    Исправлена регрессия, вызванная выпуском #2976 в версии 0.9.4, когда распространение «внешнего соединения» по цепочке объединенных eager-нагрузок некорректно преобразовывало «внутреннее соединение» по пути соединения сиблингов во внешнее соединение, когда распространение «внешнего соединения» должны получать только пути-потомки; кроме того, исправлена проблема, когда распространение «вложенного» соединения происходило некорректно между двумя путями соединения сиблингов.

    References: #3131

  • [orm] [bug]

    Исправлена регрессия из 0.9.0, связанная с #2736, когда метод Query.select_from() больше не устанавливал корректно сущность «from» объекта Query, из-за чего последующие вызовы Query.filter_by() или Query.join() не проверяли соответствующую сущность «from» при поиске атрибутов по имени строки.

    References: #2736, #3083

  • [orm] [bug]

    »Оценщик» для query.update()/delete() не работает с многотабличными обновлениями и должен быть установлен в значение synchronize_session=False или synchronize_session=“fetch; при этом выдается предупреждение. В версии 1.0 это будет переведено в разряд исключений.

    References: #3117

  • [orm] [bug]

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

    References: #3108

  • [orm] [bug]

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

    References: #3106

  • [orm] [bug]

    Исправлена ошибка, связанная с динамическими атрибутами, которая вновь являлась регрессией #3060 из версии 0.9.5. Самореферентное отношение с lazy=“dynamic“ приводило к ошибке типа TypeError в операции flush.

    References: #3099

engine

  • [engine] [feature]

    Добавлено новое событие ConnectionEvents.handle_error(), являющееся более полноценной и всеобъемлющей заменой ConnectionEvents.dbapi_error().

    References: #3076

sql

  • [sql] [bug]

    Исправлена ошибка в Enum и других подклассах SchemaType, когда прямое связывание типа с MetaData приводило к зависанию, когда на MetaData выдавались события (например, события create).

    This change is also backported to: 0.8.7

    References: #3124

  • [sql] [bug]

    Исправлена ошибка в системе пользовательских операторов плюс TypeEngine.with_variant(), при которой использование TypeDecorator в сочетании с variant приводило к ошибке MRO при использовании оператора сравнения.

    This change is also backported to: 0.8.7

    References: #3102

  • [sql] [bug]

    Исправлена ошибка, связанная с использованием соглашения об именовании, когда при использовании соглашения о проверке ограничений, включающего constraint_name, все типы Boolean и Enum также должны были иметь имена, так как они неявно создавали ограничение, даже если конечный бэкенд не требовал генерации ограничения, например, PostgreSQL. Механика именования для этих ограничений была реорганизована таким образом, что определение именования происходит во время компиляции DDL, а не во время конструирования ограничений/таблиц.

    References: #3067

  • [sql] [bug]

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

    References: #3090

  • [sql] [bug]

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

    References: #3069

  • [sql] [bug]

    В итерацию dialect_kwargs для Python версии < 2.6.5 добавлен шаг «str()», позволяющий обойти ошибку «no unicode keyword arg», поскольку в некоторых процессах рефлексии эти аргументы передаются как ключевые.

    References: #3123

  • [sql] [bug]

    Метод TypeEngine.with_variant() теперь будет принимать в качестве аргумента класс типа, который внутренне преобразуется в экземпляр, по той же схеме, что и в других конструкциях, таких как Column.

    References: #3122

postgresql

  • [postgresql] [feature]

    Добавлен аргумент kw postgresql_regconfig к оператору ColumnOperators.match(), позволяющий указать аргумент «reg config» в выдаваемой функции to_tsquery(). Pull request любезно предоставлен Джонатаном Ванаско.

    References: #3078

  • [postgresql] [feature]

    Добавлена поддержка PostgreSQL JSONB через JSONB. Pull request любезно предоставлен Дамианом Диммихом.

  • [postgresql] [bug] [pg8000]

    Исправлена ошибка, появившаяся в 0.9.5 благодаря новой функции уровня изоляции pg8000, когда параметр уровня изоляции на уровне движка приводил к ошибке при подключении.

    References: #3134

mysql

  • [mysql] [bug]

    Ошибка MySQL 2014 «Commands out of sync» в современных версиях MySQL-Python выдается как ProgrammingError, а не OperationalError; все коды ошибок MySQL, проверяемые на «is disconnect», теперь проверяются в рамках OperationalError и ProgrammingError независимо друг от друга.

    This change is also backported to: 0.8.7

    References: #3101

sqlite

  • [sqlite] [bug]

    Исправлена проблема с переписыванием соединений в SQLite, когда подзапрос, встроенный в скалярный подзапрос, например, в IN, получал некорректные подстановки из вложенного запроса, если внутри подзапроса присутствовали те же таблицы, что и в вложенном запросе, например, в сценарии объединенного наследования.

    References: #3130

mssql

  • [mssql] [feature]

    Включена «многозначная вставка» для SQL Server 2008. Pull request любезно предоставлен Альбертом Кервином. Также расширены проверки для режима «IDENTITY INSERT», чтобы включить случаи, когда ключ идентификации присутствует в предложении VALUEs оператора.

  • [mssql] [bug]

    Добавлена кодировка операторов «SET IDENTITY_INSERT», которые работают при явном INSERT в столбец IDENTITY, для поддержки неаскриптивных идентификаторов таблиц в драйверах типа pyodbc + unix + py2k, которые не поддерживают юникодные операторы.

    This change is also backported to: 0.8.7

  • [mssql] [bug]

    В диалекте SQL Server pyodbc исправлена реализация параметра диалекта description_encoding, который при отсутствии явной установки препятствовал корректному разбору cursor.description в случае наборов результатов, содержащих имена в альтернативных кодировках. В дальнейшем этот параметр не нужен.

    This change is also backported to: 0.8.7

    References: #3091

  • [mssql] [bug]

    Исправлена регрессия из 0.9.5, вызванная #3025, когда запрос, используемый для определения «схемы по умолчанию», был некорректен в SQL Server 2000. Для SQL Server 2000 мы вернулись к использованию по умолчанию параметра «имя схемы» диалекта, который настраивается, но по умолчанию принимает значение „dbo“.

    References: #3025

oracle

  • [oracle] [bug] [tests]

    Исправлена ошибка в тестовом наборе oracle dialect, когда в одном из тестов предполагалось, что „username“ находится в URL базы данных, хотя это могло быть не так.

    References: #3128

tests

  • [tests] [bug]

    Исправлена ошибка, при которой команда «python setup.py test» не вызывала должным образом distutils, в результате чего в конце тестового набора выдавались ошибки.

misc

  • [bug] [declarative]

    Исправлена ошибка, когда декларативный флаг __abstract__ не различался, если на самом деле он имел значение False. Флаг __abstract__ должен действительно оцениваться как значение True на проверяемом уровне.

    References: #3097

0.9.6

Released: June 23, 2014

orm

  • [orm] [bug]

    Отменено изменение для #3060 - это исправление единицы работы, которое более полно обновлено в 1.0 через #3061. Исправление в #3060, к сожалению, приводит к новой проблеме, когда при нетерпеливой загрузке атрибута «многие к одному» может произойти событие, которое будет интерпретировано как изменение атрибута.

    References: #3060

0.9.5

Released: June 23, 2014

orm

  • [orm] [feature]

    Модель «primaryjoin» была несколько расширена, чтобы позволить условие объединения, которое строго от одного столбца к самому себе, транслируется через некоторую функцию или выражение SQL. Это своего рода эксперимент, но первым доказательством концепции является условие присоединения «материализованного пути», в котором строка пути сравнивается сама с собой с помощью оператора «like». Оператор ColumnOperators.like() также был добавлен в список допустимых операторов для использования в условии первичного соединения.

    References: #3029

  • [orm] [feature]

    Добавлена новая служебная функция make_transient_to_detached(), которая может быть использована для создания объектов, которые ведут себя так, как будто они были загружены из сессии, а затем отсоединены. Атрибуты, которые отсутствуют, помечаются как истекшие, и объект может быть добавлен в сессию, где он будет вести себя как постоянный.

    References: #3017

  • [orm] [bug]

    Исправлена ошибка в ускоренной загрузке подзапросов, когда длинная цепочка ускоренных загрузок через границу полиморфный-подкласс в сочетании с полиморфной загрузкой не находила ссылку на подкласс в цепочке, выдавая ошибку с отсутствием имени свойства на AliasedClass.

    This change is also backported to: 0.8.7

    References: #3055

  • [orm] [bug]

    Исправлена ошибка ORM, когда функция class_mapper() маскировала ошибки AttributeErrors или KeyErrors, которые должны были возникать при настройке маппера из-за ошибок пользователя. Перехват ошибок атрибутов/ключей стал более конкретным и не включает шаг конфигурирования.

    This change is also backported to: 0.8.7

    References: #3047

  • [orm] [bug]

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

    References: #3042

  • [orm] [bug]

    Изменено поведение load_only() таким образом, что столбцы первичных ключей всегда добавляются в список столбцов, которые должны быть «не отложены»; в противном случае ORM не сможет загрузить идентификатор строки. По всей видимости, можно отложить сопоставленные первичные ключи, и ORM не справится, это не изменилось. Но поскольку load_only, по сути, говорит «отложить все, кроме X», более критично, чтобы PK cols не были частью этой отсрочки.

    References: #3080

  • [orm] [bug]

    Исправлено несколько краевых случаев, возникающих при так называемом сценарии «переключения строки», когда INSERT/DELETE может быть превращен в UPDATE. В такой ситуации отношение «многие-к-одному», установленное в None, или, в некоторых случаях, скалярный атрибут, установленный в None, могут не распознаваться как чистое изменение значения, и, следовательно, UPDATE не сбросит значение, которое было в предыдущей строке. Это связано с некоторыми пока не решенными побочными эффектами работы истории атрибутов, которые заключаются в том, что неявно предполагается, что None не является «изменением» для ранее не установленного атрибута. См. также #3061.

    Примечание

    Это изменение было ПРЕДУПРЕЖДЕНО в версии 0.9.6. Полное исправление будет в версии 1.0 SQLAlchemy.

    References: #3060

  • [orm] [bug]

    В связи с #3060 в единицу работы внесена корректировка, в результате которой загрузка связанных объектов типа «многие-к-одному» в случае графа удаляемых самореферентных объектов производится несколько агрессивнее; загрузка связанных объектов призвана помочь определить правильный порядок удаления, если не задано значение passive_deletes.

  • [orm] [bug]

    Исправлена ошибка в переписывании соединений SQLite, когда анонимизированные имена столбцов из-за повторов некорректно переписывались в подзапросах. Это влияло на запросы SELECT с любым типом подзапроса + join.

    References: #3057

  • [orm] [bug] [sql]

    Исправления в новой улучшенной булевой коэрцитивности в #2804, где новые правила для «where» и «having» не вступали в силу для аргументов «whereclause» и «having» kw конструкции select(), которая также используется в Query, поэтому не работала и в ORM.

    References: #3013

examples

  • [examples] [feature]

    Добавлен новый пример, иллюстрирующий материализованные пути с использованием последних возможностей отношений. Пример предоставлен Джеком Чжоу.

engine

  • [engine] [bug]

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

    References: #3063

  • [engine] [bug]

    Исправлены некоторые ситуации «двойного аннулирования», когда аннулирование соединения могло произойти внутри уже критической секции типа connection.close(); в конечном счете, эти условия вызваны изменением в #2907, когда функция «сброс при возврате» обращается к соединению/транзакции для обработки, где может быть поймано «обнаружение разъединения». Однако возможно, что более позднее изменение в #2985 сделало это более вероятным, поскольку операция «аннулирование соединения» выполняется гораздо быстрее, так как проблема более воспроизводима на 0.9.4, чем на 0.9.3.

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

    References: #3043

sql

  • [sql] [feature]

    Немного смягчен контракт для Index, теперь в качестве цели можно указывать выражение text(); индекс больше не должен иметь столбца, связанного с таблицей, если индекс добавляется в таблицу вручную, либо через объявление inline, либо через Table.append_constraint().

    References: #3028

  • [sql] [feature]

    Добавлен новый флаг between.symmetric, при установке которого в True происходит рендеринг «BETWEEN SYMMETRIC». Также добавлен новый оператор отрицания «notbetween_op», который теперь позволяет выражению типа ~col.between(x, y) отображаться как «col NOT BETWEEN x AND y», а не как строка NOT, заключенная в круглые скобки.

    References: #2990

  • [sql] [bug]

    Исправлена ошибка в конструкции INSERT..FROM SELECT, когда при выборе из UNION объединение заворачивалось в анонимный (например, немаркированный) подзапрос.

    This change is also backported to: 0.8.7

    References: #3044

  • [sql] [bug]

    Исправлена ошибка, когда при применении пустых выражений Table.update() и Table.delete() выдавалось пустое предложение WHERE, если применялись пустые выражения and_() или or_() или другие пустые выражения. Теперь это соответствует таковому для select().

    This change is also backported to: 0.8.7

    References: #3045

  • [sql] [bug]

    Флаг Column.nullable неявно устанавливается в False, если на эту Column ссылается явная PrimaryKeyConstraint для данной таблицы. Теперь это поведение соответствует поведению, когда для самого Column установлен флаг Column.primary_key в значение True, что должно быть абсолютно эквивалентным случаем.

    References: #3023

  • [sql] [bug]

    Исправлена ошибка, при которой методы перегрузки операторов Operators.__and__(), Operators.__or__() и Operators.__invert__() не могли быть переопределены в пользовательской реализации Comparator.

    References: #3012

  • [sql] [bug]

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

    References: #3024

  • [sql] [bug]

    Исправлена ошибка, появившаяся в 0.9, когда новая функция «ORDER BY <labelname>» из #1068 не применяла правила кавычек к имени метки, отображаемому в ORDER BY.

    References: #1068, #3020

  • [sql] [bug]

    Восстановлен импорт для Function в пространство имен импорта sqlalchemy.sql.expression, который был удален в начале 0.9.

postgresql

  • [postgresql] [feature]

    Добавлена поддержка уровня изоляции AUTOCOMMIT при использовании pg8000 DBAPI. Pull request любезно предоставлен Tony Locke.

  • [postgresql] [feature]

    Добавлен новый флаг ARRAY.zero_indexes для типа PostgreSQL ARRAY. При установке флага True ко всем значениям индексов массивов перед передачей в базу данных будет добавляться значение, равное единице, что позволяет улучшить взаимодействие между нулевыми индексами в стиле Python и единичными индексами в PostgreSQL. Pull request любезно предоставлен Алексеем Терентьевым.

    References: #2785

  • [postgresql] [bug]

    Добавлен флаг hashable=False для типа PG HSTORE, необходимый для того, чтобы ORM могла пропустить попытку «хеширования» колонки HSTORE, отображенной на ORM, при запросе ее в смешанном списке колонок/сущностей. Исправление любезно предоставлено Gunnlaugur Þór Briem.

    This change is also backported to: 0.8.7

    References: #3053

  • [postgresql] [bug]

    Добавлено новое сообщение «disconnect» - «соединение было закрыто неожиданно». По-видимому, это связано с новыми версиями SSL. Pull request любезно предоставлен Antti Haapala.

    This change is also backported to: 0.8.7

  • [postgresql] [bug]

    Аксессор psycopg2 .closed теперь используется при определении того, является ли исключение ошибкой «разъединения»; в идеале это должно устранить необходимость в какой-либо другой проверке сообщения исключения для определения разъединения, однако мы оставим существующие сообщения в качестве запасного варианта. Это должно позволить обрабатывать более новые случаи, например, условия «SSL EOF». Pull request любезно предоставлен Дирком Мюллером.

    References: #3021

  • [postgresql] [enhancement]

    В диалект PostgreSQL добавлен новый тип OID. Хотя в PG тип «oid» обычно является частным типом, который не раскрывается в современных версиях, есть некоторые случаи использования PG, такие как поддержка больших объектов, где эти типы могут быть раскрыты, а также в некоторых случаях использования отражения схемы, сообщаемой пользователем.

    References: #3002

mysql

  • [mysql] [bug]

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

    This change is also backported to: 0.8.7

    References: #3085

  • [mysql] [bug]

    Добавлена поддержка отражения таблиц, в которых индекс включает KEY_BLOCK_SIZE, с помощью знака равенства. Pull request любезно предоставлен Шоном Макгиверном (Sean McGivern).

    This change is also backported to: 0.8.7

mssql

  • [mssql] [bug]

    Переработал запрос, используемый для определения текущего имени схемы по умолчанию, для использования функции database_principal_id() в сочетании с представлением sys.database_principals, чтобы можно было определять схему по умолчанию независимо от типа выполняемого входа в систему (например, SQL Server, Windows и т.д.).

    References: #3025

tests

  • [tests] [bug] [py3k]

    Исправлены некоторые предупреждения об устаревании, связанные с модулем imp и Python 3.3 или выше, при выполнении тестов. Pull request любезно предоставлен Matt Chisholm.

    References: #2830

misc

  • [bug] [declarative]

    Словарь __mapper_args__ при обращении к нему копируется из декларативного миксина или абстрактного класса, чтобы модификации, вносимые в этот словарь самим декларативом, не конфликтовали с модификациями других отображений. Словарь модифицируется относительно аргументов version_id_col и polymorphic_on, заменяя в нем столбец на тот, который официально отображен на локальный класс/таблицу.

    This change is also backported to: 0.8.7

    References: #3062

  • [bug] [ext]

    Исправлена ошибка в мутабельном расширении, когда MutableDict не сообщал о событиях изменения для операции со словарем setdefault().

    This change is also backported to: 0.8.7

    References: #3051, #3093

  • [bug] [ext]

    Исправлена ошибка, при которой MutableDict.setdefault() не возвращало существующее или новое значение (эта ошибка не встречалась ни в одной из версий 0.8). Pull request любезно предоставлен Томасом Эрве.

    This change is also backported to: 0.8.7

    References: #3051, #3093

  • [bug] [testsuite]

    В публичном тестовом наборе изменено использование String(40) с менее поддерживаемого Text в StringTest.test_literal_backslashes. Pullreq любезно предоставлен Яном.

  • [bug] [firebird]

    Исправлена ошибка, при которой сочетание рендеринга «limit» как «SELECT FIRST n ROWS» с использованием связанного параметра (только firebird имеет оба параметра) в сочетании с подзапросами на уровне столбцов, которые также имеют «limit» и «позиционные» связанные параметры (например, в стиле qmark), ошибочно назначали позиции на уровне подзапроса перед позициями вложенного SELECT, возвращая параметры не по порядку.

    References: #3038

0.9.4

Released: March 28, 2014

general

  • [general] [feature]

    Добавлена поддержка pytest для запуска тестов. В настоящее время этот прогон поддерживается в дополнение к nose, и, вероятно, в дальнейшем он будет предпочтительнее nose. Система плагинов nose, используемая SQLAlchemy, была разделена таким образом, чтобы она работала и под pytest. В настоящее время отказ от поддержки nose не планируется, и мы надеемся, что сам тестовый пакет сможет и дальше оставаться максимально независимым от платформы тестирования. Обновленную информацию о запуске тестов с помощью pytest смотрите в файле README.unittests.rst.

    Система тестовых плагинов также была усовершенствована для поддержки одновременного запуска тестов для нескольких URL баз данных путем многократного указания флагов --db и/или --dburi. При этом не запускается весь набор тестов для каждой базы данных, а вместо этого тестовые примеры, специфичные для определенных бэкендов, используют этот бэкенд в процессе выполнения теста. При использовании pytest в качестве программы запуска тестов система также будет запускать определенные наборы тестов несколько раз, по одному разу для каждой базы данных, особенно тесты, входящие в «набор диалектов». Планируется, что усовершенствованная система будет также использоваться компанией Alembic и позволит ей выполнять тесты операций миграции для нескольких бэкендов за один прогон, включая бэкенды сторонних производителей, не входящие в состав самой Alembic. Сторонним диалектам и расширениям также рекомендуется стандартизировать тестовый набор SQLAlchemy в качестве основы; см. файл README.dialects.rst для ознакомления с особенностями построения на основе тестовой платформы SQLAlchemy.

  • [general] [bug]

    Скорректирован файл setup.py для поддержки возможного удаления в будущем расширения setuptools.Feature из setuptools. Если это ключевое слово отсутствует, то установка все равно будет выполняться с помощью setuptools, а не возвращаться к distutils. Сборка расширений C теперь также может быть отключена установкой переменной окружения DISABLE_SQLALCHEMY_CEXT. Эта переменная работает независимо от наличия или отсутствия setuptools.

    This change is also backported to: 0.8.6

    References: #2986

  • [general] [bug]

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

    References: #2979

orm

  • [orm] [feature]

    Добавлен новый параметр mapper.confirm_deleted_rows. По умолчанию равен True, указывает, что серия операторов DELETE должна подтвердить, что количество строк курсора соответствует количеству первичных ключей, которые должны были совпасть; это поведение было снято в большинстве случаев (кроме случаев, когда используется version_id) для поддержки необычного граничного случая самореферентного ON DELETE CASCADE; чтобы учесть это, сообщение теперь является просто предупреждением, а не исключением, и флаг может быть использован для указания связки, которая ожидает самореферентного каскадного удаления такого рода. См. также #2403 для ознакомления с исходным изменением.

    References: #3007

  • [orm] [feature]

    Если события MapperEvents.before_configured() или MapperEvents.after_configured() применяются к конкретному мапперу или маппированному классу, то выдается предупреждение, поскольку на общем уровне события вызываются только для цели Mapper.

  • [orm] [feature]

    Добавлен новый аргумент ключевого слова once=True к listen() и listens_for(). Это удобная функция, которая обернет данный слушатель таким образом, что он будет вызван только один раз.

  • [orm] [feature]

    Добавлена новая опция к relationship.innerjoin, которая заключается в указании строки "nested". При установке значения "nested" в отличие от True, «цепочка» соединений будет заключать внутреннее соединение в скобки справа от существующего внешнего соединения, вместо того, чтобы выстраиваться в виде строки внешних соединений. Возможно, такое поведение должно было стать поведением по умолчанию при выпуске 0.9, поскольку мы ввели в ORM функцию вложенных справа джоинов, однако пока мы сохраняем его не по умолчанию, чтобы избежать дальнейших сюрпризов.

    References: #2976

  • [orm] [bug]

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

    This change is also backported to: 0.8.6

    References: #3006

  • [orm] [bug]

    Исправлена регрессия из 0.8.3, в результате которой #2818, где Query.exists() не работал в запросе, содержащем только запись Query.select_from(), но не имеющем других сущностей.

    This change is also backported to: 0.8.6

    References: #2995

  • [orm] [bug]

    Улучшено сообщение об ошибке, которая возникала, если при выполнении запроса query() к невыбираемому элементу, например, literal_column(), была предпринята попытка использовать Query.join() таким образом, что «левая» сторона определялась как None, а затем происходил сбой. Теперь это условие выявляется явно.

    This change is also backported to: 0.8.6

  • [orm] [bug]

    Удалены устаревшие имена из sqlalchemy.orm.interfaces.__all__ и обновлены актуальными, так что import * из этого модуля снова работает.

    This change is also backported to: 0.8.6

    References: #2975

  • [orm] [bug]

    Исправлено очень старое поведение, при котором ленивая загрузка, выполняемая для множества один-ко-многим, могла неадекватно подтягивать родительскую таблицу, а также возвращать результаты, не соответствующие тому, что находится в родительской таблице, если primaryjoin содержит какой-либо дискриминатор против родительской таблицы, например and_(parent.id == child.parent_id, parent.deleted == False). В то время как такой primaryjoin не имеет особого смысла для one-to-many, он несколько более распространен, когда применяется к many-to-one, а one-to-many возникает в результате обратной ссылки. Загрузка строк из child в этом случае оставила бы parent.deleted == False как есть в запросе, тем самым перетащив его в предложение FROM и выполнив декартово произведение. Теперь новое поведение будет подставлять значение локального «parent.deleted» для этого параметра в зависимости от ситуации. Хотя, как правило, в реальных приложениях в любом случае лучше использовать другой primaryjoin для стороны o2m.

    References: #2948

  • [orm] [bug]

    Улучшена проверка «как присоединиться из A в B», в результате которой, если таблица имеет несколько составных внешних ключей, нацеленных на родительскую таблицу, аргумент relationship.foreign_keys будет правильно интерпретирован для разрешения неоднозначности; ранее это условие приводило к тому, что было несколько путей FK, когда на самом деле аргумент foreign_keys должен был определять, какой из них ожидается.

    References: #2965

  • [orm] [bug]

    Добавлена поддержка не совсем документированного флага insert=True для listen() для работы с событиями mapper / instance.

  • [orm] [bug] [engine]

    Исправлена ошибка, при которой события, настроенные на прослушивание на уровне класса (например, на уровне Mapper или ClassManager, а не на уровне отдельного сопоставленного класса, а также Connection), использующие также преобразование внутренних аргументов (которых в этих категориях большинство), не могли быть удалены.

    References: #2973

  • [orm] [bug]

    Исправлена ошибка из 0.8, когда использование опции типа lazyload() с выражением «подстановочного знака», например "*", приводило к ошибке утверждения в случае, когда запрос не содержал ни одной реальной сущности. Это утверждение предназначено для других случаев, а в данном случае оно было поймано случайно.

  • [orm] [bug] [sqlite]

    Внесены новые исправления в «переписывание соединений» SQLite; исправление из #2967, реализованное перед выпуском 0.9.3, затрагивало случай, когда UNION содержал вложенные соединения. «Переписывание соединений» - это функция с широким спектром возможностей, и это первая сложная функция «переписывания SQL», которую мы представили за последние годы, поэтому мы как бы проходим через множество итераций с ней (не то что eager loading в серии 0.2/0.3, polymorphic loading в 0.4/0.5). Скоро мы должны быть на месте, так что спасибо за терпение :).

    References: #2969

examples

  • [examples] [bug]

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

engine

  • [engine] [feature]

    Добавлена новая механика событий на уровне диалектов; первоначальная реализация позволяет обработчику событий переопределять конкретную механику, с помощью которой произвольный диалект вызывает execute() или executemany() на курсоре DBAPI. Новые события, на данный момент полуобнародованные и экспериментальные, предназначены для поддержки некоторых грядущих расширений, связанных с транзакциями.

  • [engine] [feature]

    Теперь слушатель событий может быть связан с объектом Engine после создания одного или нескольких объектов Connection (например, с помощью orm Session или через явное подключение), и слушатель будет получать события от этих подключений. Ранее соображения производительности заставляли передавать события из Engine в Connection только в init-time, но мы добавили кучу условных проверок, чтобы сделать это возможным без дополнительных вызовов функций.

    References: #2978

  • [engine] [bug]

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

    References: #2985

  • [engine] [bug]

    Событие ConnectionEvents.after_cursor_execute() теперь вызывается для метода «_cursor_execute()» из Connection; это «быстрый» исполнитель, который используется для таких случаев, как выполнение последовательности перед оператором INSERT, а также для проверок запуска диалекта, таких как возврат unicode, charset и т.д. Событие ConnectionEvents.before_cursor_execute() уже вызывалось здесь. Флаг «executemany» здесь теперь всегда установлен в False, так как это событие всегда соответствует одному выполнению. Ранее флаг мог быть равен True, если мы действовали от имени исполняемого оператора INSERT.

sql

  • [sql] [feature]

    Добавлена поддержка буквального отображения булевых значений, например, «true» / «false» или «1» / «0».

  • [sql] [feature]

    Добавлена новая функция conv(), предназначенная для пометки имени ограничения как уже использовавшего соглашение об именовании. Эта фишка будет использоваться миграциями Alembic, начиная с версии Alembic 0.6.4, для отображения в скриптах миграции ограничений с именами, помеченными как уже подвергавшиеся соглашению об именовании.

  • [sql] [feature]

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

    Например, конструкция Index снова будет принимать специальные ключевые аргументы в рамках коллекции Index.kwargs, после построения:

    idx = Index("a", "b")
    idx.kwargs["mysql_someargument"] = True

    Для того, чтобы разрешить использование пользовательских аргументов во время конструирования, метод DialectKWArgs.argument_for() теперь допускает такую регистрацию:

    Index.argument_for("mysql", "someargument", False)
    
    idx = Index("a", "b", mysql_someargument=True)

    References: #2866, #2962

  • [sql] [bug]

    Исправлена ошибка в конструкции tuple_(), когда «тип» по сути первого выражения SQL применялся в качестве «типа сравнения» к сравниваемому значению кортежа; в некоторых случаях это приводило к некорректному «принуждению к типу», например, когда кортеж, содержащий смесь значений String и Binary, некорректно принуждает целевые значения к Binary, даже если они не являются таковыми в левой части. tuple_() теперь ожидает неоднородные типы в списке значений.

    This change is also backported to: 0.8.6

    References: #2977

  • [sql] [bug]

    Исправлена ошибка в версии 0.9, когда Table, не отразившийся корректно, не удалялся из родительского MetaData, даже если находился в недействительном состоянии. Pullreq любезно предоставлен Романом Подолякой.

    References: #2988

  • [sql] [bug]

    Функция MetaData.naming_convention теперь будет распространяться и на объекты CheckConstraint, связанные непосредственно с Column, а не только на Table.

  • [sql] [bug]

    Исправлена ошибка в новой функции MetaData.naming_convention, когда имя проверочного ограничения, использующего маркер «%(constraint_name)s», удваивалось для ограничения, порожденного типом boolean или enum, а общие дублирующие события приводили к тому, что маркер «%(constraint_name)s» продолжал усложняться.

    References: #2991

  • [sql] [bug]

    Скорректирована логика применения имен к коллекции .c при получении безымянного BindParameter, например, через literal() или аналогичным образом; в качестве ключа в .c используется «ключ» параметра привязки, а не отображаемое имя. Поскольку такие привязки в любом случае имеют «анонимные» имена, это позволяет отдельным связанным параметрам иметь собственное имя в selectable, если в остальном они никак не обозначены.

    References: #2974

  • [sql] [bug]

    Некоторые изменения в поведении коллекции FromClause.c при представлении дублирующихся столбцов. В некоторой степени сохраняется поведение выдачи предупреждения и замены старого столбца с тем же именем; в частности, замена производится для поддержания обратной совместимости. Однако замененный столбец по-прежнему остается связанным с коллекцией c теперь уже в коллекции ._all_columns, что используется такими конструкциями, как псевдонимы и союзы, для работы с набором столбцов в c в большей степени с тем, что действительно находится в списке столбцов, а не с уникальным набором имен ключей. Это поможет в ситуациях, когда операторы SELECT с одноименными столбцами используются в объединениях и т.п., чтобы объединение могло позиционно сопоставить столбцы, а также есть некоторый шанс, что FromClause.corresponding_column() все еще можно использовать здесь (теперь он может возвращать столбец, который находится только в selectable.c._all_columns и не имеет другого имени). Новая коллекция подчеркнута, так как нам еще предстоит решить, где этот список может оказаться. Теоретически он может стать результатом iter(selectable.c), однако это означает, что длина итерации перестанет соответствовать длине keys(), и такое поведение необходимо проверить.

    References: #2974

  • [sql] [bug]

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

postgresql

  • [postgresql] [feature]

    Включена проверка «вменяемого многорядного счета» для psycopg2 DBAPI, так как, похоже, она поддерживается начиная с psycopg2 2.0.9.

    This change is also backported to: 0.8.6

  • [postgresql] [bug]

    Исправлена регрессия, вызванная улучшениями совместимости в релизах 0.8.5 / 0.9.3, в результате которой снова нарушалось отражение индексов в PostgreSQL версий, характерных только для серий 8.1, 8.2, в том числе и для всегда проблемного типа int2vector. Если в версии 8.1 тип int2vector поддерживает операции с массивами, то в версии 8.3 он, по-видимому, поддерживает только CAST к varchar.

    This change is also backported to: 0.8.6

    References: #3000

mysql

  • [mysql] [bug]

    Подправил настройки mysql-connector-python; в Py2K флаг «supports unicode statements» теперь равен False, так что SQLAlchemy будет кодировать SQL-строку (заметьте: не параметры) в байты перед отправкой в базу данных. Это, похоже, позволяет пройти все тесты mysql-connector, связанные с unicode, включая те, которые используют неаскриптивные имена таблиц и столбцов, а также некоторые тесты для типа TEXT, использующие unicode в cursor.executemany().

oracle

  • [oracle] [feature]

    В диалект cx_Oracle добавлена новая опция движка coerce_to_unicode=True, восстанавливающая подход cx_Oracle outputtypehandler к преобразованию юникода в Python под Python 2, который был удален в 0.9.2 в результате использования #2911. В некоторых случаях, несмотря на проблемы с производительностью, желательно, чтобы приведение к юникоду было безусловным для всех строковых значений. Pull request любезно предоставлен Кристофом Цвершке (Christoph Zwerschke).

    References: #2911

  • [oracle] [bug]

    Добавлен новый тип данных DATE, который является подклассом DateTime. Поскольку в Oracle нет типа «datetime» как такового, а есть только DATE, то здесь уместно, чтобы тип DATE, присутствующий в диалекте Oracle, был экземпляром DateTime. Этот вопрос ничего не меняет в поведении типа, поскольку преобразование данных в любом случае выполняется DBAPI, однако улучшенное расположение подклассов поможет при проверке типов на совместимость с базами данных. Также удален верхний регистр DATETIME из диалекта Oracle, поскольку в этом контексте данный тип не является функциональным.

    References: #2987

tests

  • [tests] [bug]

    Исправлено несколько ошибочных строк u'', из-за которых тесты не проходили в Py3.2. Патч любезно предоставлен Arfrever Frehtes Taifersar Arahesis.

    References: #2980

misc

  • [bug] [ext]

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

    This change is also backported to: 0.8.6

    References: #2997

  • [bug] [automap] [ext]

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

    References: #3004

  • [bug] [pool]

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

  • [bug] [ext] [py3k]

    Исправлена ошибка в ассоциативном прокси, когда назначение пустого фрагмента (например, x[:] = [...]) приводило к ошибке на Py3k.

  • [bug] [ext]

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

    References: #2810

0.9.3

Released: February 19, 2014

orm

  • [orm] [feature]

    Добавлено новое событие MapperEvents.before_configured(), позволяющее получить событие в начале configure_mappers(), а также хук __declare_first__() внутри декларатива для дополнения __declare_last__().

  • [orm] [bug]

    Исправлена ошибка, при которой при вызове запроса с существующим критерием Query.get() не удавалось последовательно поднять , вызывающий InvalidRequestError, если заданный идентификатор уже присутствует в карте идентификаторов.

    This change is also backported to: 0.8.5

    References: #2951

  • [orm] [bug] [sqlite]

    Исправлена ошибка в SQLite «join rewriting», когда использование конструкции exists() не переписывалось должным образом, например, когда exists сопоставляется со свойством column_property в сложном сценарии вложенного соединения. Также исправлена несколько связанная с этим проблема, при которой перезапись соединений не выполнялась в пункте columns оператора SELECT, если объектами являлись псевдослучайные таблицы, а не отдельные псевдослучайные столбцы.

    References: #2967

  • [orm] [bug]

    В версии 0.9 исправлена ошибка, из-за которой события ORM instance или mapper, примененные к базовому классу, например декларативному, с флагом propagate=True, не могли применяться к существующим сопоставленным классам, также использующим наследование, из-за утверждения. Кроме того, исправлена ошибка с атрибутами, которая могла возникать при удалении такого события в зависимости от того, как оно было назначено изначально.

    References: #2949

  • [orm] [bug]

    Улучшена логика инициализации составных атрибутов таким образом, что вызов MyClass.attribute не требует выполнения шага configure mappers, т.е. он просто срабатывает без выброса ошибки.

    References: #2935

  • [orm] [bug]

    Устранены проблемы с [ticket:2932], впервые решенные в 0.9.2, когда при использовании ключа столбца вида <tablename>_<columnname>, совпадающего с ключом алиасированного столбца в тексте, он все равно не совпадал на уровне ORM, что в конечном итоге связано с проблемой совпадения столбцов в ядре. Были добавлены дополнительные правила, чтобы столбец _label учитывался при работе с конструкцией TextAsFrom или с литеральными столбцами.

    References: #2932

orm declarative

  • [orm] [declarative] [bug]

    Исправлена ошибка, из-за которой класс AbstractConcreteBase не мог быть полностью использован в декларативной конфигурации отношений, так как его строковое имя класса не было доступно в реестре имен классов на момент конфигурации отображателя. Теперь класс явно добавляется в реестр классов, и, кроме того, как AbstractConcreteBase, так и ConcreteBase устанавливают себя до конфигурирования мапперов в рамках настройки configure_mappers(), используя новое событие MapperEvents.before_configured().

    References: #2950

examples

  • [examples] [feature]

    В пример версионированных строк добавлен необязательный столбец «changed», а также поддержка случаев, когда версионированный Table имеет явный аргумент Table.schema. Pull request любезно предоставлен jplaverdure.

engine

  • [engine] [bug] [pool]

    Исправлена критическая регрессия, вызванная #2880, когда новая возможность одновременного возврата соединений из пула означает, что событие «first_connect» теперь также не синхронизируется, что приводит к неправильной конфигурации диалекта даже в ситуациях с минимальным параллелизмом.

    This change is also backported to: 0.8.5

    References: #2880, #2964

sql

  • [sql] [bug]

    Исправлена ошибка, при которой вызов Insert.values() с пустым списком или кортежем приводил к ошибке IndexError. Теперь он выдает пустую конструкцию вставки, как это было бы в случае с пустым словарем.

    This change is also backported to: 0.8.5

    References: #2944

  • [sql] [bug]

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

    This change is also backported to: 0.8.5

    References: #2957

  • [sql] [bug]

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

  • [sql] [bug]

    Исправлена ошибка, при которой так называемый «буквальный рендеринг» конструкций bindparam() заканчивался неудачей, если бинд был построен не с прямым значением, а с вызываемым. Это предотвращало отрисовку ORM-выражений с флагом компилятора «literal_binds».

postgresql

  • [postgresql] [feature]

    На тип ARRAY добавлен удобный аксессор TypeEngine.python_type. Pull request любезно предоставлен Алексеем Терентьевым.

  • [postgresql] [bug]

    В обнаружение отключения psycopg2 добавлено дополнительное сообщение «не удалось отправить данные на сервер», которое дополняет существующее «не удалось получить данные с сервера» и было замечено пользователями.

    This change is also backported to: 0.8.5

    References: #2936

  • [postgresql] [bug]

    Улучшена поддержка поведения отражения PostgreSQL на очень старых (до 8.1) версиях PostgreSQL и, возможно, на других PG-движках, таких как Redshift (при условии, что Redshift сообщает версию < 8.1). Запрос на «индексы» и «первичные ключи» основан на проверке так называемого типа данных «int2vector», который до версии 8.1 отказывается преобразовываться в массив, что приводит к сбоям в работе оператора «ANY()», используемого в запросе. В результате длительного гугления был найден очень хакерский, но рекомендованный разработчиками PG-core запрос, который следует использовать при использовании PG версии < 8.1, поэтому отражение ограничений по индексу и первичному ключу теперь работает на этих версиях.

    This change is also backported to: 0.8.5

  • [postgresql] [bug]

    Переработан очень старый вопрос, в котором запрос отражения PostgreSQL «get primary key» был обновлен для учета ограничений первичного ключа, которые были переименованы; новый запрос не работает на очень старых версиях PostgreSQL, таких как версия 7, поэтому старый запрос восстанавливается в тех случаях, когда обнаружена server_version_info < (8, 0).

    This change is also backported to: 0.8.5

    References: #2291

  • [postgresql] [bug]

    Добавлено определение версии сервера в недавно добавленный запрос запуска диалекта «show standard_conforming_strings»; поскольку эта переменная была добавлена в PG 8.2, мы пропускаем этот запрос для версий PG, сообщающих о строке версии, более ранней, чем эта.

    References: #2946

mysql

  • [mysql] [feature]

    Добавлена новая специфичная для MySQL функция DATETIME, включающая поддержку дробных секунд; также добавлена поддержка дробных секунд в TIMESTAMP. Поддержка DBAPI ограничена, хотя известно, что дробные секунды поддерживаются MySQL Connector/Python. Патч любезно предоставлен Geert JM Vanderkelen.

    This change is also backported to: 0.8.5

    References: #2941

  • [mysql] [bug]

    Добавлена поддержка ключевых слов таблиц MySQL PARTITION BY и PARTITIONS, задаваемых как mysql_partition_by='value' и mysql_partitions='value' - Table. Pull request любезно предоставлен Маркусом МакКерди.

    This change is also backported to: 0.8.5

    References: #2966

  • [mysql] [bug]

    Исправлена ошибка, не позволявшая диалектам на основе MySQLdb (например, pymysql) работать в Py3K, когда проверка на «connection charset» не выполнялась из-за более строгих правил сравнения значений в Py3K. В данном случае версия базы данных не учитывалась, так как версия сервера на тот момент была еще None, поэтому метод в целом был упрощен и теперь полагается на connection.character_set_name().

    This change is also backported to: 0.8.5

    References: #2933

  • [mysql] [bug] [cymysql]

    Исправлена ошибка в диалекте cymysql, когда строка версии, например '33a-MariaDB', не обрабатывалась должным образом. Pull request любезно предоставлен Мэттом Шмидтом.

    References: #2934

sqlite

  • [sqlite] [bug]

    Диалект SQLite теперь будет пропускать неподдерживаемые аргументы при отражении типов; например, если встретится строка типа INTEGER(5), то тип INTEGER будет инстанцирован без «5», исходя из того, что с первой попытки будет обнаружен TypeError.

  • [sqlite] [bug]

    В отражение типов SQLite добавлена поддержка полной поддержки договора «сродства типа», указанного на сайте https://www.sqlite.org/datatype3.html. В этой схеме ключевые слова INT, CHAR, BLOB или REAL, расположенные в имени типа, в общем случае связывают тип с одним из пяти сродств. Pull request любезно предоставлен Эрихом Блюмом.

    См.также

    Тип Отражение

misc

  • [bug] [ext]

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

0.9.2

Released: February 2, 2014

orm

  • [orm] [feature]

    Добавлен новый параметр Operators.op.is_comparison. Этот флаг позволяет рассматривать пользовательскую операцию из Operators.op() как оператор «сравнения», что позволяет использовать ее для пользовательских условий relationship.primaryjoin.

  • [orm] [feature]

    Улучшена поддержка передачи конструкции join() в качестве цели relationship.secondary для создания очень сложных условий присоединения relationship(). Изменения включают в себя корректировку присоединения запросов, присоединенную нетерпеливую загрузку, чтобы не выводить подзапрос SELECT, изменения в ленивой загрузке, чтобы «вторичная» цель правильно включалась в SELECT, и изменения в декларативности, чтобы лучше поддерживать спецификацию объекта join() с классами в качестве целей.

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

  • [orm] [bug]

    Исправлено сообщение об ошибке при передаче объекта-итератора в class_mapper() и т.п., когда при форматировании строки ошибка не выводилась. Pullreq любезно предоставлен Кайлом Старком.

    This change is also backported to: 0.8.5

  • [orm] [bug]

    Исправлена ошибка в новой конструкции TextAsFrom, при которой поиск строк, ориентированный на Column, не совпадал с ad-hoc объектами ColumnClause, которые генерирует TextAsFrom, что делало ее непригодной для использования в качестве цели в Query.from_statement(). Также исправлена механика Query.from_statement(), чтобы не принимать TextAsFrom за конструкцию Select. Эта ошибка также является регрессией 0.9, поскольку метод TextClause.columns() вызывается для учета аргумента text.typemap.

    References: #2932

  • [orm] [bug]

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

    References: #2921

  • [orm] [bug]

    В версии 0.9 исправлена ошибка, из-за которой автоматическое выравнивание, применяемое в выражении Query и в других ситуациях, когда select или joins выравнивались (например, при наследовании объединенных таблиц), могло не сработать, если в выражении использовался подкласс Column, определяемый пользователем. В этом случае подкласс не сможет передать ORM-специфические «аннотации», необходимые для адаптации. Для учета этого случая была скорректирована система «аннотаций выражения».

    References: #2918

  • [orm] [bug]

    Исправлена ошибка, связанная с новыми уплощенными структурами JOIN, которые используются с флагом joinedload() (что приводит к регрессу в загрузке joined eager), а также aliased() в сочетании с флагом flat=True и наследованием объединенных таблиц; в основном несколько объединений через сущность «родитель JOIN sub», использующих разные пути для достижения целевого класса, не формировали правильных условий ON. Корректировка/упрощение, внесенное в механику определения «левой стороны» соединения в случае алиасированного, объединенного класса, устраняет проблему.

    References: #2908

examples

  • [examples] [bug]

    В пример «history_meta» добавлено исправление, при котором проверка на «history» для связанного с отношением атрибута больше не будет выдавать SQL, если отношение выгружено.

engine

  • [engine] [feature] [pool]

    Добавлено новое событие пула PoolEvents.invalidate(). Вызывается, когда DBAPI-соединение должно быть помечено как «недействительное» и исключено из пула.

sql

  • [sql] [feature]

    Добавлено MetaData.reflect.dialect_kwargs для поддержки опций отражения на уровне диалекта для всех отражаемых объектов Table.

  • [sql] [feature]

    Добавлена новая функция, позволяющая автоматически применять соглашения об именовании к объектам Constraint и Index. Основанная на рецепте из вики, новая функция использует события схемы (schema-events) для установки имен по мере связывания различных объектов схемы друг с другом. Затем эти события открывают систему конфигурирования через новый аргумент MetaData.naming_convention. Эта система позволяет создавать как простые, так и собственные схемы именования ограничений и индексов на индивидуальной основе MetaData.

    References: #2923

  • [sql] [feature]

    Теперь опции могут быть заданы на объекте PrimaryKeyConstraint независимо от указания столбцов в таблице с помощью флага primary_key=True; для достижения этого результата используйте объект PrimaryKeyConstraint, в котором нет столбцов.

    Ранее явное указание PrimaryKeyConstraint приводило к тому, что столбцы, помеченные как primary_key=True, игнорировались; поскольку теперь это не так, PrimaryKeyConstraint будет утверждать, что для указания столбцов используется либо один, либо другой стиль, а если оба присутствуют, то что списки столбцов точно совпадают. Если в PrimaryKeyConstraint и в Table, помеченном как primary_key=True, присутствует несовпадающий набор колонок, то выдается предупреждение, и список колонок берется только из PrimaryKeyConstraint, как это было в предыдущих версиях.

    См.также

    PrimaryKeyConstraint

    References: #2910

  • [sql] [feature]

    Усовершенствована система, с помощью которой конструкции схем и некоторые конструкции SQL принимают аргументы ключевых слов, специфичные для диалекта. Эта система включает в себя, как правило, конструкции Table и Index, которые принимают широкий спектр специфических для диалекта аргументов, таких как mysql_engine и postgresql_where, а также конструкции PrimaryKeyConstraint, UniqueConstraint, Update, Insert и Delete, а также недавно добавленные возможности kwarg для ForeignKeyConstraint и ForeignKey. Изменения заключаются в том, что теперь участвующие диалекты могут указывать допустимые списки аргументов для этих конструкций, что позволяет выдать ошибку аргумента, если для конкретного диалекта указано недопустимое ключевое слово. Если диалектная часть ключевого слова не распознана, выдается только предупреждение; хотя система действительно будет использовать точки входа setuptools для поиска нелокальных диалектов, случай, когда определенные специфические для диалекта аргументы используются в среде, где сторонний диалект не установлен, остается поддерживаемым. Диалекты также должны явно согласиться с этой системой, так что внешние диалекты, не использующие эту систему, останутся незатронутыми.

    References: #2866

  • [sql] [bug]

    Поведение Table.tometadata() было скорректировано таким образом, что целевая схема ForeignKey не будет изменена, если эта схема не совпадает со схемой родительской таблицы. То есть, если таблица «schema_a.user» имеет внешний ключ к «schema_b.order.id», то цель «schema_b» будет поддерживаться независимо от того, передан ли аргумент «schema» в Table.tometadata(). Однако если таблица «schema_a.user» ссылается на «schema_a.order.id», то наличие «schema_a» будет обновлено как в родительской, так и в ссылающейся таблицах. Это поведенческое изменение, поэтому оно вряд ли будет перенесено в 0.8; предполагается, что прежнее поведение довольно глючно и вряд ли кто-то на него полагался.

    Кроме того, добавлен новый параметр Table.tometadata.referred_schema_fn. Он ссылается на вызываемую функцию, которая будет использоваться для определения новой ссылаемой схемы для любого ForeignKeyConstraint, встречающегося в операции tometadata. Эта вызываемая функция может быть использована для возврата к предыдущему поведению или для настройки обработки ссылающихся схем в зависимости от ограничений.

    References: #2913

  • [sql] [bug]

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

  • [sql] [bug] [py3k]

    Исправлена ошибка, при которой «буквальные привязки» не работали с привязанным параметром, имеющим бинарный тип. Аналогичная, но другая проблема исправлена в 0.8.

  • [sql] [bug]

    Исправлена регрессия, в результате которой система «аннотаций», используемая ORM, просачивалась в имена стандартных функций в sqlalchemy.sql.functions, таких как func.coalesce() и func.max(). Использование этих функций в атрибутах ORM и, соответственно, создание их аннотированных версий могло привести к искажению реального имени функции, отображаемого в SQL.

    References: #2927

  • [sql] [bug]

    Исправлена регрессия 0.9, когда новая поддержка сортировки для RowProxy приводила к TypeError при сравнении с не кортежными типами, поскольку пыталась безусловно применить tuple() к объекту «other». Теперь для RowProxy реализован полный набор операторов сравнения Python, при этом используется подход, гарантирующий систему сравнения, эквивалентную кортежу, а объект «other» принуждается только в том случае, если он является экземпляром RowProxy.

    References: #2848, #2924

  • [sql] [bug]

    UniqueConstraint, созданный в строке с Table, в котором нет столбцов, будет пропущен. Pullreq любезно предоставлен Дереком Харландом.

  • [sql] [bug] [orm]

    Исправлена конструкция «UPDATE..FROM» для нескольких таблиц, используемая только в MySQL, для корректного отображения предложения SET среди нескольких столбцов с одинаковым именем в разных таблицах. Также изменено имя связанного параметра в предложении SET на «<tablename>_<colname>» только для непервичной таблицы; поскольку этот параметр обычно задается непосредственно с помощью объекта Column, это не должно оказать влияния на приложения. Исправление действует как для Table.update(), так и для Query.update() в ORM.

    References: #2912

schema

  • [schema] [bug]

    Восстановление sqlalchemy.schema.SchemaVisitor в модуль .schema. Pullreq любезно предоставлен Шоном Дейгом.

postgresql

  • [postgresql] [feature]

    Добавлен новый аргумент диалектного уровня postgresql_ignore_search_path; этот аргумент принимается как конструктором Table, так и методом MetaData.reflect(). При работе с PostgreSQL таблица, ссылающаяся на иностранный ключ, в которой указано имя удаленной схемы, сохраняет это имя, даже если оно присутствует в search_path; по умолчанию с версии 0.7.3 схемы, присутствующие в search_path, не копируются в отраженные объекты ForeignKey. Документация была обновлена для подробного описания поведения функции pg_get_constraintdef() и того, как функция postgresql_ignore_search_path по существу определяет, будем ли мы соблюдать квалификацию схемы, сообщаемую этой функцией, или нет.

    References: #2922

mysql

  • [mysql] [bug]

    В диалект cymysql добавлены некоторые недостающие методы, в том числе _get_server_version_info() и _detect_charset(). Pullreq любезно предоставлен Хаджиме Накагами (Hajime Nakagami).

    This change is also backported to: 0.8.5

  • [mysql] [bug] [sql]

    Добавлено новое тестовое покрытие для так называемых «нисходящих адаптаций» типов SQL, когда более конкретный тип адаптируется к более общему типу - этот случай необходим для некоторых сторонних инструментов, таких как sqlacodegen. В данном тестовом наборе потребовалось исправить такие случаи, как преобразование ENUM в Enum и преобразование типов дат SQLite в общие типы дат. Метод adapt() здесь должен был стать более специфичным, чтобы противодействовать удалению коллекции «catch all» **kwargs на базовом классе TypeEngine, которая была удалена в 0.9.

    References: #2917

  • [mysql] [bug]

    Компиляция MySQL CAST теперь учитывает такие аспекты строкового типа, как «charset» и «collation». Хотя MySQL хочет, чтобы все символьные вызовы CAST использовали тип CHAR, мы теперь создаем реальный объект CHAR во время CAST и копируем все его параметры, так что выражение типа cast(x, mysql.TEXT(charset='utf8')) будет иметь вид CAST(t.col AS CHAR CHARACTER SET utf8).

  • [mysql] [bug]

    В диалект MySQL и в систему диалектов по умолчанию в целом добавлена новая проверка «возврата юникода», так что любой диалект может добавлять дополнительные «тесты» к проверке при первом подключении «возвращает ли этот DBAPI юникод напрямую?». В данном случае мы добавляем проверку именно на кодировку «utf8» с явным типом свертки «utf8_bin» (после проверки наличия этой свертки), чтобы протестировать некоторые ошибки в поведении юникода, наблюдаемые в MySQLdb версии 1.2.3. Хотя MySQLdb решил эту проблему в версии 1.2.4, проверка здесь должна защитить от регрессий. Это изменение также позволяет регистрировать проверки «unicode» в журналах движка, чего раньше не происходило.

    References: #2906

  • [mysql] [bug] [engine] [pool]

    Теперь Connection ассоциирует новый RootTransaction или TwoPhaseTransaction со своим непосредственным _ConnectionFairy в качестве «обработчика сброса» на время транзакции, который берет на себя задачу вызова commit() или rollback() для поведения «сброса при возврате» Pool, если транзакция не была завершена иным образом. Это решает проблему, связанную с тем, что придирчивая транзакция, подобная двухфазной транзакции MySQL, будет корректно завершена при закрытии соединения без явного отката или фиксации (например, больше не будет возникать ошибка «XAER_RMFAIL» в этом случае - обратите внимание, что это проявляется только в протоколировании, поскольку исключение не распространяется в рамках сброса пула). Эта проблема может возникнуть, например, при использовании orm Session с установленным twophase, а затем Session.close() вызывается без явного отката или фиксации. Это изменение также приводит к тому, что теперь при использовании объекта Session в режиме без автокоммита в логах будет отображаться явный «ROLLBACK», независимо от того, как была отменена сессия. Спасибо Джеффу Дайрики и Лоуренсу Роу за выявление проблемы.

    References: #2907

sqlite

  • [sqlite] [bug]

    Исправлена ошибка, из-за которой компилятор SQLite не распространял аргументы компилятора, такие как «литеральные привязки», в выражении CAST.

mssql

  • [mssql] [feature]

    К конструкциям UniqueConstraint и PrimaryKeyConstraint добавлена опция mssql_clustered; на SQL Server она добавляет ключевое слово CLUSTERED к конструкции ограничений в DDL. Pullreq любезно предоставлен Дереком Харландом.

oracle

  • [oracle] [bug]

    Замечено, что использование «обработчика выходного типа» cx_Oracle в Python 2.xx для приведения строковых значений к Юникоду является чрезвычайно затратным; несмотря на то, что cx_Oracle написан на языке C, при передаче примитива Python unicode в cursor. var() и связывании с обработчиком вывода, библиотека считает каждое преобразование вызовом Python-функции со всеми необходимыми накладными расходами; и это несмотря на то, что при работе в Python 3 все строки также безусловно приводятся к Юникоду, но при этом нет таких накладных расходов, что означает, что cx_Oracle не использует производительные техники в Py2K. Поскольку SQLAlchemy не может легко выбрать этот стиль обработчика типов на основе каждого столбца, обработчик был собран безусловно, тем самым добавив накладные расходы на все обращения к строкам.

    Поэтому эта логика была заменена на собственную систему преобразования юникода SQLAlchemy, которая теперь действует в Py2K только для столбцов, запрашиваемых в юникоде. При использовании расширений C система SQLAlchemy оказывается в 2-3 раза быстрее, чем cx_Oracle. Кроме того, преобразование юникода в SQLAlchemy было улучшено таким образом, что при необходимости использования «условного» конвертера (который теперь необходим для бэкенда Oracle), проверка на «уже юникод» теперь выполняется на языке C и больше не создает значительных накладных расходов.

    Это изменение имеет два последствия для бэкенда cx_Oracle. Во-первых, строковые значения в Py2K, которые не запрашиваются специально с типом Unicode или convert_unicode=True, теперь будут возвращаться в виде str, а не unicode - такое поведение аналогично бэкенду MySQL. Кроме того, при запросе юникодных значений с помощью бэкенда cx_Oracle, если расширения C не используются, теперь возникает дополнительная накладность в виде проверки isinstance() для каждого столбца. Этот компромисс был сделан, поскольку его можно обойти, и он больше не создает нагрузку на производительность для вероятного большинства столбцов результатов Oracle, которые являются неюникодными строками.

    References: #2911

misc

  • [bug] [pool]

    Имена аргументов для события PoolEvents.reset() были переименованы в dbapi_connection и connection_record, чтобы сохранить согласованность с остальными событиями пула. Предполагается, что все существующие слушатели этого относительно нового и редко используемого события в любом случае используют позиционный стиль для получения аргументов.

  • [bug] [cextensions] [py3k]

    Исправлена проблема, при которой расширения C в Py3K использовали неверный API для указания функции модуля верхнего уровня, что приводило к сбоям в Python 3.4b2. В Py3.4b2 изменена функция PyMODINIT_FUNC, возвращающая «void» вместо PyObject *, поэтому теперь мы должны использовать «PyMODINIT_FUNC» вместо PyObject * напрямую. Pull request courtesy cgohlke.

0.9.1

Released: January 5, 2014

orm

  • [orm] [bug] [events]

    Исправлена регрессия, при которой использование functools.partial() в системе событий приводило к переполнению рекурсии из-за использования inspect.getargspec() для определения устаревшей сигнатуры вызова для некоторых событий, а сделать это с частичным объектом, видимо, невозможно. Вместо этого мы пропускаем проверку на устаревшую сигнатуру и переходим на современный стиль; сама проверка теперь происходит только для событий SessionEvents.after_bulk_update и SessionEvents.after_bulk_delete. Эти два события будут требовать нового стиля подписи, если они назначены слушателю «частичного» события.

    References: #2905

  • [orm] [bug]

    Исправлена ошибка, при которой использование атрибута new Session.info приводило к ошибке, если аргумент .info передавался только в вызов создания sessionmaker, но не в сам объект. Предоставлено Робином Шуновером.

  • [orm] [bug]

    Исправлена ошибка, при которой при установке обратной ссылки по имени не выполнялась проверка заданного имени на соответствие правильному строковому классу, что приводило к ошибке «too many values to unpack». Это было связано с преобразованием Py3k.

    References: #2901

  • [orm] [bug]

    Исправлена регрессия, в результате которой при выражении query(B).join(B.cs), где «C» - объединенный inh-класс, создавался неявный псевдоним; однако этот неявный псевдоним создавался только для непосредственной левой стороны, а не для длинной цепочки объединений различных объединенных inh-подклассов одной и той же базы. Поскольку в этом случае мы все еще неявно используем псевдоним, поведение немного изменено, чтобы псевдоним правой стороны использовался в более широком спектре случаев.

    References: #2903

orm declarative

  • [orm] [declarative] [bug]

    Исправлена крайне маловероятная проблема с памятью, когда при использовании DeferredReflection для определения классов, ожидающих отражения, если некоторое подмножество этих классов отбрасывалось до вызова метода DeferredReflection.prepare() для отражения и отображения класса, то сильная ссылка на класс оставалась в декларативных внутренних компонентах. Теперь эта внутренняя коллекция «классов для отображения» использует слабые ссылки на сами классы.

  • [orm] [declarative] [bug]

    Квазирегрессия, когда в 0.8, очевидно, можно было установить атрибут уровня класса в declarative, чтобы просто напрямую ссылаться на InstrumentedAttribute в суперклассе или в самом классе, и он действовал более или менее как синоним; в 0.9 это не обеспечивает достаточного учета, чтобы соответствовать более либерализованной логике обратных ссылок из #2789. Несмотря на то, что этот случай никогда не рассматривался напрямую, теперь он обнаруживается декларативно на уровне «setattr()», а также при создании подкласса, и зеркально отраженный/переименованный атрибут теперь устанавливается как synonym().

    References: #2900

orm extensions

  • [orm] [extensions] [feature]

    Добавлено новое, экспериментальное расширение sqlalchemy.ext.automap. Это расширение расширяет функциональность Declarative, а также класса DeferredReflection для создания базового класса, который автоматически генерирует сопоставленные классы и отношения на основе метаданных таблицы.

sql

  • [sql] [feature]

    Конъюнкции типа and_() и or_() теперь могут принимать генераторы Python в качестве единственного аргумента, например:

    and_(x == y for x, y in tuples)

    Логика здесь ищет единственный аргумент *args, в котором первый элемент является экземпляром types.GeneratorType.

schema

0.9.0

Released: December 30, 2013

orm

  • [orm] [feature]

    Подкласс StatementError или подкласс, связанный с DBAPI, теперь может содержать дополнительную информацию о «причине» исключения; Session теперь добавляет к ней некоторые подробности, если исключение возникает в рамках автопромывки. Такой подход принят в противовес сочетанию FlushError с подходом «цепочки исключений» в стиле Python 3, чтобы сохранить совместимость как с кодом Py2K, так и с кодом, который уже ловит IntegrityError или подобные ему.

  • [orm] [feature] [backrefs]

    В функцию validates() добавлен новый аргумент include_backrefs=True, при установке которого в значение False событие валидации не будет инициировано, если оно было инициировано как обратная ссылка на операцию с атрибутом с другой стороны.

    References: #1535

  • [orm] [feature]

    В дополнение к новому методу Query.with_for_update() добавлено API для указания пункта FOR UPDATE в SELECT, дополняющее новый метод GenerativeSelect.with_for_update(). Pull request любезно предоставлен Марио Ласснигом.

  • [orm] [bug]

    Корректировка стратегии subqueryload(), которая обеспечивает выполнение запроса после начала загрузки; это сделано для того, чтобы загрузка подзапроса имела приоритет перед другими загрузчиками, которые могут попасть на тот же атрибут из-за других ситуаций eager/noload в неподходящее время.

    This change is also backported to: 0.8.5

    References: #2887

  • [orm] [bug]

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

    This change is also backported to: 0.8.5

    References: #2885

  • [orm] [bug]

    composite() будет выдано информативное сообщение об ошибке, если переданные столбцы/атрибуты (имена) не разрешаются в столбец или сопоставленный атрибут (например, ошибочный кортеж); ранее выдавалось несвязанное локальное сообщение.

    This change is also backported to: 0.8.5

    References: #2889

  • [orm] [bug]

    Исправлена ошибка, внесенная #2818, когда формируемый запрос EXISTS выдавал предупреждение «столбцы заменяются» для оператора с двумя одноименными столбцами, так как во внутреннем SELECT не было установлено значение use_labels.

    This change is also backported to: 0.8.4

    References: #2818

  • [orm] [bug] [collections] [py3k]

    Добавлена поддержка метода Python 3 list.clear() в системе инструментария ORM-коллекций; запрос на pull request любезно предоставлен Eduardo Schettino.

  • [orm] [bug]

    Некоторые уточнения конструкции AliasedClass в отношении дескрипторов, такие как гибриды, синонимы, композиты, дескрипторы, определяемые пользователем, и т.д. Адаптация атрибутов стала более надежной, так что если дескриптор возвращает не элемент составного SQL-выражения, а другой инструментальный атрибут, то операция все равно будет выполнена. Кроме того, «адаптированный» оператор сохраняет свой класс; ранее изменение класса с InstrumentedAttribute на QueryableAttribute (суперкласс) взаимодействовало с системой операторов Python таким образом, что выражение типа aliased(MyClass.x) > MyClass.x меняло свое значение на myclass.x < myclass_1.x. Адаптированный атрибут также будет ссылаться на новый AliasedClass как на своего родителя, что раньше было не всегда возможно.

    References: #2872

  • [orm] [bug]

    Флаг viewonly на relationship() теперь будет предотвращать запись истории атрибутов от имени целевого атрибута. Это приводит к тому, что объект не записывается в список Session.dirty, если он мутировал. Ранее объект присутствовал в Session.dirty, но никаких изменений от имени измененного атрибута во время flush не происходило. Атрибут по-прежнему испускает события, такие как события обратных ссылок и события, определяемые пользователем, и по-прежнему будет получать мутации от обратных ссылок.

    References: #2833

  • [orm] [bug]

    Добавлена поддержка нового атрибута Session.info в scoped_session.

  • [orm] [bug]

    Исправлена ошибка, при которой использование нового объекта Bundle приводило к невозможности использования атрибута Query.column_descriptions.

  • [orm] [bug] [sql] [sqlite]

    Исправлена регрессия, вызванная функцией переписывания соединений в #2369 и #2587, когда вложенное соединение, одна из сторон которого уже является aliased select, не могло корректно транслировать предложение ON на внешнюю сторону; в ORM это проявлялось при использовании оператора SELECT в качестве «вторичной» таблицы.

    References: #2858

orm declarative

  • [orm] [declarative] [bug]

    Declarative выполняет дополнительную проверку, чтобы обнаружить, если один и тот же объект Column отображается несколько раз под разными свойствами (вместо которых обычно должно быть synonym()) или если двум или более объектам Column присвоено одно и то же имя, выдавая предупреждение при обнаружении этого условия.

    References: #2828

  • [orm] [declarative] [bug]

    Класс DeferredReflection был усовершенствован для обеспечения автоматической поддержки отражения «вторичной» таблицы, на которую ссылается relationship(). «Вторичная» таблица, указанная либо как строковое имя таблицы, либо как объект Table, имеющий только имя и MetaData, также будет включена в процесс отражения при вызове DeferredReflection.prepare().

    References: #2865

  • [orm] [declarative] [bug]

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

examples

  • [examples] [bug]

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

engine

  • [engine] [feature]

    Функция engine_from_config() была усовершенствована таким образом, чтобы мы могли разбирать диалектные аргументы из строковых конфигурационных словарей. Классы диалектов теперь могут предоставлять свой собственный список типов параметров и процедур преобразования строк. Однако эта возможность пока не используется встроенными диалектами.

    References: #2875

  • [engine] [bug]

    DBAPI, вызывающий ошибку в connect(), не являющийся подклассом dbapi.Error (например, TypeError, NotImplementedError и т.д.), будет распространять исключение без изменений. Ранее при обработке ошибок, характерной для подпрограммы connect(), исключение неадекватно проходило через подпрограмму диалекта Dialect.is_disconnect(), а также заворачивалось в sqlalchemy.exc.DBAPIError. Теперь оно передается без изменений так же, как это происходит в процессе выполнения.

    This change is also backported to: 0.8.4

    References: #2881

  • [engine] [bug] [pool]

    Функция QueuePool была усовершенствована таким образом, чтобы не блокировать новые попытки соединения, если существующая попытка соединения блокируется. Ранее создание новых соединений было сериализовано в блоке, контролирующем переполнение; теперь счетчик переполнения изменяется в собственной критической секции вне самого процесса соединения.

    This change is also backported to: 0.8.4

    References: #2880

  • [engine] [bug] [pool]

    Внесена небольшая корректировка в логику ожидания доступности пула соединений: для пула соединений, таймаут которого не указан, он будет каждые полсекунды прерывать ожидание для проверки наличия так называемого флага «abort», который позволяет официанту прервать ожидание в случае сброса всего пула соединений; обычно официант должен прерваться из-за уведомления notify_all(), но в очень редких случаях возможно, что уведомление notify_all() пропущено. Это расширение логики, впервые представленной в 0.8.0, и проблема наблюдалась лишь изредка в стресс-тестах.

    This change is also backported to: 0.8.4

    References: #2522

  • [engine] [bug]

    Исправлена ошибка, при которой SQL-оператор неправильно кодировался в ASCII-коде, когда внутри Connection.execute() поднимался pre-DBAPI StatementError, что приводило к ошибкам кодирования для не-ASCII-операторов. Теперь строчная кодировка остается в рамках юникода Python, что позволяет избежать ошибок кодировки.

    This change is also backported to: 0.8.4

    References: #2871

  • [engine] [bug]

    Процедура create_engine() и связанная с ней функция make_url() больше не рассматривают знак + как пробел в поле пароля. Разбор в этой области был скорректирован, чтобы более точно соответствовать тому, как RFC 1738 обрабатывает эти лексемы, в том смысле, что и username, и password ожидают кодирования только :, @ и /.

    References: #2873

  • [engine] [bug]

    Объект RowProxy теперь сортируется в Python, как обычный кортеж; это достигается за счет обеспечения преобразования tuple() с обеих сторон в методе __eq__(), а также добавления метода __lt__().

    References: #2848

sql

  • [sql] [feature]

    В конструкцию text() внесены новые улучшения, включая более гибкие способы задания связанных параметров и типов возврата; в частности, конструкция text() теперь может быть превращена в полноценный FROM-объект, встраиваемый в другие операторы в качестве псевдонима или CTE с помощью нового метода TextClause.columns(). Конструкция text() также может отображать «встроенные» связанные параметры, когда конструкция компилируется в контексте «literal bound».

    References: #2877, #2882

  • [sql] [feature]

    Новый API для указания клаузулы FOR UPDATE в SELECT дополнен новым методом GenerativeSelect.with_for_update(). Этот метод поддерживает более простую систему задания диалектных опций по сравнению с аргументом for_update в ключевом слове select(), а также включает поддержку стандартного для SQL предложения FOR UPDATE OF. В ORM также включен новый соответствующий метод Query.with_for_update(). Pull request любезно предоставлен Марио Ласснигом.

  • [sql] [feature]

    Точность, используемая при приведении возвращаемого значения с плавающей точкой к Python Decimal через строку, теперь настраивается. Флаг decimal_return_scale теперь поддерживается всеми типами Numeric и Float, что гарантирует, что при преобразовании в строку из исходного значения с плавающей точкой будет взято именно это количество цифр. При отсутствии этого параметра тип будет использовать значение .scale, если тип поддерживает этот параметр и он не равен None. В противном случае используется исходная длина по умолчанию, равная 10.

    References: #2867

  • [sql] [bug]

    Исправлена проблема, при которой столбец с первичным ключом, на который наложена последовательность, но при этом столбец не является столбцом с «автоматическим инкрементом», поскольку на него наложено ограничение внешнего ключа или установлено значение autoincrement=False, пытался сработать при INSERT для бэкендов, не поддерживающих последовательности, при представлении INSERT с отсутствием значения первичного ключа. Это происходит на бэкендах, не поддерживающих последовательности, таких как SQLite, MySQL.

    This change is also backported to: 0.8.5

    References: #2896

  • [sql] [bug]

    Исправлена ошибка в методе Insert.from_select(), когда при генерации оператора INSERT не учитывался порядок следования заданных имен, что приводило к несовпадению с именами столбцов в заданном операторе SELECT. Также отмечено, что Insert.from_select() подразумевает невозможность использования стандартных параметров вставки на стороне Python, так как в операторе отсутствует предложение VALUES.

    This change is also backported to: 0.8.5

    References: #2895

  • [sql] [bug]

    Функция cast() при передаче простого буквенного значения теперь будет применять заданный тип к данному буквенному значению на стороне связывающего параметра в соответствии с типом, заданным при приведении, аналогично функции type_coerce(). Однако, в отличие от type_coerce(), это действует только в том случае, если в cast() передается неклассическое значение элемента; существующая типизированная конструкция сохранит свой тип.

  • [sql] [bug]

    Класс ForeignKey более агрессивно проверяет заданный аргумент column. Если он не является строкой, то проверяется, что объект является, по крайней мере, ColumnClause или объектом, который разрешается в такой объект, и что атрибут .table, если он присутствует, ссылается на TableClause или подкласс, а не на что-то вроде Alias. В противном случае возникает ошибка ArgumentError.

    References: #2883

  • [sql] [bug]

    Правила старшинства для оператора ColumnOperators.collate() были изменены таким образом, что оператор COLLATE теперь имеет более низкий приоритет, чем операторы сравнения. В результате COLLATE, примененный к сравнению, не будет отображать круглые скобки вокруг сравнения, которые не анализируются такими бэкендами, как MSSQL. Данное изменение является обратно несовместимым для тех систем, которые обходили эту проблему, применяя Operators.collate() к отдельному элементу выражения сравнения, а не к выражению сравнения в целом.

    References: #2879

  • [sql] [enhancement]

    Исключение, возникающее при наличии в скомпилированном операторе символа BindParameter без значения, теперь включает в сообщение об ошибке имя ключа связанного параметра.

    This change is also backported to: 0.8.5

schema

  • [schema] [bug]

    Исправлена регрессия, вызванная #2812, когда при выполнении repr() для имен таблиц и столбцов происходил сбой, если имя содержало неаскриптивные символы.

    References: #2868

postgresql

  • [postgresql] [feature]

    Добавлена поддержка PostgreSQL JSON с использованием нового типа JSON. Огромная благодарность Натану Райсу (Nathan Rice) за реализацию и тестирование.

    References: #2581

  • [postgresql] [feature]

    Добавлена поддержка PostgreSQL TSVECTOR через тип TSVECTOR. Pull request любезно предоставлен Noufal Ibrahim.

  • [postgresql] [bug]

    Исправлена ошибка, из-за которой при использовании адаптера pypostgresql, возвращающего значения indkey в виде списков, а в psycopg2 возвращающего тип string, отражение индексов неверно интерпретировало значения indkey.

    This change is also backported to: 0.8.4

    References: #2855

  • [postgresql] [bug]

    Теперь расширение psycopg2 UNICODEARRAY используется для работы с юникодными массивами в psycopg2 + обычный режим «native unicode», аналогично тому, как используется расширение UNICODE.

  • [postgresql] [bug]

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

    References: #2878

mysql

  • [mysql] [bug]

    Усовершенствована система генерации типов SQL в пределах __repr__(), особенно в отношении целочисленных/числовых/символьных типов MySQL, которые имеют большое количество аргументов в виде ключевых слов. __repr__() важен для использования с автогенерацией Alembic при выводе Python-кода в сценарии миграции.

    References: #2893

mssql

  • [mssql] [bug] [firebird]

    Флаг «asdecimal», используемый с типом Float, теперь будет работать как с Firebird, так и с диалектами mssql+pyodbc; ранее десятичное преобразование не происходило.

    This change is also backported to: 0.8.5

  • [mssql] [bug] [pymssql]

    В список сообщений, проверяемых на «разъединение» в диалекте pymssql, добавлено сообщение «Net-Lib error during Connection reset by peer». Предоставлено Джоном Андерсоном.

    This change is also backported to: 0.8.5

  • [mssql] [bug]

    Исправлена ошибка, появившаяся в 0.8.0, когда оператор DROP INDEX для индекса в MSSQL отображался некорректно, если индекс находился в альтернативной схеме; имя схемы/таблицы менялось на противоположное. Формат также был изменен, чтобы соответствовать текущей документации по MSSQL. Любезно предоставлено Дереком Харландом.

    This change is also backported to: 0.8.4

oracle

  • [oracle] [bug]

    В список кодов «is disconnect» с помощью cx_oracle добавлен код ошибки ORA-02396 «maximum idle time».

    This change is also backported to: 0.8.4

    References: #2864

  • [oracle] [bug]

    Исправлена ошибка, при которой типы Oracle VARCHAR, заданные без длины (например, для CAST или аналогичного), некорректно отображали None CHAR или аналогичные.

    This change is also backported to: 0.8.4

    References: #2870

misc

  • [bug] [firebird]

    Диалект firebird будет заключать в кавычки идентификаторы, начинающиеся с символа подчеркивания. Любезно предоставлено Treeve Jelbert.

    This change is also backported to: 0.8.5

    References: #2897

  • [bug] [firebird]

    Исправлена ошибка в отражении индекса Firebird, когда столбцы внутри индекса сортировались неправильно; теперь они сортируются в порядке RDB$FIELD_POSITION.

    This change is also backported to: 0.8.5

  • [bug] [declarative]

    Сообщение об ошибке при получении строкового аргумента relationship(), не разрешающегося в класс или mapper, исправлено на такое же, как и при получении нестрокового аргумента, который указывает имя отношения, в котором произошла конфигурационная ошибка.

    This change is also backported to: 0.8.5

    References: #2888

  • [bug] [ext]

    Исправлена ошибка, из-за которой расширение serializer не могло корректно работать с именами таблиц и столбцов, содержащими не ASCII-символы.

    This change is also backported to: 0.8.4

    References: #2869

  • [bug] [firebird]

    Изменены запросы, используемые Firebird для перечисления имен таблиц и представлений, для запроса из представления rdb$relations вместо представлений rdb$relation_fields и rdb$view_relations. Варианты как старых, так и новых запросов упоминаются во многих FAQ и блогах, однако новые запросы взяты прямо из «Firebird FAQ», который, по-видимому, является наиболее официальным источником информации.

    References: #2898

  • [removed]

    Диалекты «informix» и «informixdb» были удалены; код теперь доступен в виде отдельного репозитория на Bitbucket. Проект IBM-DB обеспечивает поддержку Informix на уровне производства с момента появления диалекта informixdb.

0.9.0b1

Released: October 26, 2013

general

  • [general] [feature] [py3k]

    Расширения на языке Си перенесены на Python 3 и будут собираться в любом поддерживаемом окружении CPython 2 или 3.

    References: #2161

  • [general] [feature] [py3k]

    Кодовая база теперь «in-place» для Python 2 и 3, необходимость запуска 2to3 устранена. Совместимость теперь обеспечивается с Python 2.6 и далее.

    References: #2671

  • [general]

    В результате масштабного рефакторинга пакетов была изменена структура импорта многих модулей Core, а также некоторые аспекты модулей ORM. В частности, sqlalchemy.sql был разбит на несколько модулей больше, чем раньше, так что очень большой размер sqlalchemy.sql.expression теперь уменьшен. Усилия были направлены на значительное сокращение циклов импорта. Кроме того, система API-функций в sqlalchemy.sql.expression и sqlalchemy.orm была реорганизована, чтобы устранить избыточность документации между функциями и создаваемыми ими объектами.

orm

  • [orm] [feature]

    Добавлена новая опция к relationship() distinct_target_key. Это позволяет стратегии ускоренной загрузки подзапросов применять DISTINCT к самому внутреннему подзапросу SELECT, чтобы помочь в случае, когда дублирующиеся строки генерируются самым внутренним запросом, соответствующим этому отношению (пока не существует общего решения проблемы дублирующихся строк в рамках ускоренной загрузки подзапросов, однако, когда соединения вне самого внутреннего подзапроса создают дубликаты). Если флаг установлен в значение True, то DISTINCT выводится безусловно, а если в значение None, то DISTINCT выводится, если внутреннее отношение касается столбцов, не составляющих полный первичный ключ. По умолчанию в 0.8 опция имеет значение False (т.е. по умолчанию отключена во всех случаях), в 0.9 - None (т.е. по умолчанию работает автоматически). Спасибо Александру Ковалю за помощь в этом вопросе.

    This change is also backported to: 0.8.3

    References: #2836

  • [orm] [feature]

    Прокси ассоциации теперь возвращает None при получении скалярного атрибута из скалярного отношения, когда само скалярное отношение указывает на None, вместо того, чтобы выдавать ошибку AttributeError.

    References: #2810

  • [orm] [feature]

    Добавлен новый метод AttributeState.load_history(), работающий аналогично AttributeState.history, но также вызывающий загрузчик.

    References: #2787

  • [orm] [feature]

    Добавлена новая опция загрузки load_only(). Она позволяет указать ряд имен столбцов для загрузки «только» этих атрибутов, отложив остальные.

    References: #1418

  • [orm] [feature]

    Система опций загрузчика была полностью перестроена и построена на более полной базе - объекте Load. Эта база позволяет использовать любые общие опции загрузчика, такие как joinedload(), defer() и т.д., в «цепочечном» стиле для задания опций по пути, например joinedload("foo").subqueryload("bar"). Новая система заменяет использование имен путей, разделенных точками, множественных атрибутов внутри опций, а также использование опций _all().

    References: #1418

  • [orm] [feature]

    Конструкция composite() теперь сохраняет возвращаемый объект при использовании в столбце-ориентированном Query, а не разворачивается в отдельные столбцы. Это позволяет использовать новую внутреннюю функцию Bundle. Такое поведение обратно несовместимо; для выбора из составного столбца, который будет разворачиваться, используйте MyClass.some_composite.clauses.

    References: #2824

  • [orm] [feature]

    Добавлена новая конструкция Bundle, позволяющая специфицировать группы колоночных выражений в конструкцию Query. По умолчанию группа столбцов возвращается в виде одного кортежа. Однако поведение конструкции Bundle можно переопределить, чтобы обеспечить любую обработку результата в возвращаемой строке. Поведение Bundle теперь также встраивается в составные атрибуты, когда они используются в столбцах, ориентированных на Query.

    References: #2824

  • [orm] [feature]

    Параметр version_id_generator в Mapper теперь может быть указан для использования идентификаторов версий, сгенерированных сервером, с помощью триггеров или других функций версионности, предоставляемых базой данных, или с помощью необязательного программного значения, задав version_id_generator=False. При использовании генерируемого сервером идентификатора версии ORM будет использовать RETURNING, когда это возможно, для немедленной загрузки нового значения версии, в противном случае будет выдан второй SELECT.

    References: #2793

  • [orm] [feature]

    Флаг eager_defaults Mapper теперь позволяет извлекать новые значения по умолчанию с помощью встроенного предложения RETURNING, а не второго оператора SELECT для бэкендов, поддерживающих RETURNING.

    References: #2793

  • [orm] [feature]

    В Session добавлен новый атрибут Session.info, представляющий собой словарь, в котором приложения могут хранить произвольные данные, локальные для Session. Содержимое Session.info также может быть инициализировано с помощью аргумента info в Session или sessionmaker.

  • [orm] [feature]

    Удаление слушателей событий теперь реализовано. Для этого используется функция remove().

    References: #2268

  • [orm] [feature]

    Изменен механизм передачи событиям атрибутов маркера AttributeImpl в качестве «инициатора»; теперь этим объектом является специфический для данного события объект Event. Кроме того, система атрибутов больше не останавливает события, основанные на совпадении маркера «инициатор»; эта логика была перенесена в обработчики событий ORM backref, которые являются типичным источником повторного распространения события атрибута на последующие операции добавления/установки/удаления. Конечный пользовательский код, эмулирующий поведение обратных ссылок, теперь должен гарантировать, что схемы рекурсивного распространения событий будут остановлены, если в схеме не используются обработчики обратных ссылок. Используя эту новую систему, обработчики обратных ссылок теперь могут выполнять операцию «двух хопов», когда объект добавляется в коллекцию, ассоциируется с новым many-to-one, де-ассоциируется с предыдущим many-to-one, а затем удаляется из предыдущей коллекции. До этого изменения последний шаг удаления из предыдущей коллекции не выполнялся.

    References: #2789

  • [orm] [feature]

    Существенное изменение касается того, как ORM строит соединения, в которых правая сторона сама является соединением или левым внешним соединением. Теперь ORM сконфигурирован таким образом, чтобы разрешить простую вложенность объединений вида a JOIN (b JOIN c ON b.id=c.id) ON a.id=b.id, а не заставлять правую часть превращать в подзапрос SELECT. Это должно обеспечить значительное повышение производительности на большинстве бэкендов, особенно на MySQL. Единственная база данных, которая в течение многих лет сдерживала это изменение, SQLite, теперь решена путем переноса производства подзапроса SELECT из ORM в компилятор SQL; таким образом, вложенное справа объединение на SQLite по-прежнему будет в конечном итоге приводить к виду SELECT, а на все остальные базы данных это обходное решение больше не влияет.

    В рамках этого изменения в функции aliased(), Join.alias() и with_polymorphic() был добавлен новый аргумент flat=True, который позволяет получить «псевдоним» JOIN, который применяет анонимный псевдоним к каждой таблице-компоненту соединения, а не создает подзапрос.

    References: #2587

  • [orm] [bug]

    Исправлена ошибка, при которой инструментарий списка не мог корректно представить фрагмент набора [0:0], что, в частности, могло происходить при использовании insert(0, item) с ассоциативным прокси. Из-за некоторой причуды в коллекциях Python эта проблема была гораздо более вероятна в Python 3, а не 2.

    This change is also backported to: 0.8.3, 0.7.11

    References: #2807

  • [orm] [bug]

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

    This change is also backported to: 0.8.3

    References: #2813

  • [orm] [bug]

    Исправлена ошибка, при которой Query.exists() не работал корректно без критерия WHERE. Любезно предоставлено Владимиром Магамедовым.

    This change is also backported to: 0.8.3

    References: #2818

  • [orm] [bug]

    Исправлена потенциальная проблема в реализации упорядоченной последовательности, используемой в ORM для итерации иерархий картографов; в интерпретаторе Jython эта реализация не была упорядочена, хотя cPython и PyPy поддерживали упорядочивание.

    This change is also backported to: 0.8.3

    References: #2794

  • [orm] [bug]

    Исправлена ошибка в регистрации событий на уровне ORM, когда флаги «raw» или «propagate» могли быть неправильно настроены в некоторых конфигурациях «unmapped base class».

    This change is also backported to: 0.8.3

    References: #2786

  • [orm] [bug]

    Исправлена ошибка, связанная с использованием опции defer() при загрузке отображаемых сущностей. Накладные расходы на выполнение функций при применении отложенного вызова для каждого объекта к экземпляру во время загрузки были значительно выше, чем при простой загрузке данных из строки (обратите внимание, что defer() предназначена для снижения накладных расходов на работу с БД/сетью, а не на количество вызовов функций); теперь накладные расходы на вызов функций во всех случаях меньше, чем при загрузке данных из столбца. Также уменьшилось количество «лениво вызываемых» объектов, создаваемых при загрузке, с N (общее количество отложенных значений в результате) до 1 (общее количество отложенных столбцов).

    This change is also backported to: 0.8.3

    References: #2778

  • [orm] [bug]

    Исправлена ошибка, из-за которой при переводе объекта из состояния «persistent» в состояние «pending» с помощью функции make_transient() для операций с обратными ссылками на основе коллекций происходил сбой функций истории атрибутов.

    This change is also backported to: 0.8.3

    References: #2773

  • [orm] [bug]

    Предупреждение выдается при попытке прошить объект унаследованного класса, в котором полиморфному дискриминатору было присвоено значение, недопустимое для данного класса.

    This change is also backported to: 0.8.2

    References: #2750

  • [orm] [bug]

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

    This change is also backported to: 0.8.2

    References: #2759

  • [orm] [bug]

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

    This change is also backported to: 0.8.2

    References: #2754

  • [orm] [bug]

    Исправлено взаимодействие составных атрибутов с функцией aliased(). Ранее составные атрибуты некорректно работали в операциях сравнения, когда применялось выравнивание.

    This change is also backported to: 0.8.2

    References: #2755

  • [orm] [bug] [ext]

    Исправлена ошибка, при которой MutableDict не сообщал о событии изменения при вызове clear().

    This change is also backported to: 0.8.2

    References: #2730

  • [orm] [bug]

    get_history() при использовании со скалярным атрибутом, отображаемым на столбец, теперь будет учитывать переданный ему флаг «passive»; поскольку по умолчанию он равен PASSIVE_OFF, функция по умолчанию будет запрашивать базу данных, если значение отсутствует. Это поведенческое изменение по сравнению с 0.8.

    References: #2787

  • [orm] [bug] [associationproxy]

    В компараторы ==, !=, используемые со скалярными значениями, добавлен дополнительный критерий для сравнения с None, учитывающий отсутствие самой записи ассоциации, в дополнение к существующей проверке на то, что конечная точка скаляра в записи ассоциации является NULL. Ранее сравнение Cls.scalar == None возвращало записи, для которых Cls.associated присутствовал, а Cls.associated.scalar был None, но не строки, для которых Cls.associated не присутствовал. Более того, обратная операция Cls.scalar != None``* возвращала строки ``Cls, для которых Cls.associated не присутствовал.

    Случай для Cls.scalar != 'somevalue' также модифицирован, чтобы действовать более похоже на прямое сравнение SQL; возвращаются только строки, для которых Cls.associated присутствует и Associated.scalar не является NULL и не равно 'somevalue'. Ранее это было простое NOT EXISTS.

    Также добавлен специальный случай использования, когда можно вызвать Cls.scalar.has() без аргументов, когда Cls.scalar является значением, основанным на столбцах - это возвращает, есть ли в Cls.associated какие-либо строки, независимо от того, является ли Cls.associated.scalar NULL или нет.

    References: #2751

  • [orm] [bug]

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

    References: #2369

  • [orm] [bug]

    Отключено «автосглаживание» метода Query.select_from(). Специфическое поведение теперь доступно через новый метод Query.select_entity_from(). Поведение автосглаживания здесь никогда не было хорошо документировано и в целом не является желаемым, поскольку Query.select_from() стал более ориентирован на управление отображением JOIN. Query.select_entity_from() также будет доступен в 0.8, так что приложения, полагающиеся на автосглаживание, смогут переключить свои приложения на использование этого метода.

    References: #2736

orm declarative

  • [orm] [declarative] [feature]

    Добавлен удобный декоратор классов as_declarative(), представляющий собой обертку для declarative_base(), которая позволяет применить существующий базовый класс, используя удобный класс-декоратор.

    This change is also backported to: 0.8.3

  • [orm] [declarative] [feature]

    На дескрипторы ORM, такие как гибридные свойства, теперь можно ссылаться по имени в строковом аргументе, используемом с order_by, primaryjoin или аналогичном в relationship(), в дополнение к атрибутам, связанным с колонками.

    This change is also backported to: 0.8.2

    References: #2761

examples

  • [examples] [feature]

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

    This change is also backported to: 0.8.3

  • [examples] [bug]

    Добавлена опция «autoincrement=False» в таблицу history, созданную в примере с версионированием, так как в этой таблице в любом случае не должно быть autoinc, любезно предоставлено Патриком Шмидом.

    This change is also backported to: 0.8.3

  • [examples] [bug]

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

    This change is also backported to: 0.8.2

engine

  • [engine] [feature]

    repr() для URL из Engine теперь будет скрывать пароль с помощью звездочек. Предоставлено Gunnlaugur Þór Briem.

    This change is also backported to: 0.8.3

    References: #2821

  • [engine] [feature]

    Добавлены новые события в ConnectionEvents:

    References: #2770

  • [engine] [bug]

    Regexp, используемый функцией make_url(), теперь разбирает ipv6-адреса, например, окруженные скобками.

    This change is also backported to: 0.8.3, 0.7.11

    References: #2851

  • [engine] [bug] [oracle]

    Dialect.initialize() не вызывается второй раз, если Engine пересоздается из-за ошибки разъединения. Это устраняет конкретную проблему в диалекте Oracle 8, но в целом фаза dialect.initialize() должна выполняться только один раз для каждого диалекта.

    This change is also backported to: 0.8.3

    References: #2776

  • [engine] [bug] [pool]

    Исправлена ошибка, при которой QueuePool терял корректный счетчик проверенных соединений, если существующее пул-соединение не удавалось переподключить после события invalidate или recycle.

    This change is also backported to: 0.8.3

    References: #2772

  • [engine] [bug]

    Исправлена ошибка, при которой аргумент reset_on_return в различных реализациях Pool не распространялся при регенерации пула. Предоставлено Eevee.

    This change is also backported to: 0.8.2

  • [engine] [bug]

    Сигнатура метода Dialect.reflecttable(), которая во всех известных случаях обеспечивается DefaultDialect, была ужесточена, чтобы ожидать аргументов include_columns и exclude_columns без опции kw, что уменьшает неоднозначность - ранее exclude_columns отсутствовал.

    References: #2748

sql

  • [sql] [feature]

    Добавлена поддержка отражения «уникальных ограничений» с помощью метода Inspector.get_unique_constraints(). Спасибо Роману Подоляке за патч.

    This change is also backported to: 0.8.4

    References: #1443

  • [sql] [feature]

    Конструкции update(), insert() и delete() теперь будут интерпретировать сущности ORM как целевые таблицы, с которыми нужно работать, например:

    from sqlalchemy import insert, update, delete
    
    ins = insert(SomeMappedClass).values(x=5)
    
    del_ = delete(SomeMappedClass).where(SomeMappedClass.id == 5)
    
    upd = update(SomeMappedClass).where(SomeMappedClass.id == 5).values(name="ed")

    This change is also backported to: 0.8.3

  • [sql] [feature] [mysql] [postgresql]

    Диалекты PostgreSQL и MySQL теперь поддерживают отражение/инспекцию опций внешнего ключа, включая ON UPDATE, ON DELETE. PostgreSQL также отражает опции MATCH, DEFERRABLE и INITIALLY. Любезно предоставлено ijl.

    References: #2183

  • [sql] [feature]

    Конструкция bindparam() с «нулевым» типом (например, тип не указан) теперь копируется при использовании в типизированном выражении, и новой копии присваивается реальный тип сравниваемого столбца. Ранее эта логика выполнялась на месте данного bindparam(). Кроме того, аналогичный процесс теперь происходит и для конструкций bindparam(), передаваемых в ValuesBase.values() для конструкции Insert или Update, на этапе компиляции конструкции.

    Оба эти изменения являются незначительными и могут повлиять на некоторые виды использования.

    References: #2850

  • [sql] [feature]

    Пересмотрена работа с выражениями для специальных символов, особенно с конъюнкциями, например None null() true() false(), включая согласованность отображения NULL в конъюнкциях, «замыкание» выражений and_() и or_(), содержащих булевы константы, и отображение булевых констант и выражений в виде «1» или «0» для бэкендов, не имеющих констант true/false.

    References: #2734, #2804, #2823

  • [sql] [feature]

    Система типизации теперь справляется с задачей визуализации значений «буквальной привязки», т.е. значений, которые обычно являются связанными параметрами, но в силу контекста должны быть представлены в виде строк, обычно в конструкциях DDL, таких как ограничения CHECK и индексы (обратите внимание, что значения «буквальной привязки» начинают использоваться в DDL начиная с #2742). Новый метод TypeEngine.literal_processor() служит базовым, а TypeDecorator.process_literal_param() добавляется для возможности обертывания собственного метода рендеринга литералов.

    References: #2838

  • [sql] [feature]

    Метод Table.tometadata() теперь выдает копии всех словарей SchemaItem.info из всех SchemaItem объектов структуры, включая столбцы, ограничения, внешние ключи и т.д. Поскольку эти словари являются копиями, они не зависят от исходного словаря. Ранее в рамках этой операции передавался только словарь .info из Column, причем он только связывался на месте, а не копировался.

    References: #2716

  • [sql] [feature]

    Аргумент default в Column теперь принимает в качестве аргумента не отдельную функцию, а класс или метод объекта; правильно определяет, принят ли аргумент «context» или нет.

  • [sql] [feature]

    Добавлен новый метод в конструкцию insert() Insert.from_select(). Учитывая список колонок и возможность выбора, выводит INSERT INTO (table) (columns) SELECT ... Несмотря на то, что эта возможность выделена в версии 0.9, она также перенесена в версию 0.8.3.

    См.также

    INSERT из SELECT

    References: #722

  • [sql] [feature]

    Предоставлен новый атрибут для TypeDecorator, называемый TypeDecorator.coerce_to_is_types, для облегчения управления тем, как сравнение с помощью == или != с None и булевыми типами выдает выражение IS или обычное выражение равенства со связанным параметром.

    References: #2734, #2744

  • [sql] [feature]

    Теперь конструкция label() будет отображаться в виде только своего имени в предложении ORDER BY, если эта метка также упоминается в предложении columns в select, вместо того чтобы переписывать полное выражение. Это дает базе данных больше шансов оптимизировать оценку одного и того же выражения в двух разных контекстах.

    References: #1068

  • [sql] [bug]

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

    This change is also backported to: 0.8.3, 0.7.11

    References: #2801

  • [sql] [bug] [cte]

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

    This change is also backported to: 0.8.3, 0.7.11

    References: #2783

  • [sql] [bug]

    Исправлена ошибка в DDL CheckConstraint, когда флаг «quote» из объекта Column не распространялся.

    This change is also backported to: 0.8.3, 0.7.11

    References: #2784

  • [sql] [bug]

    Исправлена ошибка, при которой type_coerce() не интерпретировал должным образом элементы ORM с методом __clause_element__().

    This change is also backported to: 0.8.3

    References: #2849

  • [sql] [bug]

    Типы Enum и Boolean теперь обходят любой пользовательский (например, TypeDecorator) тип, используемый при создании ограничения CHECK для «неродного» типа. Это сделано для того, чтобы пользовательский тип не участвовал в выражении внутри CHECK, поскольку это выражение относится к значению «impl», а не к значению «decorated».

    This change is also backported to: 0.8.3

    References: #2842

  • [sql] [bug]

    Флаг .unique на Index может быть выдан как None, если он был сгенерирован из Column, в котором не было указано unique (где по умолчанию стоит None). Теперь флаг всегда будет True или False.

    This change is also backported to: 0.8.3

    References: #2825

  • [sql] [bug]

    Исправлена ошибка в компиляторе по умолчанию, а также в компиляторах postgresql, mysql и mssql, в результате которой в операторе CREATE INDEX любые литеральные значения SQL-выражений отображаются непосредственно как литералы, а не как связанные параметры. Это также изменяет схему визуализации для других DDL, таких как ограничения.

    This change is also backported to: 0.8.3

    References: #2742

  • [sql] [bug]

    select(), который в предложении FROM ссылается сам на себя, как правило, с помощью мутации на месте, будет выдавать информативное сообщение об ошибке, а не вызывать переполнение рекурсии.

    This change is also backported to: 0.8.3

    References: #2815

  • [sql] [bug]

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

    This change is also backported to: 0.8.3

    References: #2811

  • [sql] [bug]

    Оператор ColumnOperators.notin_(), добавленный в 0.8, теперь корректно выдает отрицание выражения «IN», возвращаемого при использовании против пустой коллекции.

    This change is also backported to: 0.8.3

  • [sql] [bug] [postgresql]

    Исправлена ошибка, когда при обращении к коллекции .c в конструкции select() система выражений полагалась на форму str() некоторых выражений, но форма str() была недоступна, поскольку элемент опирался на диалектные конструкции компиляции, в частности, на оператор __getitem__(), используемый с элементом PostgreSQL ARRAY. Исправление также добавляет новый класс исключений UnsupportedCompilationError, который возникает в тех случаях, когда компилятору предлагается скомпилировать то, что он не умеет.

    This change is also backported to: 0.8.3

    References: #2780

  • [sql] [bug]

    Многочисленные исправления корреляционного поведения конструкций Select, впервые появившиеся в 0.8.0:

    • Для того чтобы удовлетворить условиям использования, когда записи FROM должны коррелировать по направлению к SELECT, который включает в себя другой, который затем включает в себя этот, корреляция теперь работает на нескольких уровнях, когда явная корреляция устанавливается с помощью Select.correlate(), при условии, что целевой select находится где-то в цепочке, содержащейся в предложении WHERE/ORDER BY/columns, а не только во вложенных предложениях FROM. Таким образом, поведение Select.correlate() стало более совместимым с 0.7, сохранив при этом новую «умную» корреляцию.

    • Когда явная корреляция не используется, обычная «неявная» корреляция ограничивает свое поведение только непосредственным вложением SELECT, чтобы максимизировать совместимость с приложениями 0.7, а также предотвращает корреляцию между вложенными FROM в этом случае, поддерживая совместимость с 0.8.0/0.8.1.

    • Метод Select.correlate_except() не во всех случаях предотвращал корреляцию заданных предложений FROM, а также приводил к некорректному опусканию предложений FROM (более похоже на то, как это было в 0.7), что было исправлено.

    • Вызов select.correlate_except(None) введет в корреляцию все предложения FROM, как и следовало ожидать.

    This change is also backported to: 0.8.2

    References: #2668, #2746

  • [sql] [bug]

    Исправлена ошибка, при которой при присоединении select() таблицы «A» с несколькими путями внешних ключей к таблице «B» к этой таблице «B» не выдавалась ошибка «неоднозначное условие присоединения», которая выдается при присоединении таблицы «A» непосредственно к «B»; вместо этого выдавалось условие присоединения с несколькими критериями.

    This change is also backported to: 0.8.2

    References: #2738

  • [sql] [bug] [reflection]

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

    This change is also backported to: 0.8.2

    References: #2728

  • [sql] [bug]

    Убран вызов __iter__() из базового класса ColumnOperators, который был введен в 0.8.0 для предотвращения бесконечного, увеличивающего память цикла, когда пользователь также реализует метод __getitem__() для пользовательского оператора и затем ошибочно вызывает list() для этого объекта, но это приводило к тому, что элементы столбцов сообщали, что они на самом деле являются итерируемыми типами, которые затем выдавали ошибку при попытке выполнить итерацию. В данном случае нет реального способа получить обе стороны, поэтому мы придерживаемся лучших практик Python. Осторожнее с реализацией __getitem__() в пользовательских операторах!

    This change is also backported to: 0.8.2

    References: #2726

  • [sql] [bug]

    Атрибут «name» устанавливается в Index перед вызовом событий «attach», чтобы события присоединения можно было использовать для динамической генерации имени индекса на основе родительской таблицы и/или столбцов.

    References: #2835

  • [sql] [bug]

    Ошибочный kw-аргумент «schema» был удален из объекта ForeignKey. Это была случайная фиксация, которая ничего не дала; в 0.8.3 при использовании этого kw-аргумента выдается предупреждение.

    References: #2831

  • [sql] [bug]

    Изменен способ работы с идентификаторами, заключенными в кавычки. Вместо того чтобы полагаться на передачу различных флагов quote=True, эти флаги преобразуются в объекты типа rich string с информацией о кавычках в момент передачи их в такие распространенные конструкции схемы, как Table, Column и т.д. Это решает проблему различных методов, которые некорректно воспринимают флаг «quote», таких как Engine.has_table() и связанные с ним методы. Объект quoted_name представляет собой подкласс строки, который при необходимости также может быть использован в явном виде; объект будет удерживать переданные предпочтения по кавычкам, а также обходить «нормализацию имен», выполняемую диалектами, стандартизирующими символы верхнего регистра, такими как Oracle, Firebird и DB2. В результате «прописные» бэкенды теперь могут работать с именами, заключенными в кавычки, такими как имена, заключенные в нижний регистр, и новые зарезервированные слова.

    References: #2812

  • [sql] [bug]

    Разрешение объектов ForeignKey на их целевые Column было переработано таким образом, чтобы оно было как можно более немедленным, основанным на моменте, когда целевой Column связан с тем же MetaData, что и данный ForeignKey, а не на ожидании первого построения соединения или чего-то подобного. Это, наряду с другими улучшениями, позволяет раньше обнаружить некоторые проблемы с конфигурацией внешних ключей. Также здесь переработана система распространения типов, так что теперь можно с уверенностью установить тип None для любого Column, который ссылается на другой через ForeignKey - тип будет скопирован из целевого столбца, как только этот другой столбец будет связан, и теперь это работает и для составных внешних ключей.

    References: #1765

postgresql

  • [postgresql] [feature]

    Добавлена поддержка типов диапазонов PostgreSQL 9.2. В настоящее время трансляция типов не предусмотрена, поэтому в данный момент работа ведется напрямую со строками или типами расширения диапазона psycopg2 2.5. Патч любезно предоставлен Крисом Уитерсом.

    This change is also backported to: 0.8.2

  • [postgresql] [feature]

    Добавлена поддержка изоляции «AUTOCOMMIT» при использовании psycopg2 DBAPI. Ключевое слово доступно через опцию выполнения isolation_level. Патч любезно предоставлен Романом Подолякой.

    This change is also backported to: 0.8.2

    References: #2072

  • [postgresql] [feature]

    Добавлена поддержка отображения SMALLSERIAL при использовании типа SmallInteger в колонке первичного ключа с автоинкрементом, основанная на определении версии сервера PostgreSQL версии 9.2 или выше.

    References: #2840

  • [postgresql] [bug]

    Убрано 128-символьное усечение из отражения серверного значения по умолчанию для колонки; этот код был исходным для системных представлений PG, которые усекали строку для удобочитаемости.

    This change is also backported to: 0.8.3

    References: #2844

  • [postgresql] [bug]

    Скобки будут применяться к составному SQL-выражению, отображаемому в списке столбцов оператора CREATE INDEX.

    This change is also backported to: 0.8.3

    References: #2742

  • [postgresql] [bug]

    Исправлена ошибка, из-за которой строки версий PostgreSQL, содержащие префикс перед словами «PostgreSQL» или «EnterpriseDB», не обрабатывались. Предоставлено Скоттом Шефером.

    This change is also backported to: 0.8.3

    References: #2819

  • [postgresql] [bug]

    Поведение extract() было упрощено на диалекте PostgreSQL, чтобы больше не вводить в данное выражение жестко закодированный ::timestamp или аналогичный каст, поскольку это мешало работе с такими типами, как timezone-aware datetimes, а также не было необходимо в современных версиях psycopg2.

    This change is also backported to: 0.8.2

    References: #2740

  • [postgresql] [bug]

    Исправлена ошибка в типе HSTORE, когда ключи/значения, содержащие кавычки с обратным слешем, не экранировались корректно при использовании «неродных» (т.е. не-psycopg2) средств трансляции данных HSTORE. Исправление любезно предоставлено Райаном Келли.

    This change is also backported to: 0.8.2

    References: #2766

  • [postgresql] [bug]

    Исправлена ошибка, при которой порядок столбцов в многостолбцовом индексе PostgreSQL отражался в неправильном порядке. Любезно предоставлено Романом Подолякой.

    This change is also backported to: 0.8.2

    References: #2767

mysql

  • [mysql] [feature]

    Параметр mysql_length, используемый с Index, теперь может передаваться в виде словаря имен/длины столбцов, что позволяет использовать его с составными индексами. Большая благодарность Роману Подоляке за патч.

    This change is also backported to: 0.8.2

    References: #2704

  • [mysql] [feature]

    Тип MySQL SET теперь имеет такое же поведение автокавычек, как и тип ENUM. Кавычки не требуются при задании значения, но присутствующие кавычки будут автоматически обнаружены с предупреждением. Это также поможет при работе с Alembic, где тип SET не отображается с кавычками.

    References: #2817

  • [mysql] [bug]

    Обновления зарезервированных слов MySQL для версий 5.5, 5.6, любезно предоставленные Hanno Schlichting.

    This change is also backported to: 0.8.3, 0.7.11

    References: #2791

  • [mysql] [bug]

    Изменение в #2721, заключающееся в том, что ключевое слово deferrable в ForeignKeyConstraint молча игнорируется бэкендом MySQL, будет отменено в версии 0.9; теперь это ключевое слово будет снова отображаться, вызывая ошибки в MySQL, поскольку оно не понимается - такое же поведение будет и для ключевого слова initially. В 0.8 ключевые слова по-прежнему игнорируются, но выдается предупреждение. Кроме того, ключевое слово match теперь вызывает ошибку CompileError в 0.9 и предупреждение в 0.8; это ключевое слово не только молча игнорируется MySQL, но и нарушает работу опций ON UPDATE/ON DELETE.

    Чтобы использовать ForeignKeyConstraint, который не рендерится или рендерится по-другому на MySQL, используйте пользовательскую опцию компиляции. Пример такого использования добавлен в документацию, смотрите Внешние ключи MySQL / MariaDB.

    This change is also backported to: 0.8.3

    References: #2721, #2839

  • [mysql] [bug]

    Диалект MySQL-connector теперь позволяет опциям в строке запроса create_engine переопределять значения по умолчанию, установленные в connect, включая «buffered» и «raise_on_warnings».

    This change is also backported to: 0.8.3

    References: #2515

  • [mysql] [bug]

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

    This change is also backported to: 0.8.2

    References: #2768

  • [mysql] [bug]

    В диалект mysql+gaerdbms добавлено еще одно условие для определения так называемого «режима разработки», в котором следует использовать rdbms_mysqldb DBAPI. Исправление любезно предоставлено Бреттом Слаткиным.

    This change is also backported to: 0.8.2

    References: #2715

  • [mysql] [bug]

    Аргумент deferrable на ForeignKey и ForeignKeyConstraint не приводит к появлению ключевого слова DEFERRABLE на диалекте MySQL. В течение долгого времени мы оставляли это положение, поскольку не откладываемый внешний ключ будет вести себя совсем иначе, чем откладываемый, но некоторые среды просто отключают FK в MySQL, поэтому здесь мы будем менее категоричны.

    This change is also backported to: 0.8.2

    References: #2721

  • [mysql] [bug]

    Исправление и тестирование разбора опций внешних ключей MySQL в рамках рефлексии; это дополняет работу в #2183, где мы начинаем поддерживать рефлексию опций внешних ключей, таких как каскад ON UPDATE/ON DELETE.

    References: #2839

  • [mysql] [bug]

    Улучшена поддержка драйвера cymysql, поддерживается версия 0.6.5, любезно предоставленная Хаджиме Накагами (Hajime Nakagami).

sqlite

  • [sqlite] [bug]

    Недавно добавленные в SQLite DATETIME аргументы storage_format и regexp, по-видимому, были реализованы не совсем корректно; хотя аргументы и принимались, на практике они не оказывали никакого влияния; это исправлено.

    This change is also backported to: 0.8.3

    References: #2781

  • [sqlite] [bug]

    В список имен типов, которые могут быть отражены диалектом SQLite, добавлено sqlalchemy.types.BIGINT; любезно предоставлено Расселом Стюартом.

    This change is also backported to: 0.8.2

    References: #2764

mssql

  • [mssql] [bug]

    При запросе информационной схемы на SQL Server 2000 удален вызов CAST, который был добавлен в 0.8.1 для решения проблем с драйверами и, по всей видимости, не совместим с 2000. Для SQL Server 2005 и выше CAST остается на месте.

    This change is also backported to: 0.8.2

    References: #2747

  • [mssql] [bug] [pyodbc]

    Исправления в работе MSSQL с Python 3 + pyodbc, включая корректную передачу операторов.

    References: #2355

oracle

  • [oracle] [feature] [py3k]

    Юнит-тесты Oracle с cx_oracle теперь полностью проходят под Python 3.

  • [oracle] [bug]

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

    This change is also backported to: 0.8.3

    References: #2853

misc

  • [feature]

    К Column добавлен новый флаг system=True, который помечает столбец как «системный», автоматически предоставляемый базой данных (например, PostgreSQL oid или xmin). Столбец будет опущен в операторе CREATE TABLE, но в остальном будет доступен для запросов. Кроме того, конструкция CreateColumn может быть применена к пользовательскому правилу компиляции, которое позволяет пропускать столбцы, создавая правило, возвращающее None.

    This change is also backported to: 0.8.3

  • [feature] [firebird]

    В диалекты kinterbasdb и fdb добавлен новый флаг retaining=True. Он управляет значением флага retaining, передаваемого в методы commit() и rollback() DBAPI-соединения. По историческим причинам в версии 0.8.2 этот флаг по умолчанию принимает значение True, однако в версии 0.9.0b1 он принимает значение False.

    This change is also backported to: 0.8.2

    References: #2763

  • [feature] [core]

    В операторе UpdateBase.returning() добавлен новый вариант ValuesBase.return_defaults(), позволяющий добавлять произвольные столбцы в предложение RETURNING без вмешательства в обычную для компиляторов функцию «неявного возврата», которая используется для эффективной выборки вновь сгенерированных значений первичного ключа. Для поддерживающих бэкендов словарь всех полученных значений находится по адресу ResultProxy.returned_defaults.

    References: #2793

  • [feature] [pool]

    Добавлена журнализация пула для «rollback-on-return» и менее используемой «commit-on-return». Это включено вместе с остальной частью «отладочной» журнализации пула.

    References: #2752

  • [feature] [firebird]

    Диалект fdb теперь является диалектом по умолчанию, если он указан без квалификатора диалекта, т.е. firebird://, в соответствии с проектом Firebird, публикующим fdb в качестве своего официального драйвера Python.

    References: #2504

  • [bug] [firebird]

    Поиск типа при отражении типов Firebird LONG и INT64 исправлен таким образом, что LONG рассматривается как INTEGER, INT64 - как BIGINT, если только тип не имеет «точности», в этом случае он рассматривается как NUMERIC. Исправление любезно предоставлено Расселом Стюартом.

    This change is also backported to: 0.8.2

    References: #2757

  • [bug] [ext]

    Исправлена ошибка, из-за которой, если составной тип задавался функцией, а не классом, расширение mutable сбивалось при попытке проверить этот столбец на принадлежность к MutableComposite (что не так). Любезно предоставлено asldevi.

    This change is also backported to: 0.8.2

  • [requirements]

    Для запуска набора модульных тестов теперь требуется библиотека Python mock. Хотя начиная с версии Python 3.3 она входит в состав стандартной библиотеки, для запуска модульных тестов или использования пакета sqlalchemy.testing для внешних диалектов потребуется установить ее и в предыдущих версиях Python.

    This change is also backported to: 0.8.2

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