0.6 Changelog

0.6.9

Released: Sat May 05 2012

general

  • [general]

    Настроен механизм «importlater», который используется для разрешения циклов импорта, таким образом, что использование __import__ завершается при импорте sqlalchemy или sqlalchemy.orm, что позволяет избежать использования __import__ после запуска приложением новых потоков, исправления.

    References: #2279

orm

  • [orm] [bug]

    исправлена некорректная оценка объекта user-mapped в булевом контексте в query.get().

    References: #2310

  • [orm] [bug]

    Исправлено форматирование ошибок, возникающих при случайной передаче кортежа в session.query().

    References: #2297

  • [orm]

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

    References: #2197

  • [orm]

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

    References: #2228

  • [orm]

    Исправлена ошибка, при которой запрос query.join() + aliased=True из структуры join-inh к себе на relationship() с условием join на дочерней таблице неправомерно преобразовывал ведущую сущность в объединенную.

    References: #2234

  • [orm]

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

    References: #2287

  • [orm]

    Исправлена ошибка, из-за которой, если в сопоставленном классе переопределялись __hash__() или __eq__() на что-то нестандартное, что является поддерживаемым случаем использования, так как SQLA никогда не должна обращаться к этим методам, эти методы обращались, если класс был частью «составного» (т.е. не состоящего из одного элемента) набора результатов.

    References: #2215

  • [orm]

    Исправлена тонкая ошибка, приводившая к разрыву SQL при возникновении: column_property() против подзапроса + joinedload + LIMIT + order by the column property(). .

    References: #2188

  • [orm]

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

    References: #2207

  • [orm]

    Исправлено утверждение «no statement condition» в Query, которое пыталось подняться, если после вызова from_statement() был вызван генеративный метод.

    References: #2199

  • [orm]

    Cls.column.collate(«some collation») теперь работает.

    References: #1776

examples

  • [examples]

    Скорректирован пример dictlike-polymorphic.py для применения CAST таким образом, чтобы он работал на PG, других базах данных.

    References: #2266

engine

  • [engine]

    В 0.7.4 перенесено исправление, гарантирующее, что соединение находится в корректном состоянии перед попыткой вызова rollback()/prepare()/release() для транзакций с точкой сохранения и двухфазных транзакций.

    References: #2317

sql

  • [sql]

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

    References: #2188

  • [sql]

    Исправлена ошибка, из-за которой при использовании некоторых диалектов для типа String устанавливался флаг «warn on unicode». Эта ошибка отсутствует в версии 0.7.

  • [sql]

    Исправлена ошибка, из-за которой метод with_only_columns() в Select не работал, если передавался selectable. Однако поведение FROM здесь по-прежнему некорректно, поэтому для использования этого варианта в любом случае нужна версия 0.7.

    References: #2270

schema

  • [schema]

    Добавлено информативное сообщение об ошибке, когда ForeignKeyConstraint ссылается на имя столбца в родителе, которое не найдено.

postgresql

  • [postgresql]

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

    References: #2141, #2291

mysql

  • [mysql]

    Исправлен диалект OurSQL, в котором для команд XA вместо символа „»“ используется анси-нейтральный символ кавычек «“». …

    References: #2186

  • [mysql]

    CREATE TABLE поместит опцию COLLATE после CHARSET, что, по-видимому, является частью произвольных правил MySQL относительно того, будет ли это действительно работать или нет.

    References: #2225

mssql

  • [mssql] [bug]

    Декодирование входящих значений при получении списка имен индексов и имен столбцов в этих индексах.

    References: #2269

oracle

  • [oracle]

    Добавлен ORA-00028 для кодов отключения, для получения кода используйте cx_oracle _Error.code.

    References: #2200

  • [oracle]

    исправлен тип oracle.RAW, который не генерировал корректный DDL.

    References: #2220

  • [oracle]

    добавлено CURRENT в список зарезервированных слов.

    References: #2212

0.6.8

Released: Sun Jun 05 2011

orm

  • [orm]

    Вызов query.get() для сущности, основанной на столбцах, является некорректным, теперь это условие вызывает предупреждение об устаревании.

    References: #2144

  • [orm]

    не_первичный отображатель будет наследовать _идентичность_класса первичного отображателя. Таким образом, при использовании не_первичного отображения для класса, который обычно находится в наследовании, будут получены результаты, совместимые с результатами первичного отображения.

    References: #2151

  • [orm]

    Репортирована реализация карты идентификации 0.7, которая не использует мьютекс для удаления. Это было сделано в связи с тем, что некоторые пользователи по-прежнему получали тупики, несмотря на исправления в 0.6.7; подход 0.7, не использующий мьютекс, похоже, не приводит к проблемам с «изменением размера словаря», что было первоначальным основанием для использования мьютекса.

    References: #2148

  • [orm]

    Исправлено сообщение об ошибке «cannot execute syncrule for destination column „q“; mapper „X“ does not map this column» для ссылки на правильный mapper.

    References: #2163

  • [orm]

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

    References: #2149

  • [orm]

    mapper() будет игнорировать ненастроенные внешние ключи к несвязанным таблицам при определении условия наследования между родительским и дочерним классом. Это эквивалентно поведению, уже примененному в декларативном. Заметим, что в 0.7 для этого есть более полное решение, изменяющее способ определения ошибки FK в самой функции join().

    References: #2153

  • [orm]

    Исправлена ошибка, из-за которой отображение mapper на анонимный псевдоним при использовании логирования приводило к ошибке, связанной с отсутствием знака % в имени псевдонима.

    References: #2171

  • [orm]

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

    References: #2170

  • [orm]

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

    References: #2182

engine

  • [engine]

    Скорректирован метод __contains__() строки результата RowProxy таким образом, что внутри строки не генерируется исключение throw; NoSuchColumnError() также будет генерировать свое сообщение независимо от того, может ли конструкция столбца быть приведена к строке.

    References: #2178

sql

  • [sql]

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

    References: #2147

  • [sql]

    Исправлена ошибка, из-за которой вложение метки select() с другой меткой в нее приводило к некорректному экспорту столбцов. Помимо прочего, это приводило к нарушению сопоставления ORM column_property() с другим column_property(). …

    References: #2167

postgresql

  • [postgresql]

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

    References: #2141

  • [postgresql]

    Исправлены некоторые модульные тесты, касающиеся числовых массивов, оператора MATCH. Исправлена потенциальная неточность в работе с плавающей точкой, а некоторые тесты оператора MATCH пока выполняются только в EN-ориентированной локали. .

    References: #2175

mssql

  • [mssql]

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

    References: #2169

  • [mssql]

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

    References: #2159

0.6.7

Released: Wed Apr 13 2011

orm

  • [orm]

    Ужесточили соотношение итерации и удаления мьютекса при итерации карты идентичности, пытаясь снизить вероятность того, что (крайне редко) реентерабельная операция gc приведет к тупику. Возможно, в 0.7 мьютекс будет удален.

    References: #2087

  • [orm]

    Добавлен аргумент name для Query.subquery(), позволяющий присваивать объекту псевдонима фиксированное имя.

    References: #2030

  • [orm]

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

    References: #2019

  • [orm]

    Исправлена ошибка, при которой «средний» класс в полиморфной иерархии не имел столбца „polymorphic_on“, если в нем не был указан также „polymorphic_identity“, что приводило к странным ошибкам при обновлении, неправильной загрузке класса при запросе от этой цели. Также выдается корректный критерий WHERE при использовании наследования одной таблицы.

    References: #2038

  • [orm]

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

    References: #1995

  • [orm]

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

    References: #2046

  • [orm]

    Исправлена ошибка в query.options(), из-за которой путь, примененный к lazyload с использованием строковых ключей, мог накладываться на одноименный атрибут не той сущности. В примечании 0.7 приведена обновленная версия этого исправления.

    References: #2098

  • [orm]

    Переформулировано исключение, возникающее при попытке прошить подкласс, не являющийся полиморфным по отношению к супертипу.

    References: #2063

  • [orm]

    Некоторые исправления в обработке состояний для обратных ссылок, обычно при autoflush=False, когда коллекция с обратными ссылками не могла корректно обрабатывать добавления/удаления без чистого изменения. Спасибо Ричарду Мурри за тестовый пример + патч.

    References: #2123

  • [orm]

    при использовании функции from_self() предложение «иметь» будет скопировано из внутреннего запроса во внешний.

    References: #2130

examples

  • [examples]

    Пример кэширования Beaker допускает аргумент «query_cls» в функции query_callable().

    References: #2090

engine

  • [engine]

    Исправлена ошибка в QueuePool, SingletonThreadPool, из-за которой соединения, отброшенные в результате переполнения или периодической очистки(), не закрывались явным образом, оставляя сборку мусора на усмотрение задачи. Это, как правило, касается только бэкендов без подсчета ссылок, таких как Jython и PyPy. Спасибо Jaimy Azle за обнаружение этой проблемы.

    References: #2102

sql

  • [sql]

    Column.copy(), используемая в table.tometadata(), копирует атрибут „doc“.

    References: #2028

  • [sql]

    Добавлены некоторые defs в расширение resultproxy.c, чтобы расширение компилировалось и работало на Python 2.4.

    References: #2023

  • [sql]

    Расширение компилятора теперь поддерживает переопределение компиляции по умолчанию выражения expression._BindParamClause, в результате чего автоматически генерируемые привязки в предложениях VALUES/SET операторов insert()/update() также будут использовать новые правила компиляции.

    References: #2042

  • [sql]

    Добавлены аксессоры для ResultProxy «returns_rows», «is_insert»

    References: #2089

  • [sql]

    Ключевые слова limit/offset в select(), а также значение, передаваемое в select.limit()/offset(), будут приведены к целочисленному виду.

    References: #2116

postgresql

  • [postgresql]

    При явном выполнении последовательности выводится имя автогенерируемой последовательности столбца SERIAL, что в настоящее время происходит только при implicit_returning=False, теперь учитывается, если имя таблицы + столбца превышает 63 символа, используя ту же логику, которую использует PostgreSQL.

    References: #1083

  • [postgresql]

    В список исключений «disconnect» добавлено дополнительное сообщение libpq - «не удалось получить данные от сервера».

    References: #2044

  • [postgresql]

    Добавлены RESERVED_WORDS для диалекта postgresql.

    References: #2092

  • [postgresql]

    Исправлен тип BIT, позволяющий использовать параметр «длина», «изменяющийся» параметр. Также исправлено отражение.

    References: #2073

mysql

  • [mysql]

    Диалект oursql принимает те же аргументы «ssl» в create_engine(), что и MySQLdb.

    References: #2047

sqlite

  • [sqlite]

    Исправлена ошибка, при которой отражение внешнего ключа, созданного как «REFERENCES <tablename>» без имени col, приводило к ошибке.

    References: #2115

mssql

  • [mssql]

    Переписан запрос, используемый для получения определения представления, как правило, при использовании интерфейса Inspector, с использованием sys.sql_modules вместо информационной схемы, что позволяет полностью возвращать определения представлений длиной более 4000 символов.

    References: #2071

oracle

  • [oracle]

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

    References: #2100

  • [oracle]

    В диалекте Oracle добавлен флаг use_binds_for_limits=False create_engine(), который выводит значения LIMIT/OFFSET в строку, а не в виде биндов, что, как сообщается, модифицирует план выполнения, используемый Oracle.

    References: #2116

misc

  • [informix]

    Добавлен диалект RESERVED_WORDS informix.

    References: #2092

  • [firebird]

    Флаг «implicit_returning» в функции create_engine() учитывается, если он установлен в False.

    References: #2083

  • [ext]

    Класс horizontal_shard ShardedSession принимает в качестве аргумента конструктора общий аргумент сессии «query_cls», что позволяет в дальнейшем создавать подклассы ShardedQuery.

    References: #2090

  • [declarative]

    Добавлена явная проверка случая, когда для атрибута столбца декларативного класса используется имя „metadata“.

    References: #2050

  • [declarative]

    Исправить сообщение об ошибке, ссылающееся на старое имя @classproperty, на ссылку @declared_attr

    References: #2061

  • [declarative]

    Аргументы в __mapper_args__, которые не являются «хэшируемыми», не принимаются за всегда хэшируемые, возможно, столбцовые аргументы.

    References: #2091

  • [documentation]

    Документированные типы SQLite DATE/TIME/DATETIME.

    References: #2029

0.6.6

Released: Sat Jan 08 2011

orm

  • [orm]

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

  • [orm]

    Исправлена ошибка, при которой параметр «passive_deletes=“all“» не передавал правильные символы ленивым загрузчикам при промывке, что приводило к необоснованной загрузке.

    References: #2013

  • [orm]

    Исправлена ошибка, из-за которой составные атрибуты не могли быть использованы в сопоставленном операторе select. Обратите внимание, что в версии 0.7 работа композита будет существенно изменена.

    References: #1997

  • [orm]

    Флаг active_history также добавлен в функцию composite(). Этот флаг не имеет эффекта в 0.6, а является флажком-заместителем для совместимости в будущем, так как в 0.7 он применяется для композитов.

    References: #1976

  • [orm]

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

    References: #2002

  • [orm]

    Выдается предупреждение при указании version_id_col в наследуемом мэппере, когда у наследуемого мэппера уже есть такой, если выражения этих колонок не совпадают.

    References: #1987

  • [orm]

    Флаг «innerjoin» не действует в цепочке объединений joinedload(), если предыдущее объединение в этой цепочке является внешним, что позволяет корректно возвращать в результаты первичные строки без ссылающейся дочерней строки.

    References: #1954

  • [orm]

    Исправлена ошибка, связанная со стратегией «subqueryload», при которой стратегия не работала, если сущность представляла собой конструкцию aliased().

    References: #1964

  • [orm]

    Исправлена ошибка, связанная со стратегией «загрузки подзапросов», когда при использовании многоуровневой загрузки вида A->joined-subclass->C соединение не выполнялось

    References: #2014

  • [orm]

    Исправлена индексация объектов Query по -1. Он ошибочно преобразовывался в пустой срез -1:0, что приводило к ошибке IndexError.

    References: #1968

  • [orm]

    Аргумент mapper «primary_key» может передаваться как в виде отдельного столбца, так и в виде списка или кортежа. В примерах документации, где он представлялся в виде скалярного значения, он был заменен на список.

    References: #1971

  • [orm]

    Добавлен флаг active_history в relationship() и column_property(), заставляющий события атрибутов всегда загружать «старое» значение, чтобы оно было доступно для attributes.get_history().

    References: #1961

  • [orm]

    Query.get() будет выдавать ошибку, если количество параметров в составном ключе слишком велико, а также слишком мало.

    References: #1977

  • [orm]

    Перенесено исправление «optimized get» из 0.7, улучшающее генерацию поведения объединенного наследования «load expired row».

    References: #1992

  • [orm]

    Небольшое уточнение для ошибки «primaryjoin», когда условие join «работает» для viewonly, но не работает для non-viewonly, а foreign_keys не был использован - добавление «foreign_keys» в предложение. Также добавьте «foreign_keys» к предложению для общей ошибки «direction».

examples

  • [examples]

    Пример версионирования теперь поддерживает обнаружение изменений в связанном отношении().

engine

  • [engine]

    Предупреждение «unicode warning» в отношении неюникодных данных привязки теперь выдается только при явном использовании типа Unicode, а не при использовании convert_unicode=True для типа engine или String.

  • [engine]

    Исправлена утечка памяти в C-версии процессора десятичных результатов.

    References: #1978

  • [engine]

    Реализована возможность проверки последовательности для C-версии RowProxy, а также регистрация в стиле 2.7 «collections.Sequence» для RowProxy.

    References: #1871

  • [engine]

    Методы Threadlocal движка rollback(), commit(), prepare() не будут подниматься, если транзакция не выполняется; это было ошибкой, введенной в 0.6.

    References: #1998

  • [engine]

    Движок Threadlocal возвращает себя при выполнении begin(), begin_nested(); затем движок реализует методы контекстного менеджера, чтобы разрешить выполнение оператора «with».

    References: #2004

sql

  • [sql]

    Исправлены правила старшинства операторов для нескольких цепочек одного неассоциативного оператора. Например, «x - (y - z)» будет компилироваться как «x - (y - z)», а не как «x - y - z». Также работает с метками, например, «x - (y - z).label(„foo“)».

    References: #1984

  • [sql]

    Атрибут „info“ Column копируется в процессе работы Column.copy(), т.е. так, как это происходит при использовании колонок в декларативных миксинах.

    References: #1967

  • [sql]

    Для DBAPI, таких как pymssql, которые наивно вызывают str() для значений, добавлен процессор привязки для булевых значений, который коэрцитирует их к int.

  • [sql]

    CheckConstraint будет копировать свои атрибуты „initially“, „deferable“ и „_create_rule“ в рамках функции copy()/tometadata().

    References: #2000

postgresql

  • [postgresql]

    Одноэлементные кортежные выражения внутри предложения IN корректно выводятся за скобки, также из

    References: #1984

  • [postgresql]

    Обеспечено распознавание каждого числового кода, кода float, int, скаляра + массива базовым типом psycopg2 и pg8000 «numeric».

    References: #1955

  • [postgresql]

    Для типа UUID добавлен флаг as_uuid=True, который будет принимать и возвращать значения в виде объектов Python UUID(), а не строк. В настоящее время известно, что тип UUID работает только с psycopg2.

    References: #1956

  • [postgresql]

    Исправлена ошибка, при которой KeyError возникал в версиях PG, не поддерживающих ENUM, после выполнения операции dispose+recreate пула.

    References: #1989

mysql

  • [mysql]

    Исправлена обработка ошибок для Jython + zxjdbc, в результате чего свойство has_table() снова работает. Регрессия по сравнению с 0.6.3 (у нас нет билдбота для Jython, извините)

    References: #1960

sqlite

  • [sqlite]

    Предложение REFERENCES в таблице CREATE TABLE, включающее удаленную схему на другую таблицу с тем же именем схемы, теперь отображает удаленное имя без предложения schema, как того требует SQLite.

    References: #1851

  • [sqlite]

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

mssql

  • [mssql]

    К сожалению, переписывание отражения индекса в было протестировано некорректно и давало неверные результаты. Теперь эта регрессия исправлена.

    References: #1770

oracle

  • [oracle]

    Логика «определения десятичной точки» cx_oracle, применяемая для столбцов набора результатов с неоднозначными числовыми характеристиками, теперь использует символ десятичной точки, определяемый настройкой locale/ NLS_LANG, используя определение этого символа по первому соединению. При использовании настройки NLS_LANG с непериодической десятичной точкой также требуется версия cx_oracle 5.0.3 или выше.

    References: #1953

misc

  • [firebird]

    Числовой тип Firebird теперь явно проверяет наличие Decimal, пропускает float(), что позволяет использовать специальные значения, такие как float(„inf“).

    References: #2012

  • [declarative]

    Если __table_args__ не имеет формата tuple или dict и не является None, то возникает ошибка.

    References: #1972

  • [sqlsoup]

    В SqlSoup добавлен метод «map_to()», который представляет собой «главный» метод, принимающий явные аргументы для каждого аспекта selectable и mapping, включая базовый класс для каждого mapping.

    References: #1975

  • [sqlsoup]

    Mapped selectables, используемые в методах map(), with_labels(), join(), больше не помещают заданный аргумент во внутренний словарь «cache». Тем более, что объекты join() и select() создаются в самом методе, и это было практически чистой утечкой памяти.

0.6.5

Released: Sun Oct 24 2010

orm

  • [orm]

    Добавлена новая опция «lazyload» «immediateload». Выдает обычную операцию «ленивой» загрузки автоматически по мере заполнения объекта. Применяется в тех случаях, когда необходимо загрузить объекты, которые будут помещены в автономный кэш или иным образом использованы после того, как сессия будет недоступна, и требуется прямая загрузка «select», а не «joined» или «subquery».

    References: #1914

  • [orm]

    Новые методы запросов: query.label(name), query.as_scalar() возвращают оператор запроса в виде скалярного подзапроса с /без метки; query.with_entities(*ent) заменяет список SELECT запроса новыми сущностями. Примерно эквивалентно генеративной форме query.values(), которая принимает сопоставленные сущности, а также выражения столбцов.

    References: #1920

  • [orm]

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

  • [orm]

    В 0.6.4 исправлена регрессия, возникавшая в случае передачи пустого списка в параметр «include_properties» в функции mapper()

    References: #1918

  • [orm]

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

  • [orm]

    Исправлена ситуация, когда query.join() неадекватно подгонял правую часть к правой части левого join

    References: #1925

  • [orm]

    Query.select_from() был усилен, чтобы гарантировать, что последующий вызов query.join() будет использовать сущность select_from(), если это сопоставленная сущность, а не обычная selectable, в качестве «левой» стороны по умолчанию, а не первой в списке сущностей объекта Query.

  • [orm]

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

  • [orm]

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

  • [orm]

    Исправлена ошибка в query.update(), при которой истечение срока действия „evaluate“ или „fetch“ приводило к неудаче, если ключом выражения столбца являлся атрибут класса с именем, отличным от имени реального столбца.

    References: #1935

  • [orm]

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

  • [orm]

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

    References: #1910

  • [orm]

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

  • [orm]

    Еще один новый флаг в функции relationship(), cascade_backrefs, отключает каскад «сохранения-обновления», если событие было инициировано на «обратной» стороне двунаправленной связи. Это более чистое поведение, позволяющее устанавливать «многие-к-одному» для переходного объекта, не втягивая его в сессию дочернего объекта, и при этом сохраняя возможность каскадирования прямой коллекции. В 0.7 мы можем установить по умолчанию значение False.

  • [orm]

    Немного улучшено поведение параметра «passive_updates=False» при размещении его только на стороне отношения «многие-к-одному»; в документации уточнено, что в действительности passive_updates=False должен использоваться на стороне «один-ко-многим».

  • [orm]

    Размещение passive_deletes=True на стороне многие-к-одному выдает предупреждение, так как вы, вероятно, собирались разместить его на стороне один-ко-многим.

  • [orm]

    Исправлена ошибка, из-за которой «subqueryload» не работал корректно при наследовании одной таблицы для отношения из подкласса - «where type in (x, y, z)» помещался только внутри, а не многократно.

  • [orm]

    При использовании from_self() с наследованием по одной таблице фраза «where type in (x, y, z)» размещается только во внешней части запроса, а не многократно. Возможно, это будет еще немного подкорректировано.

  • [orm]

    scoped_session выдает предупреждение при вызове configure(), если сессия уже присутствует (проверяется только текущий поток)

    References: #1924

  • [orm]

    переработана внутренняя часть mapper.cascade_iterator(), что позволило сократить количество вызовов метода примерно на 9% в некоторых случаях.

    References: #1932

engine

  • [engine]

    Исправлена регрессия в 0.6.4, в результате которой изменение, позволяющее выдавать ошибки курсора, последовательно ломало аксессор result.lastrowid. Добавлено тестовое покрытие для result.lastrowid. Обратите внимание, что lastrowid поддерживается только Pysqlite и некоторыми драйверами MySQL, поэтому в общем случае он не слишком полезен.

  • [engine]

    сообщение в журнале, выдаваемое движком при первом использовании соединения, теперь имеет вид «BEGIN (implicit)», чтобы подчеркнуть, что в DBAPI нет явного begin().

  • [engine]

    добавлена опция «views=True» в metadata.reflect(), которая добавляет список доступных представлений к отражаемым.

    References: #1936

  • [engine]

    engine_from_config() теперь принимает значения „debug“ для „echo“, „echo_pool“, „force“ для „convert_unicode“, boolean для „use_native_unicode“.

    References: #1899

sql

  • [sql]

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

  • [sql]

    TypeDecorator теперь может иметь полностью сконструированный тип, указанный в качестве его «impl», в дополнение к классу типа.

  • [sql]

    TypeDecorator теперь будет помещать себя в качестве результирующего типа для бинарного выражения, где правила приведения типов обычно возвращают его impl-тип - ранее возвращалась копия impl-типа, в которую встраивался TypeDecorator в качестве «диалектного» impl, что, вероятно, было непреднамеренным способом достижения желаемого эффекта.

  • [sql]

    TypeDecorator.load_dialect_impl() по умолчанию возвращает «self.impl», т.е. не тип реализации диалекта «self.impl». Это необходимо для корректной поддержки компиляции. Поведение может быть переопределено пользователем точно так же, как и раньше, с тем же эффектом.

  • [sql]

    Добавлен элемент выражения type_coerce(expr, type_). Рассматривает данное выражение как заданный тип при оценке выражений и обработке строк результатов, но не влияет на генерацию SQL, за исключением анонимной метки.

  • [sql]

    Table.tometadata() теперь копирует и объекты Index, связанные с таблицей.

  • [sql]

    Table.tometadata() выдает предупреждение, если заданная таблица уже присутствует в целевых метаданных - возвращается существующий объект Table.

  • [sql]

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

  • [sql]

    as_scalar(), label() могут быть вызваны на selectable, содержащем Column, который еще не имеет имени.

    References: #1862

  • [sql]

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

    References: #1907

postgresql

  • [postgresql]

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

  • [postgresql]

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

    References: #1933

mysql

  • [mysql]

    Исправлена ошибка, связанная с отражением значения CURRENT_TIMESTAMP по умолчанию, используемого в предложении ON UPDATE, спасибо Таави Бернсу

    References: #1940

mssql

  • [mssql]

    Исправлена ошибка отражения, которая не позволяла корректно обрабатывать отражение неизвестных типов.

    References: #1946

  • [mssql]

    Исправлена ошибка, из-за которой псевдонимы таблиц с «schema» не компилировались должным образом.

    References: #1943

  • [mssql]

    Переписано отражение индексов для использования sys. catalogs, чтобы можно было отражать имена столбцов любой конфигурации (пробелы, встроенные запятые и т.д.). Обратите внимание, что для отражения индексов требуется SQL Server 2005 или выше.

    References: #1770

  • [mssql]

    Диалект mssql+pymssql теперь учитывает часть «port» в URL, а не отбрасывает ее.

    References: #1952

oracle

  • [oracle]

    Аргумент implicit_returning в create_engine() теперь учитывается независимо от обнаруженной версии Oracle. Ранее флаг принудительно принимал значение False, если информация о версии сервера была < 10.

    References: #1878

tests

  • [tests]

    Плагин NoseSQLAlchemyPlugin был перенесен в новый пакет «sqlalchemy_nose», который устанавливается вместе с пакетом «sqlalchemy». Таким образом, скрипт «nosetests» работает как обычно, а опция –with-coverage позволяет включить покрытие до импорта модулей SQLAlchemy, что обеспечивает корректную работу покрытия.

misc

  • [declarative]

    Свойство @classproperty (скоро/теперь @declared_attr) действует для __mapper_args__, __table_args__, __tablename__ в базовом классе, не являющемся mixin, а также в mixins.

    References: #1922

  • [declarative]

    Официальное название/местоположение @classproperty для использования с declarative - sqlalchemy.ext.declarative.declared_attr. То же самое, но перемещается туда, поскольку это скорее «маркер», характерный для декларативного, а не просто техника атрибутов.

    References: #1915

  • [declarative]

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

    References: #1930, #1931

  • [declarative]

    Теперь в mixin можно указать колонку, которая переопределяет одноименную колонку, связанную с суперклассом. Спасибо Ойстейну Хааланду.

  • [informix]

    Большая чистка / модернизация диалекта Informix для 0.6, любезно предоставленная Флорианом Аполлонером.

    References: #1906

  • [misc]

    CircularDependencyError теперь имеет члены .cycles и .edges, которые представляют собой множество элементов, вовлеченных в один или несколько циклов, и множество ребер в виде 2-кортежей.

    References: #1890

0.6.4

Released: Tue Sep 07 2010

orm

  • [orm]

    Название ConcurrentModificationError было изменено на StaleDataError, а описательные сообщения об ошибке были пересмотрены, чтобы точно отражать суть проблемы. Оба названия останутся доступными в обозримом будущем для схем, которые могут указывать ConcurrentModificationError в оговорке «except:».

  • [orm]

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

    References: #1891

  • [orm]

    Класс Session теперь присутствует в sqlalchemy.orm.*. Мы уходим от использования create_session(), имеющего нестандартные значения по умолчанию, для тех ситуаций, когда требуется одношаговый конструктор Session. Однако большинству пользователей следует придерживаться функции sessionmaker() для общего использования.

  • [orm]

    query.with_parent() теперь принимает переходные объекты и для формулировки критерия использует непостоянные значения их атрибутов pk/fk. В документах также уточнено назначение функции with_parent().

  • [orm]

    Аргументы include_properties и exclude_properties в mapper() теперь принимают в качестве членов не только строки, но и объекты Column. Это позволяет различать одноименные объекты Column, например, в join().

  • [orm]

    Теперь выдается предупреждение, если создается отображение на join или другой single selectable, который включает несколько столбцов с одинаковыми именами в своей коллекции .c., и эти столбцы не названы явно как часть одного или отдельных атрибутов (или исключены). В версии 0.7 это предупреждение будет исключением. Обратите внимание, что это предупреждение не выдается, когда комбинация возникает в результате наследования, так что атрибуты по-прежнему могут быть переопределены естественным образом. В 0.7 это будет улучшено.

    References: #1896

  • [orm]

    Теперь в аргументе primary_key функции mapper() можно указать ряд столбцов, которые являются лишь подмножеством вычисляемых столбцов «первичного ключа» отображаемого селекта, при этом не возникнет ошибки. Это поможет в ситуациях, когда эффективный первичный ключ селекта меньше, чем количество столбцов в селекте, которые действительно помечены как «первичный_ключ», например, при объединении двух таблиц по их столбцам первичного ключа.

    References: #1896

  • [orm]

    Удаленный объект теперь получает флаг „deleted“, который запрещает повторное добавление объекта в сессию, так как раньше объект жил в карте идентификации молча, пока к его атрибутам не обращались. Функция make_transient() теперь сбрасывает этот флаг вместе с флагом «key».

  • [orm]

    Функция make_transient() может быть безопасно вызвана на уже переходящем экземпляре.

  • [orm]

    в mapper() выдается предупреждение, если колонка polymorphic_on не присутствует ни в прямой, ни в производной форме в mapped selectable или в with_polymorphic selectable, вместо того, чтобы молча игнорировать ее. Ожидайте, что в версии 0.7 это станет исключением.

  • [orm]

    Еще один проход по серии сообщений об ошибках, выдаваемых при настройке relationship() с неоднозначными аргументами. Параметр «foreign_keys» больше не упоминается, поскольку он практически никогда не нужен, и предпочтительнее, чтобы пользователи устанавливали корректные метаданные ForeignKey, что сейчас и рекомендуется. Если „foreign_keys“ используется и является некорректным, то в сообщении указывается, что атрибут, вероятно, не нужен. Документация по атрибуту расширена. Это связано с тем, что все запутавшиеся пользователи relationship() на ML пытаются использовать foreign_keys из-за сообщения, что только еще больше запутывает их, поскольку метаданные таблицы гораздо понятнее.

  • [orm]

    Если «вторичная» таблица не имеет метаданных ForeignKey и не заданы foreign_keys, даже если пользователь передает испорченную информацию, предполагается, что выражения primary/secondaryjoin должны рассматривать только и все cols во «вторичной» таблице как иностранные. Для «secondary» невозможно, чтобы внешние ключи находились в другом месте в любом случае. Теперь вместо ошибки выдается предупреждение, и сопоставление выполняется успешно.

    References: #1877

  • [orm]

    Перемещение объекта o2m из одной коллекции в другую или, наоборот, изменение объекта, на который ссылается m2o, где внешний ключ также является членом первичного ключа, теперь будет более тщательно проверяться при промывке, является ли изменение значения внешнего ключа на стороне «многих» результатом изменения первичного ключа на стороне «одного», или же «один» - это просто другой объект. В одном случае БД, поддерживающая каскадирование, уже каскадировала значение, и для выполнения UPDATE нам нужно посмотреть на «новое» значение PK, а в другом - продолжить смотреть на «старое». Теперь мы смотрим на «старое» значение, предполагая, что passive_updates=True, если только мы не знаем, что изменение было вызвано переключением PK.

    References: #1856

  • [orm]

    Значение version_id_col может быть изменено вручную, что приведет к UPDATE строки. Теперь при версионных UPDATE и DELETE в предложении WHERE используется «зафиксированное» значение version_id_col, а не ожидающее изменения значение. Генератор версий также обходится стороной, если в атрибуте присутствуют ручные изменения.

    References: #1857

  • [orm]

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

  • [orm]

    Указание аргумента column_mapped_collection, не основанного на столбце, включая string, text() и т.д., приводит к появлению сообщения об ошибке, в котором специально запрашивается элемент столбца, и больше не вводит в заблуждение неверной информацией о text() или literal().

    References: #1863

  • [orm]

    Аналогично, для relationship(), foreign_keys, remote_side, order_by - все выражения, основанные на столбцах, являются принудительными - списки строк явно запрещены, так как это очень распространенная ошибка

  • [orm]

    Динамические атрибуты не поддерживают создание коллекций - добавлено утверждение для случаев вызова функции set_committed_value(), а также применения опций joinedload() или subqueryload() к динамическому атрибуту, вместо отказа / молчаливого отказа.

    References: #1864

  • [orm]

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

    References: #1852

  • [orm]

    object_session() вызывает соответствующую ошибку UnmappedInstanceError при представлении не отображенного экземпляра.

    References: #1881

  • [orm]

    Применены дополнительные мемоизации для вычисления свойств Mapper, что привело к значительному (~90%) сокращению количества вызовов mapper.py во время выполнения в сильно полиморфных конфигурациях отображения.

  • [orm]

    Частный метод mapper _get_col_to_prop, использовавшийся в примере с версионированием, устарел; теперь используйте mapper.get_property_by_column(), который останется публичным методом для этого.

  • [orm]

    пример версионирования теперь работает корректно, если версионирование производится на col, который ранее был NULL.

examples

  • [examples]

    Пример beaker_caching был реорганизован таким образом, что Session, менеджер кэша, declarative_base являются частью окружения, а пользовательский код кэша переносится и теперь находится в файле «caching_query.py». Это позволяет легче «встраивать» пример в существующие проекты.

  • [examples]

    в рецепте версионирования history_meta при копировании столбцов устанавливается значение «unique=False», чтобы таблица версионирования обрабатывала несколько строк с повторяющимися значениями.

    References: #1887

engine

  • [engine]

    Вызов fetchone() или аналогичной функции для результата, который уже исчерпан, закрыт или не является возвращаемым результатом, теперь вызывает ResourceClosedError, подкласс InvalidRequestError, во всех случаях, независимо от бэкенда. Ранее некоторые DBAPI выдавали ProgrammingError (например, pysqlite), другие возвращали None, что приводило к последующим сбоям (например, MySQL-python).

  • [engine]

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

    References: #1894

  • [engine]

    Connection, ResultProxy, а также Session используют ResourceClosedError для всех ошибок типа «данное соединение/транзакция/результат закрыты».

  • [engine]

    Connection.invalidate() может вызываться более одного раза, и последующие вызовы ничего не дают.

sql

  • [sql]

    Вызов функции execute() для конструкции alias() ожидает своего исключения в версии 0.7, поскольку сама по себе она не является «исполняемой». В настоящее время она «проксирует» свой внутренний элемент и условно является «исполняемой», но это не та двусмысленность, которая нам нравится в наши дни.

  • [sql]

    Методы execute() и scalar() ClauseElement теперь соответствующим образом перенесены в подкласс Executable. Методы ClauseElement.execute()/ scalar() все еще присутствуют и ожидают отмены в 0.7, но обратите внимание, что они в любом случае будут вызывать ошибку, если вы не являетесь Executable (если только вы не являетесь alias(), см. предыдущее примечание).

  • [sql]

    Добавлено базовое принуждение математических выражений для Numeric->Integer, чтобы результирующий тип был Numeric независимо от направления выражения.

  • [sql]

    Изменена схема генерации усеченных имен «авто» индексов при использовании флага «index=True» для Column. Усечение происходит только для автогенерируемого имени, а не для пользовательского (в этом случае выдается ошибка), а сама схема усечения теперь основана на фрагменте md5-хэша имени идентификатора, так что несколько индексов для столбцов с похожими именами по-прежнему имеют уникальные имена.

    References: #1855

  • [sql]

    Генерируемое имя индекса также основано на атрибуте «максимальная длина имени индекса», который отделен от «максимальной длины идентификатора» - это сделано для того, чтобы успокоить MySQL, которая имеет максимальную длину 64 для имен индексов, отдельно от их общей максимальной длины 255.

    References: #1412

  • [sql]

    Конструкция text(), если ее поместить в ситуацию, ориентированную на столбцы, будет, по крайней мере, возвращать NULLTYPE для своего типа вместо None, что позволит использовать ее для специальных столбцовых выражений несколько свободнее, чем раньше. literal_column() все же является лучшим выбором.

  • [sql]

    Добавлено полное описание родительской таблицы/столбца, целевой таблицы/столбца в сообщении об ошибке, возникающей, когда ForeignKey не может разрешить цель.

  • [sql]

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

    References: #1865

  • [sql]

    конструкция _Label, т.е. та, которая создается всякий раз, когда вы говорите somecol.label(), теперь считает себя в своем «прокси_наборе», объединенном с прокси-набором содержащегося в ней столбца, а не возвращает напрямую прокси-набор содержащегося столбца. Это позволяет операциям соответствия столбцов, зависящим от идентичности самих _меток, возвращать правильный результат

  • [sql]

    исправлена ошибка ORM.

    References: #1852

postgresql

  • [postgresql]

    Исправлен диалект psycopg2 для использования его метода set_isolation_level() вместо базовой команды «SET SESSION ISOLATION», так как в противном случае psycopg2 сбрасывает уровень изоляции при каждой новой транзакции.

mssql

  • [mssql]

    Исправлен запрос «схема по умолчанию» для работы с бэкендом pymssql.

oracle

  • [oracle]

    В диалект Oracle добавлен тип ROWID для тех случаев, когда может потребоваться явный CAST.

    References: #1879

  • [oracle]

    Отражение индексов в Oracle было настроено таким образом, что отражаются индексы, включающие некоторые или все столбцы первичного ключа, но не тот же набор столбцов, что и в первичном ключе. Индексы, содержащие одинаковые столбцы с первичным ключом, пропускаются при отражении, так как в этом случае предполагается, что индекс является автоматически сгенерированным индексом первичного ключа. Ранее любой индекс, содержащий столбцы PK, пропускался. За исправление спасибо Кенту Боуэру.

    References: #1867

  • [oracle]

    Oracle теперь отражает имена ограничений первичного ключа - также благодаря Кенту Боуэру.

    References: #1868

misc

  • [declarative]

    если @classproperty используется с обычным атрибутом свойства mapper, связанным с классом, то он будет вызван для получения фактического значения атрибута при инициализации. В настоящее время использование @classproperty для атрибута столбца или отношения декларативного класса, не являющегося миксином, не имеет никаких преимуществ - оценка происходит в то же время, как если бы @classproperty не использовался. Но здесь мы, по крайней мере, позволяем ему функционировать так, как ожидается.

  • [declarative]

    Исправлена ошибка, при которой в сообщении «Невозможно добавить дополнительный столбец» отображалось неправильное имя.

  • [firebird]

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

  • [informix]

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

    References: #1904

  • [documentation]

    Документация была реорганизована таким образом, что раздел «API Reference» исчез - все подстрочники из него, которые касались публичного API, перенесены в контекст основного раздела, который о нем рассказывает. Основная документация разделена на разделы «SQLAlchemy Core» и «SQLAlchemy ORM», разделена документация по мапперам/отношениям. Многие разделы переписаны и/или реорганизованы.

0.6.3

Released: Thu Jul 15 2010

orm

  • [orm]

    Устранена ошибочная нагрузка many-to-many в unitofwork, которая излишне срабатывала на просроченные/невыгруженные коллекции. Теперь такая нагрузка происходит только в том случае, если значение passive_updates равно False и первичный ключ родителя изменился, или если значение passive_deletes равно False и произошло удаление родителя.

    References: #1845

  • [orm]

    Сущности-колонки (например, query(Foo.id)) копируют свое состояние более полно, когда запросы производятся от них самих + selectable (например, from_self(), union() и т.д.), так что join() и подобные им имеют правильное состояние для работы.

    References: #1853

  • [orm]

    Исправлена ошибка, при которой Query.join() при запросе неорм. столбца и присоединении без предложения on, когда предложение FROM уже присутствует, выдавал проверенное исключение, как и в случае отсутствия предложения.

    References: #1853

  • [orm]

    Улучшена проверка на наличие «несопоставленного класса», включая случай, когда суперкласс сопоставлен, а подкласс - нет. Теперь любые попытки обращения к cls._sa_class_manager.mapper вызывают ошибку UnmappedClassError().

    References: #1142

  • [orm]

    Добавлен аксессор «column_descriptions» к запросу Query, возвращающий список словарей, содержащих информацию об именовании/типировании сущностей, которые будет возвращать запрос. Может быть полезен для создания графических интерфейсов поверх ORM-запросов.

mysql

  • [mysql]

    Метод _extract_error_code() теперь корректно работает с каждым из диалектов MySQL (MySQL-python, OurSQL, MySQL-Connector-Python, PyODBC). Ранее логика переподключения давала сбой при OperationalError, но поскольку MySQLdb и OurSQL имеют собственную функцию переподключения, то никаких симптомов для этих драйверов здесь не было, если только не смотреть логи.

    References: #1848

oracle

  • [oracle]

    Внесены изменения в обработку десятичных дробей в cx_oracle. «Неоднозначные» числа без десятичного знака принудительно приводятся к int на уровне обработчика соединения. Преимущество заключается в том, что int возвращаются как ints без участия объектов типа SQLA и без ненужного преобразования в Decimal.

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

    References: #1840

0.6.2

Released: Tue Jul 06 2010

orm

  • [orm]

    Query.join() будет проверять вызов формы query.join(target, clause_expression), т.е. отсутствие кортежа, и выдавать информативное сообщение об ошибке, что это неправильная форма вызова.

  • [orm]

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

    References: #1824

  • [orm]

    функция post_update функции relationship() была переработана архитектурно для более тесной интеграции с новым модулем работы 0.6. Мотивация изменения заключается в том, что несколько вызовов «post update», каждый из которых затрагивает различные столбцы внешних ключей одной строки, выполняются в одном операторе UPDATE, а не в одном операторе UPDATE для каждого столбца в строке. Обновление нескольких строк также разбивается на несколько исполняемых()операторов, при этом сохраняется последовательное упорядочивание строк.

  • [orm]

    Query.statement, Query.subquery() и т.д. теперь передают в результирующее SQL-выражение значения связывающих параметров, т.е. тех, которые указаны в query.params(). Ранее значения не передавались, и связывающие параметры выводились как None.

  • [orm]

    Subquery-eager-loading теперь работает с объектами Query, включающими params(), а также с запросами get().

  • [orm]

    Теперь можно вызывать make_transient() для экземпляра, на который ссылаются родительские объекты по схеме many-to-one, при этом значение внешнего ключа родительского объекта не будет временно установлено в None - это было связано с обработчиком флеша «detect primary key switch». Теперь он игнорирует объекты, которые больше не находятся в состоянии «persistent», а идентификатор внешнего ключа родительского объекта остается незатронутым.

  • [orm]

    query.order_by() теперь принимает значение False, которое отменяет все существующие состояния order_by() в запросе, позволяя вызывать последующие генеративные методы, не поддерживающие ORDER BY. Это не то же самое, что уже существующая возможность передачи None, которая подавляет все существующие настройки order_by(), включая настроенные на mapper. False будет выглядеть так, как будто функция order_by() никогда не вызывалась, в то время как None является активной настройкой.

  • [orm]

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

  • [orm]

    Функция make_transient() теперь присутствует в создаваемой документации.

  • [orm]

    make_transient() удаляет все «загрузчики» callables из состояния, которое делается переходным, удаляя любое «просроченное» состояние - все незагруженные атрибуты возвращаются в состояние undefined, None/empty при доступе.

sql

  • [sql]

    Предупреждение, выдаваемое типами Unicode и String с convert_unicode=True, больше не включает в себя переданное значение. Это сделано для того, чтобы реестр предупреждений Python не увеличивался в размерах, предупреждение выдавалось один раз в соответствии с настройками фильтра предупреждений, а большие строковые значения не загрязняли вывод.

    References: #1822

  • [sql]

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

  • [sql]

    Аргумент «ESCAPE» оператора LIKE или подобного ему передается через render_literal_value(), который может реализовать экранирование обратных слэшей.

    References: #1400

  • [sql]

    Исправлена ошибка в типе Enum, сбивавшая флаг native_enum при использовании TypeDecorators или других сценариев адаптации.

  • [sql]

    Инспектор проверяет bind.connect() при вызове, чтобы убедиться, что инициализация была вызвана. Внутреннее имя «.conn» меняется на «.bind», так как это именно оно и есть.

  • [sql]

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

  • [sql]

    Column.copy() принимает атрибут «unique» среди прочих, исправления, касающиеся декларативных миксинов

    References: #1829

postgresql

  • [postgresql]

    Переопределена функция render_literal_value(), которая экранирует обратные слэши, в настоящее время она применяется для выражения ESCAPE в выражениях типа LIKE и подобных. В конечном счете, для полноценного поведения это должно определять значение «standard_conforming_strings».

    References: #1400

  • [postgresql]

    Не генерируются команды «CREATE TYPE» / «DROP TYPE» при использовании types.Enum на PG версии до 8.3 - флаг supports_native_enum полностью соблюдается.

    References: #1836

mysql

  • [mysql]

    Диалект MySQL не выдает CAST() для обнаруженных версий MySQL < 4.0.2. Это позволяет выполнить проверку юникода при подключении.

    References: #1826

  • [mysql]

    Диалект MySQL теперь определяет sql-режим NO_BACKSLASH_ESCAPES, в дополнение к ANSI_QUOTES.

  • [mysql]

    Переопределена функция render_literal_value(), которая экранирует обратные косые черты, в настоящее время это относится к предложению ESCAPE в выражениях LIKE и подобных. Такое поведение обусловлено определением значения NO_BACKSLASH_ESCAPES.

    References: #1400

mssql

  • [mssql]

    Если server_version_info находится вне обычного диапазона (8, ), (9, ), (10, ), то выдается предупреждение, в котором предлагается проверить, что в конфигурации FreeTDS используется версия 7.0 или 8.0, а не 4.2.

    References: #1825

oracle

  • [oracle]

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

    References: #1819

  • [oracle]

    Метаданные Oracle «native decimal» начинают возвращать неоднозначную информацию о типе числовых значений, когда столбцы встраиваются в подзапросы, а также когда ROWNUM используется вместе с подзапросами, как это происходит в случае limit/offset. Мы добавили эти неоднозначные условия в обработчик cx_oracle «convert to Decimal()», чтобы в большем числе случаев получать числовые значения в десятичном виде, а не в виде плавающих чисел. Затем, по запросу, они преобразуются в Integer или Float, либо сохраняются в виде Decimal без потерь.

    References: #1840

misc

  • [firebird]

    Исправлена некорректная подпись в do_execute(), ошибка, появившаяся в 0.6.1.

    References: #1823

  • [firebird]

    В диалекте Firebird добавлены типы CHAR, VARCHAR, принимающие флаг «charset», для поддержки условия Firebird «CHARACTER SET».

    References: #1813

  • [declarative]

    Добавлена поддержка @classproperty для предоставления любой конструкции схемы/отображения из декларативного миксина, включая колонки с внешними ключами, отношения, column_property, отложенные. Это решает все подобные проблемы с декларативными миксинами. Если в миксине указан какой-либо подкласс MapperProperty без использования @classproperty, то будет выдана ошибка.

    References: #1751, #1796, #1805

  • [declarative]

    Теперь класс mixin может определить колонку, которая совпадает с колонкой, присутствующей в __table__, определенной в подклассе. Однако он не может определить столбец, который не присутствует в __таблице__, и сообщение об ошибке, приведенное здесь, работает.

    References: #1821

  • [compiler] [extension]

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

    References: #1838

  • [documentation]

    Добавлена документация по инспектору.

    References: #1820

  • [documentation]

    Исправлены декораторы @memoized_property и @memoized_instancemethod, чтобы документация Sphinx воспринимала эти атрибуты и методы, например ResultProxy.inserted_primary_key.

    References: #1830

0.6.1

Released: Mon May 31 2010

orm

  • [orm]

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

    References: #1782

  • [orm]

    Исправлена ошибка, внесенная в рефактор 0.6.0, которая нарушала работу обновлений для двунаправленных relationship() с post_update=True.

    References: #1807

  • [orm]

    session.merge() не приведет к истечению срока действия атрибутов на возвращаемом экземпляре, если этот экземпляр находится в состоянии «pending».

    References: #1789

  • [orm]

    исправлен метод __setstate__ в CollectionAdapter для предотвращения сбоя при десериализации, когда родительский InstanceState еще не десериализован.

    References: #1802

  • [orm]

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

    References: #1797

  • [orm]

    Добавлено более агрессивное кэширование при использовании маппером выражений UPDATE, INSERT и DELETE. При условии, что в операторе нет объектных SQL-выражений, объекты выражений кэшируются мэппером после первого создания, а их скомпилированная форма хранится в кэш-словаре в течение всего времени работы связанного Engine. Кэш представляет собой LRUCache на тот редкий случай, когда картограф получает в качестве UPDATE чрезвычайно большое количество различных шаблонов столбцов.

sql

  • [sql]

    Теперь expr.in_() принимает в качестве аргумента конструкцию text(). Группировочные скобки добавляются автоматически, т.е. использование выглядит как col.in_(text(«select id from table»)).

    References: #1793

  • [sql]

    Колонки типа _Binary (т.е. LargeBinary, BLOB и т.д.) будут когерентно преобразовывать «базовую строку» в правой части также в _Binary, чтобы происходила необходимая обработка DBAPI.

  • [sql]

    Добавлена функция table.add_is_dependent_on(othertable), позволяющая вручную размещать правила зависимости между двумя объектами Table для использования в create_all(), drop_all(), sorted_tables.

    References: #1801

  • [sql]

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

    References: #1778

  • [sql]

    Исправлен ошибочный символ пробела при генерации ADD CONSTRAINT для именованного ограничения UNIQUE.

  • [sql]

    Исправлен аргумент «table» в конструкторе ForeignKeyConstraint

    References: #1571

  • [sql]

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

    References: #1786

  • [sql]

    метод _make_proxy() для ColumnClause и Column теперь использует self.__class__ для определения класса возвращаемого объекта вместо жесткого кодирования в ColumnClause/Column, что несколько упрощает создание специфических подклассов этих объектов, работающих в ситуациях псевдонимов/подзапросов.

  • [sql]

    func.XXX() не приводит к случайному разрешению в классы, не являющиеся функциями (например, исправляет func.text()).

    References: #1798

mysql

  • [mysql]

    func.sysdate() выдает на MySQL «SYSDATE()», т.е. с завершающей скобкой.

    References: #1794

sqlite

  • [sqlite]

    Исправлена конкатенация ограничений, когда ограничение «PRIMARY KEY» переносится на уровень столбца из-за того, что ключевое слово SQLite AUTOINCREMENT выводится на экран.

    References: #1812

oracle

  • [oracle]

    Добавлена проверка на наличие версий cx_oracle ниже версии 5, в этом случае несовместимый «обработчик типов вывода» не будет использоваться. Это повлияет на точность десятичных вычислений и некоторые проблемы работы с юникодом.

    References: #1775

  • [oracle]

    Исправлен режим use_ansi=False, который практически во всех случаях приводил к неработающим формулам WHERE.

    References: #1790

  • [oracle]

    Восстановлена поддержка Oracle 8 с помощью cx_oracle, в том числе автоматически устанавливается значение use_ansi в False, NVARCHAR2 и NCLOB не приводятся к Unicode, проверка «native unicode» не проходит, режим cx_oracle «native unicode» отключен, VARCHAR() выдается с подсчетом байтов вместо подсчета символов.

    References: #1808

  • [oracle]

    oracle_xe 5 не принимает объект Python unicode в строке подключения в обычном режиме Python 2.x - поэтому мы коэрцитивно обращаемся к str() напрямую. Неаскриптивные символы здесь не поддерживаются в строках подключения, поскольку мы не знаем, какую кодировку мы могли бы использовать.

    References: #1670

  • [oracle]

    FOR UPDATE выдается в синтаксически правильной позиции, когда используется ограничение/смещение, т.е. в подзапросе ROWNUM. Однако Oracle не умеет работать с FOR UPDATE с ORDER BY или с подзапросами, поэтому он все еще не очень удобен, но, по крайней мере, SQLA пропускает SQL через парсер Oracle.

    References: #1815

misc

  • [engines]

    Исправлена сборка расширений на языке C на Python 2.4.

    References: #1781

  • [engines]

    Классы пулов будут повторно использовать один и тот же параметр «имя_пула_логирования» после выполнения функции dispose().

  • [engines]

    Движок приобретает аргумент «execution_options» и метод update_execution_options(), который будет применяться ко всем соединениям, генерируемым этим движком.

  • [firebird]

    Добавлена метка в запрос, используемый в has_table() и has_sequence(), для работы со старыми версиями Firebird, в которых не предусмотрены метки для столбцов результатов.

    References: #1521

  • [firebird]

    Добавлено целочисленное принуждение к атрибуту «type_conv» при передаче через строку запроса, чтобы он правильно интерпретировался Kinterbasdb.

    References: #1779

  • [firebird]

    В список строк исключений, указывающих на разрыв соединения, добавлена строка „connection shutdown“.

    References: #1646

  • [sqlsoup]

    Конструктор SqlSoup принимает аргумент base, который определяет базовый класс, используемый для сопоставленных классов, по умолчанию это object.

    References: #1783

0.6.0

Released: Sun Apr 18 2010

orm

  • [orm]

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

    References: #1081, #1742

  • [orm]

    Наряду с переписыванием UOW, это также устраняет проблему, появившуюся в 0.6beta3, связанную с определением топологических циклов для единиц работы с длинными циклами зависимостей. Теперь мы используем алгоритм, написанный Гвидо (спасибо Гвидо!).

  • [orm]

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

    References: #1764

  • [orm]

    Ленивая загрузка коллекции отключает стандартную eagerloading на обратной стороне many-to-one, поскольку такая загрузка по определению не нужна.

    References: #1495

  • [orm]

    Теперь функция Session.refresh() сначала выполняет эквивалентную функцию expire() для данного экземпляра, чтобы каскад «refresh-expire» распространялся. Ранее функция refresh() никак не зависела от наличия каскада «refresh-expire». Это изменение в поведении по сравнению с 0.6beta2, где флаг «lockmode», переданный в refresh(), приводил к проверке версии. Поскольку сначала истекает срок действия экземпляра, refresh() всегда обновляет объект до самой последней версии.

  • [orm]

    Каскад „refresh-expire“, достигнув объекта, находящегося в состоянии ожидания, удалит его, если каскад также включает «delete-orphan», или просто отсоединит его в противном случае.

    References: #1754

  • [orm]

    id(obj) больше не используется внутри файла topological.py, так как функции сортировки теперь требуют только хэшируемые объекты.

    References: #1756

  • [orm]

    По умолчанию ORM устанавливает в качестве docstring всех генерируемых дескрипторов значение None. Это можно переопределить с помощью команды „doc“ (или, если используется Sphinx, атрибутные docstrings тоже работают).

  • [orm]

    Добавлен аргумент kw „doc“ во все вызываемые свойства mapper, а также в Column(). Строка „doc“ будет собираться как атрибут „__doc__“ в дескрипторе.

  • [orm]

    Использование version_id_col на бэкенде, поддерживающем cursor.rowcount для execute(), но не executemany(), теперь работает при удалении (уже работало для сохранений, так как они не используют executemany()). Для бэкенда, который вообще не поддерживает cursor.rowcount, выдается предупреждение, как и в случае с сохранениями.

    References: #1761

  • [orm]

    ORM теперь кратковременно кэширует «скомпилированную» форму конструкций insert() и update() при промывке списков объектов одного класса, что позволяет избежать избыточной компиляции для каждого отдельного INSERT/UPDATE в рамках отдельного вызова flush().

  • [orm]

    Внутренние методы getattr(), setattr(), getcommitted() для ColumnProperty, CompositeProperty, RelationshipProperty были подчеркнуты (т.е. являются приватными), изменилась сигнатура.

examples

  • [examples]

    Обновлен пример attribute_shard.py для использования более надежного метода поиска в запросе бинарных выражений, которые сравнивают столбцы с литеральными значениями.

sql

  • [sql]

    Восстановлена некоторая логика связывания меток из 0.5, благодаря которой таблицы с именами столбцов, перекрывающими другой столбец вида «<tablename>_<columnname>», не будут выдавать ошибок, если при UPDATE в качестве имени связывания используется column._label. Добавлено тестовое покрытие, отсутствовавшее в 0.5.

    References: #1755

  • [sql]

    somejoin.select(fold_equivalents=True) больше не является устаревшей и со временем будет включена в более полную версию функции for.

    References: #1729

  • [sql]

    тип Numeric выдает огромное предупреждение, когда ожидается преобразование float в Decimal из DBAPI, возвращающего float. К ним относятся SQLite, Sybase, MS-SQL.

    References: #1759

  • [sql]

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

  • [sql]

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

  • [sql]

    Добавлена новая опция выполнения „compiled_cache“. Словарь, в котором будут кэшироваться компилируемые объекты, когда Connection компилирует выражение клаузы в компилируемый объект, специфичный для диалекта и параметров. Пользователь обязан управлять размером этого словаря, который будет иметь ключи, соответствующие диалекту, элементу клаузы, именам столбцов в клаузе VALUES или SET в INSERT или UPDATE, а также «пакетному» режиму для оператора INSERT или UPDATE.

  • [sql]

    В reflection.Inspector добавлена функция get_pk_constraint(), аналогичная функции get_primary_keys(), но возвращающая dict, включающий имя ограничения, для поддерживаемых бэкендов (на данный момент PG).

    References: #1769

  • [sql]

    Table.create() и Table.drop() больше не применяют события создания/отмены на уровне метаданных.

    References: #1771

postgresql

  • [postgresql]

    Теперь PostgreSQL корректно отражает имена последовательностей, связанных с колонками SERIAL, после того, как имя последовательности было изменено. За исправление спасибо Кумару Макмиллану.

    References: #1071

  • [postgresql]

    Исправлен недостаток импорта в типе psycopg2._PGNumeric при получении неизвестного числа.

  • [postgresql]

    Диалекты psycopg2/pg8000 теперь знают о типах возврата REAL[], FLOAT[], DOUBLE_PRECISION[], NUMERIC[], не вызывая исключения.

  • [postgresql]

    PostgreSQL отражает имя ограничений первичного ключа, если таковой существует.

    References: #1769

oracle

  • [oracle]

    Теперь мы используем конвертеры вывода cx_oracle, чтобы DBAPI возвращал нативно те значения, которые мы предпочитаем:

  • [oracle]

    Значения типа NUMBER с положительной точностью + масштаб преобразуются в cx_oracle.STRING, а затем в Decimal. Это позволяет добиться идеальной точности для типа Numeric при использовании cx_oracle.

    References: #1759

  • [oracle]

    STRING/FIXED_CHAR теперь конвертируются в юникод нативно. При этом к типам String в SQLAlchemy не нужно применять никаких преобразований.

misc

  • [engines]

    Расширение C теперь работает и с DBAPI, использующими в качестве строк пользовательские последовательности (а не только кортежи).

    References: #1757

  • [ext]

    расширение компилятора теперь позволяет использовать @compiles декораторы на базовых классах, которые распространяются на дочерние классы, @compiles декораторы на дочерних классах, которые не нарушены @compiles декоратором на базовом классе.

  • [ext]

    Declarative выдаст информационное сообщение об ошибке, если в строковых аргументах relationship() будет содержаться ссылка на не сопоставленный атрибут класса.

  • [ext]

    Переработана логика работы с «миксинами» в декларативном режиме, чтобы дополнительно разрешить __mapper_args__ в качестве @classproperty для миксина, например, для динамического назначения polymorphic_identity.

  • [firebird]

    Функциональность result.rowcount может быть отключена для каждого конкретного двигателя путем установки „enable_rowcount=False“ в create_engine(). Обычно cursor.rowcount вызывается после любого оператора UPDATE или DELETE, поскольку курсор закрывается, а Firebird требует открытого курсора, чтобы получить счетчик строк. Однако этот вызов несколько дороговат, поэтому его можно отключить. Для повторного включения на основе каждого выполнения можно использовать опцию выполнения „enable_rowcount=True“.

0.6beta3

Released: Sun Mar 28 2010

orm

  • [orm]

    Основные возможности: В relationship() добавлена новая возможность загрузки «подзапросов». Это опция ускоренной загрузки, которая генерирует второй SELECT для каждой коллекции, представленной в запросе, по всем родителям сразу. Запрос перевыпускает исходный запрос конечного пользователя, обернутый в подзапрос, применяет присоединения к целевой коллекции и загружает все эти коллекции полностью в одном результате, аналогично «объединенной» загрузке, но с использованием всех внутренних присоединений и без повторной выборки полных родительских строк (как это делают большинство DBAPI, даже если столбцы пропускаются). Загрузка подзапросов доступна на уровне конфигурации маппера с помощью «lazy=“subquery“» и на уровне опций запроса с помощью «subqueryload(props…)», «subqueryload_all(props…)».

    References: #1675

  • [orm]

    Чтобы учесть тот факт, что теперь существует два вида ускоренной загрузки, новые названия для eagerload() и eagerload_all() - joinedload() и joinedload_all(). Старые названия в обозримом будущем останутся синонимами.

  • [orm]

    Флаг «lazy» в функции relationship() теперь принимает строковый аргумент для всех видов загрузки: «select», «joined», «subquery», «noload» и «dynamic», где по умолчанию теперь стоит «select». Прежние значения True/ False/None сохраняют свои обычные значения и в обозримом будущем останутся синонимами.

  • [orm]

    В конструкцию Query() добавлен метод with_hint(). Он вызывает непосредственно select().with_hint() и также принимает сущности, а также таблицы и псевдонимы. См. пункт with_hint() в разделе SQL ниже.

    References: #921

  • [orm]

    Исправлена ошибка в Query, при которой вызов q.join(prop).from_self(…).join(prop) при соединении по тому же критерию, что и внутри, не приводил к появлению второго соединения вне подзапроса.

  • [orm]

    Исправлена ошибка в Query, при которой использование конструкций aliased() приводило к ошибке, если внутри подзапроса, сгенерированного q.from_self() или q.select_from(), ссылалась базовая таблица (но не фактический псевдоним).

  • [orm]

    Исправлена ошибка, которая затрагивала все опции eagerload() и подобные им, из-за которой «удаленные» ускоренные загрузки, т.е. загрузки после ленивой загрузки, например query(A).options(eagerload(A.b, B.c)), ничего не загружали, а использование eagerload(«b.c») работало нормально.

  • [orm]

    В запросе появился метод add_columns(*columns), который является мультиверсией add_column(col). add_column(col) в будущем будет устаревшим.

  • [orm]

    Query.join() определит, будет ли конечным результатом «FROM A JOIN A», и в этом случае выдаст ошибку.

  • [orm]

    Query.join(Cls.propname, from_joinpoint=True) будет более тщательно проверять совместимость «Cls» с текущей точкой соединения и в этом отношении будет действовать так же, как Query.join(«propname», from_joinpoint=True).

sql

  • [sql]

    В конструкцию select() добавлен метод with_hint(). Укажите таблицу/алиас, текст подсказки и необязательное имя диалекта, и «подсказки» будут выведены в соответствующее место в операторе. Работает для Oracle, Sybase, MySQL.

    References: #921

  • [sql]

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

    References: #1747

postgresql

  • [postgresql]

    Диалект psycopg2 будет регистрировать сообщения NOTICE через имя логгера «sqlalchemy.dialects.postgresql».

    References: #877

  • [postgresql]

    типы TIME и TIMESTAMP теперь доступны непосредственно из диалекта postgresql, который добавляет специфичный для PG аргумент „precision“ к обоим типам. „precision“ и „timezone“ корректно отражаются для типов TIME и TIMEZONE.

    References: #997

mysql

  • [mysql]

    При отражении больше не возникает предположения, что TINYINT(1) должен быть BOOLEAN - возвращается TINYINT(1). Используйте Boolean/ BOOLEAN в определении таблицы, чтобы получить поведение преобразования булевых значений.

    References: #1752

oracle

  • [oracle]

    Диалект Oracle будет выдавать определения типа VARCHAR с использованием количества символов, т.е. VARCHAR2(50 CHAR), так что размер столбца будет определяться в символах, а не в байтах. При отражении столбцов символьных типов также будет использоваться ALL_TAB_COLUMNS.CHAR_LENGTH вместо ALL_TAB_COLUMNS.DATA_LENGTH. Оба эти поведения применяются, если версия сервера 9 или выше - для 8-й версии используется старое поведение.

    References: #1744

misc

  • [declarative]

    Использование миксина не приведет к поломке, если миксин реализует непредсказуемый __getattribute__(), т.е. интерфейсы Zope.

    References: #1746

  • [declarative]

    Использование @classdecorator и т.п. в миксинах для определения __tablename__, __table_args__ и т.п. теперь работает, если метод ссылается на атрибуты конечного подкласса.

    References: #1749

  • [declarative]

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

    References: #1751

  • [ext]

    Модуль sqlalchemy.orm.shard теперь стал расширением, sqlalchemy.ext.horizontal_shard. Старый импорт работает с предупреждением об устаревании.

0.6beta2

Released: Sat Mar 20 2010

orm

  • [orm]

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

    References: #1740

  • [orm]

    В Mapper добавлен аргумент «version_id_generator», представляющий собой вызываемую переменную, которая, учитывая текущее значение «version_id_col», возвращает номер следующей версии. Может использоваться для альтернативных схем версионирования, таких как uuid, временные метки.

    References: #1692

  • [orm]

    добавлен kw-аргумент «lockmode» в Session.refresh(), который будет передавать строковое значение в Query так же, как и в with_lockmode(), также будет выполняться проверка версии для связки с поддержкой version_id_col.

  • [orm]

    Исправлена ошибка, при которой вызов query(A).join(A.bs).add_entity(B) в сценарии объединенного наследования приводил к двойному добавлению B в качестве цели и выдавал некорректный запрос.

    References: #1188

  • [orm]

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

    References: #1674

  • [orm]

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

    References: #1719

  • [orm]

    Исправлена ошибка в session.merge(), которая не позволяла объединять диктоподобные коллекции.

  • [orm]

    session.merge() работает с отношениями, которые специально не включают «merge» в опции каскада - цель полностью игнорируется.

  • [orm]

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

    References: #1681

  • [orm]

    Флаг «allow_null_pks» теперь называется «allow_partial_pks», по умолчанию имеет значение True, действует так же, как и в 0.5. За исключением того, что он также реализован в функции merge() таким образом, что SELECT не будет выдан для входящего экземпляра с частично NULL первичным ключом, если флаг равен False.

    References: #1680

  • [orm]

    В 0.6 исправлена ошибка, связанная с оптимизацией «многие-к-одному», в результате которой при изменении «многие-к-одному» по столбцу с непервичным ключом в удаленной таблице (т.е. по внешнему ключу по столбцу UNIQUE) из базы данных будет извлекаться «старое» значение, поскольку если оно находится в сессии, то оно необходимо для правильного учета истории/обратных ссылок, а мы не можем извлекать его из локальной карты идентификации по столбцу с непервичным ключом.

    References: #1737

  • [orm]

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

    References: #1731

  • [orm]

    query.one() больше не применяет LIMIT к запросу, что позволяет обеспечить полный подсчет всех идентификаторов объектов, присутствующих в результате, даже в случае, когда объединение может скрывать несколько идентификаторов для двух или более строк. В качестве бонуса, one() теперь можно вызывать и в запросе, в котором для начала была выполнена функция from_statement(), поскольку она больше не модифицирует запрос.

    References: #1688

  • [orm]

    query.get() теперь возвращает None, если запрашивается идентификатор, который присутствует в карте идентификации с классом, отличным от запрашиваемого, т.е. при использовании полиморфной загрузки.

    References: #1727

  • [orm]

    Существенное исправление в query.join(), когда предложение «on» является атрибутом конструкции aliased(), но уже есть существующее соединение, выполненное к совместимой цели, запрос корректно присоединяется к правой конструкции aliased(), а не приклеивается к правой стороне существующего соединения.

    References: #1706

  • [orm]

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

    References: #1362

  • [orm]

    Теперь sqlalchemy.orm.exc.DetachedInstanceError используется, когда загрузка или обновление атрибутов не удается из-за того, что объект отсоединен от какой-либо сессии. UnboundExecutionError характерен для движков, привязанных к сессиям и операторам.

  • [orm]

    Запрос, вызванный в контексте выражения, во всех случаях будет отображать недвусмысленные метки. Обратите внимание, что это не относится к существующим аксессорам/методам .statement и .subquery(), которые по-прежнему используют настройку .with_labels(), имеющую значение по умолчанию False.

  • [orm]

    Query.union() сохраняет недвусмысленные метки внутри возвращаемого оператора, что позволяет избежать различных ошибок SQL-композиции, которые могут возникнуть из-за конфликтов имен столбцов.

    References: #1676

  • [orm]

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

  • [orm]

    Некоторая внутренняя оптимизация загрузки объектов дает небольшое ускорение для больших результатов, по оценкам около 10-15%. Проведена серьезная чистка внутренней части «состояния» с уменьшением сложности, уменьшением количества членов данных, вызовов методов, создания пустых словарей.

  • [orm]

    Уточнение документации для query.delete()

    References: #1689

  • [orm]

    Исправлена ошибка каскадирования в функции many-to-one relation() при установке атрибута в None, появившаяся в r6711 (каскадирование удаленных элементов в сессию при выполнении функции add()).

  • [orm]

    Вызов query.order_by() или query.distinct() перед вызовом query.select_from(), query.with_polymorphic() или query.from_statement() теперь вызывает исключение, вместо того чтобы молча отбрасывать эти критерии.

    References: #1736

  • [orm]

    query.scalar() теперь вызывает исключение, если возвращается более одной строки. Все остальное поведение остается прежним.

    References: #1735

  • [orm]

    Исправлена ошибка, из-за которой логика «переключения строк», т.е. INSERT и DELETE, замененные UPDATE, при использовании version_id_col не работала.

    References: #1692

examples

  • [examples]

    Немного изменили пример кэша beaker, добавив отдельную опцию RelationCache для кэширования lazyload. Этот объект выполняет поиск среди любого количества потенциальных атрибутов более эффективно, группируя их в общую структуру. И FromCache, и RelationCache по отдельности проще.

sql

  • [sql]

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

    References: #1714

  • [sql]

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

  • [sql]

    SchemaType и подклассы Boolean, Enum теперь сериализуемы, включая их ddl-слушатель и другие вызываемые события.

    References: #1694, #1698

  • [sql]

    Некоторые платформы теперь интерпретируют некоторые литеральные значения как несвязывающие параметры, которые дословно отображаются в операторе SQL. Это сделано для поддержки строгих правил SQL-92, которые соблюдаются некоторыми платформами, включая MS-SQL и Sybase. В этой модели связывающие параметры не допускаются в предложении columns оператора SELECT, равно как и некоторые двусмысленные выражения типа «?=?». При включении этого режима компилятор базы будет отображать связки как встроенные литералы, но только для строк и числовых значений. Другие типы, такие как даты, вызовут ошибку, если только подкласс диалекта не определит для них функцию рендеринга литералов. Параметр bind должен уже иметь встроенное литеральное значение, иначе будет выдана ошибка (т.е. не будет работать прямой bindparam(„x“)). Диалекты также могут расширять области, в которых привязки не принимаются, например, в списках аргументов функций (которые не работают на MS-SQL, когда используется привязка к родному SQL).

  • [sql]

    Добавлен параметр «unicode_errors» к функциям String, Unicode и др. Ведет себя как аргумент ключевого слова „errors“ для функций string.decode() стандартной библиотеки. Этот флаг требует, чтобы параметр convert_unicode был установлен в значение «force» - в противном случае SQLAlchemy не гарантированно справится с задачей преобразования юникода. Заметим, что этот флаг значительно увеличивает производительность операций выборки строк для бэкендов, которые уже возвращают объекты в юникоде (что делает большинство DBAPI). Этот флаг следует использовать только в крайнем случае для чтения строк из колонок с измененными или поврежденными кодировками, что применимо только к базам данных, которые изначально принимают неверные кодировки (т.е. MySQL. не PG, Sqlite и т.д.).

  • [sql]

    Добавлена поддержка оператора отрицания в математике, -x.

  • [sql]

    Подклассы FunctionElement теперь исполняются напрямую, как и любая конструкция func.foo(), с автоматическим применением SELECT при передаче в execute().

  • [sql]

    Аргументы «type» и «bind» ключевого слова конструкции func.foo() теперь локальны для конструкций «func.» и не являются частью базового класса FunctionElement, что позволяет обрабатывать «type» в пользовательском конструкторе или переменной уровня класса.

  • [sql]

    В ResultProxy восстановлен метод keys().

  • [sql]

    Система тип/выражение теперь выполняет более полную работу по определению возвращаемого типа из выражения, а также по адаптации оператора Python в оператор SQL, основываясь на полном левом/правом/операторе данного выражения. В частности, система дата/время/интервал, созданная для PostgreSQL EXTRACT in, теперь обобщена на систему типов. Прежнее поведение, когда выражение «столбец + литерал» заставляло тип «литерала» совпадать с типом «столбца», теперь обычно не встречается - тип «литерала» сначала выводится из Python-типа литерала, предполагая стандартные собственные Python-типы + типы даты, а затем возвращается к типу известного типа на другой стороне выражения. Если «обратный» тип совместим (например, CHAR из String), то со стороны литерала будет использоваться именно он. Типы TypeDecorator переопределяют это по умолчанию для безусловного принуждения «буквальной» стороны, что может быть изменено реализацией метода coerce_compared_value(). Также входит в состав.

    References: #1647, #1683

  • [sql]

    Сделали sqlalchemy.sql.expressions.Executable частью публичного API, используемого для любой конструкции выражения, которая может быть отправлена в execute(). FunctionElement теперь наследует Executable, чтобы получить execution_options(), которые также распространяются на select(), генерируемый в execute(). Executable, в свою очередь, является подклассом _Generative, который помечает любой ClauseElement, поддерживающий декоратор @_generative - в какой-то момент они также могут стать «публичными» в интересах расширения компилятора.

  • [sql]

    Изменение решения для - заданное конечным пользователем имя параметра привязки, которое напрямую конфликтует с привязкой с именем столбца, сгенерированной непосредственно из предложения SET или VALUES в обновлении/вставке, приводит к ошибке компиляции. Это уменьшает количество вызовов и устраняет некоторые случаи, когда нежелательные конфликты имен все же могут возникнуть.

    References: #1579

  • [sql]

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

    References: #1705

  • [sql]

    Аргумент «scale» типа Numeric() учитывается при преобразовании возвращаемого значения с плавающей точкой в строку на пути к Decimal - это позволяет точно работать с SQLite, MySQL.

    References: #1717

  • [sql]

    метод copy() в Column теперь копирует неинициализированные события «on table attach». Помогает новая декларативная возможность «mixin».

mysql

  • [mysql]

    Исправлена ошибка отражения, из-за которой при наличии COLLATE не отражались флаг nullable и значения по умолчанию сервера.

    References: #1655

  • [mysql]

    Исправлено отражение «булевых» столбцов TINYINT(1), определенных с целочисленными флагами типа UNSIGNED.

  • [mysql]

    Дополнительные исправления для диалекта mysql-connector.

    References: #1668

  • [mysql]

    Составная PK-таблица на InnoDB, в которой столбец «autoincrement» не является первым, будет выдавать явную фразу «KEY» в CREATE TABLE, что позволит избежать ошибок.

    References: #1496

  • [mysql]

    Добавлена поддержка отражения/создания таблицы для широкого спектра ключевых слов MySQL.

    References: #1634

  • [mysql]

    Исправлена ошибка импорта, которая могла возникать при отражении таблиц на хосте Windows

    References: #1580

sqlite

  • [sqlite]

    В функцию create_engine() добавлен флаг «native_datetime=True». Это приведет к тому, что типы DATE и TIMESTAMP будут пропускать всю обработку параметров привязки и строк результатов, в предположении, что в соединении включен параметр PARSE_DECLTYPES. Обратите внимание, что это не совсем совместимо с «func.current_date()», который будет возвращаться в виде строки.

    References: #1685

mssql

  • [mssql]

    Восстановлена поддержка диалекта pymssql.

  • [mssql]

    Различные исправления, связанные с неявным возвратом, отражением и т.д. - диалекты MS-SQL еще не полностью завершены в 0.6 (но уже близки к этому)

  • [mssql]

    Добавлена базовая поддержка mxODBC.

    References: #1710

  • [mssql]

    Удалена опция text_as_varchar.

oracle

  • [oracle]

    Для параметров «out» требуется тип, поддерживаемый cx_oracle. Если тип cx_oracle не найден, то будет выдана ошибка.

  • [oracle]

    Oracle „DATE“ теперь не выполняет никакой обработки результатов, поскольку тип DATE в Oracle хранит полные объекты дата+время, что вы и получите. Обратите внимание, что общий тип types.Date по-прежнему будет вызывать value.date() для входящих значений, однако. При отражении таблицы отражаемый тип будет „DATE“.

  • [oracle]

    Добавлена предварительная поддержка режима WITH_UNICODE для Oracle. По крайней мере, это устанавливает начальную поддержку cx_Oracle в Python 3. При использовании режима WITH_UNICODE в Python 2.xx выдается большое и страшное предупреждение с просьбой серьезно задуматься об использовании этого сложного режима работы.

    References: #1670

  • [oracle]

    Метод except_() теперь отображается как MINUS на Oracle, что более или менее эквивалентно на этой платформе.

    References: #1712

  • [oracle]

    Добавлена поддержка рендеринга и отражения TIMESTAMP WITH TIME ZONE, т.е. TIMESTAMP(timezone=True).

    References: #651

  • [oracle]

    Тип Oracle INTERVAL теперь может быть отражен.

misc

  • [py3k]

    Улучшена настройка установки/тестирования на Python 3, теперь Distribute работает на Py3k. В комплект поставки включен файл distribute_setup.py. Инструкции по установке/тестированию на Python 3 см. в README.py3k.

  • [engines]

    Добавлено дополнительное расширение на языке Си для ускорения работы sql-слоя за счет реализации RowProxy и наиболее распространенных процессоров результатов. Фактическое ускорение будет сильно зависеть от вашего DBAPI и набора типов данных, используемых в таблицах, и может варьироваться от 30% до более чем 200%. Кроме того, он обеспечивает скромное (~15-20%) косвенное повышение скорости работы ORM для больших запросов. Обратите внимание, что по умолчанию он не собран/установлен. Инструкции по установке см. в README.

  • [engines]

    последовательность выполнения извлекает всю информацию о количестве рядов/последнем вставленном идентификаторе из курсора до вызова commit() на DBAPI-соединении в сценарии «autocommit». Это помогает mxodbc в работе с rowcount и, вероятно, является хорошей идеей в целом.

  • [engines]

    Немного расширили логирование, чтобы функция isEnabledFor() вызывалась чаще, чтобы изменения уровня лога для движка/пула отражались при следующем подключении. Это добавляет небольшое количество накладных расходов на вызов метода. Оно незначительно и значительно облегчит жизнь в тех случаях, когда логирование настраивается после вызова create_engine().

    References: #1719

  • [engines]

    Флаг assert_unicode является устаревшим. SQLAlchemy будет выдавать предупреждение во всех случаях, когда его просят закодировать неюникодную строку Python, а также когда типу Unicode или UnicodeType явно передается байт-строка. Тип String ничего не даст для DBAPI, которые уже принимают объекты Python в юникоде.

  • [engines]

    Параметры привязки передаются не в виде списка, а в виде кортежа. Некоторые драйверы бэкендов не принимают параметры привязки в виде списка.

  • [engines]

    Движок threadlocal не корректно закрывал соединение при close() - исправлено.

  • [engines]

    Объект транзакции не откатывается и не фиксируется, если он не «активен», что позволяет более точно вложить begin/rollback/commit.

  • [engines]

    Объекты юникода в Python в качестве биндов приводят к типу Unicode, а не string, что позволяет устранить определенный класс ошибок юникода в драйверах, не поддерживающих бинды юникода.

  • [engines]

    Добавлен аргумент «logging_name» в конструктор create_engine(), Pool(), а также аргумент «pool_logging_name» в create_engine(), который фильтрует вплоть до имени Pool. Выдает заданное строковое имя в поле «name» сообщений логирования вместо стандартной строки шестнадцатеричного идентификатора.

    References: #1555

  • [engines]

    Метод visit_pool() из Dialect удален и заменен на on_connect(). Этот метод возвращает вызываемую переменную, которая получает необработанное соединение DBAPI после каждого созданного соединения. Если не None, то вызываемый элемент собирается в слушатель пула first_connect/connect по стратегии соединения. Обеспечивает более простой интерфейс для диалектов.

  • [engines]

    StaticPool теперь инициализируется, утилизируется и пересоздается без открытия нового соединения - соединение открывается только при первом запросе. dispose() теперь работает и для AssertionPool.

    References: #1728

  • [metadata] [ticket: 1673]

    Добавлена возможность удаления информации о схеме при использовании «tometadata» путем передачи в качестве аргумента «schema=None». Если schema не указана, то схема таблицы сохраняется.

  • [declarative]

    DeclarativeMeta в качестве источника информации о классе использует исключительно cls.__dict__ (а не dict_), а _as_declarative в качестве источника информации о классе использует исключительно переданный ему dict_ (который при использовании DeclarativeMeta является cls.__dict__). Теоретически это должно облегчить пользовательским метаклассам модификацию состояния, передаваемого в _as_declarative.

  • [declarative]

    declarative теперь принимает классы mixin напрямую, как средство обеспечения общих функциональных и колоночных элементов для всех подклассов, а также как средство распространения фиксированного набора __table_args__ или __mapper_args__ в подклассы. Для пользовательских комбинаций __table_args__/__mapper_args__ от унаследованного миксина к локальному теперь можно использовать дескрипторы. Новые подробности приведены в документации по Declarative. Спасибо Крису Витерсу за то, что он терпел мои пререкания по этому поводу.

    References: #1707

  • [declarative]

    Диктант __mapper_args__ копируется при распространении в подкласс и берется прямо из класса __dict__, чтобы избежать распространения от родителя. Наследование маппера уже распространяет то, что нужно, от родительского маппера.

    References: #1393

  • [declarative]

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

    References: #1732

  • [sybase]

    Реализован предварительный рабочий диалект для Sybase, с подреализацией для Python-Sybase, а также Pyodbc. Реализована работа с созданием/удалением таблиц и базовая функциональность обхода. Пока не включает отражение или всестороннюю поддержку юникода/специальных выражений/и т.д.

  • [documentation]

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

    References: #1700

0.6beta1

Released: Wed Feb 03 2010

orm

  • [orm]

    Изменения в query.update() и query.delete():
    • Опция „expire“ в query.update() была переименована в „fetch“, что соответствует опции query.delete(). Опция „expire“ является устаревшей и выдает предупреждение.

    • Для стратегий синхронизации query.update() и query.delete() по умолчанию установлено значение „evaluate“.

    • стратегия „synchronize“ для update() и delete() приводит к ошибке. Неявного возврата на «fetch» не существует. Неудачная оценка основана на структуре критериев, поэтому успех/неудача детерминированы структурой кода.

  • [orm]

    Усовершенствования отношений «многие-к-одному»:
    • Отношения «многие-к-одному» теперь вызывают ленивую загрузку в меньшем количестве случаев, в том числе в большинстве случаев не будут получать «старое» значение при замене его новым.

    • отношение «многие-к-одному» к подклассу объединенной таблицы теперь использует get() для простой загрузки (известное как условие «use_get»), т.е. Related->Sub(Base), без необходимости переопределять условие primaryjoin в терминах базовой таблицы.

    • Указание внешнего ключа в декларативном столбце, т.е. ForeignKey(MyRelatedClass.id), не нарушает условия «use_get»

    • В relation(), eagerload() и eagerload_all() появилась опция «innerjoin». Укажите True или False, чтобы определить, будет ли соединение eager join построено как INNER или OUTER join. По умолчанию, как всегда, используется False. Опции отображателя будут переопределять ту настройку, которая задана в relation(). Обычно это значение следует устанавливать для отношений типа «многие к одному», а не для отношений с нулевым внешним ключом, чтобы повысить производительность соединения.

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

    References: #1186, #1492, #1544

  • [orm]

    Улучшения / Изменения в работе функции Session.merge():

  • [orm]

    Флаг «dont_load=True» в функции Session.merge() устарел и теперь имеет значение «load=False».

  • [orm]

    Session.merge() оптимизирована по производительности, используя вдвое меньше вызовов для режима «load=False» по сравнению с 0,5 и значительно меньше SQL-запросов в случае коллекций для режима «load=True».

  • [orm]

    merge() не будет выдавать ненужное объединение атрибутов, если заданный экземпляр является тем же самым экземпляром, который уже присутствует.

  • [orm]

    merge() теперь объединяет и «опции», связанные с данным состоянием, т.е. те, которые передаются через query.options() и следуют вместе с экземпляром, например, опции нетерпеливой или ленивой загрузки различных атрибутов. Это необходимо для построения высокоинтегрированных схем кэширования. Это незначительное изменение поведения по сравнению с 0.5.

  • [orm]

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

  • [orm]

    Новая функция merge() демонстрируется в новом комплексном примере интеграции Beaker с SQLAlchemy. См. примечания в разделе «Примеры» ниже.

  • [orm]

    Значения первичных ключей теперь можно изменять в объекте наследования объединенных таблиц, при этом ON UPDATE CASCADE будет учитываться при промывке. Установите новый флаг «passive_updates» в значение False в mapper() при использовании SQLite или MySQL/MyISAM.

    References: #1362

  • [orm]

    Функция flush() теперь определяет, когда столбец первичного ключа был обновлен операцией ON UPDATE CASCADE из другого первичного ключа, и может определить местоположение строки для последующего UPDATE по новому значению PK. Это происходит при наличии связи relation() для установления связи, а также при passive_updates=True.

    References: #1671

  • [orm]

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

  • [orm]

    При использовании «динамического» загрузчика с «вторичной» таблицей теперь формируется запрос, в котором «вторичная» таблица не является алиасной. Это позволяет использовать объект вторичной таблицы в атрибуте «order_by» отношения relation(), а также использовать его в критерии фильтрации по динамическому отношению.

    References: #1531

  • [orm]

    relation() с uselist=False будет выдавать предупреждение, если при ускоренной или ленивой загрузке будет найдено более одного допустимого значения для строки. Это может быть связано с условиями primaryjoin/secondaryjoin, которые не подходят для eager LEFT OUTER JOIN, или с другими условиями.

    References: #1643

  • [orm]

    при использовании синонима() с map_column=True происходит явная проверка, что в словаре свойств, переданном в mapper, существует отдельно свойство ColumnProperty (отложенное или иное) с тем же ключевым именем. Вместо того чтобы молча заменить существующее свойство (и возможные варианты этого свойства), выдается ошибка.

    References: #1633

  • [orm]

    »Динамический» загрузчик устанавливает критерий запроса во время конструирования таким образом, что реальный запрос возвращается из неклонируемых аксессоров типа «statement».

  • [orm]

    объекты «именованный кортеж», возвращаемые при итерации Query(), теперь являются pickleable.

  • [orm]

    При сопоставлении с конструкцией select() теперь требуется сделать из нее отдельный alias(). Это сделано для устранения путаницы в таких вопросах, как

    References: #1542

  • [orm]

    query.join() был переработан для обеспечения более последовательного поведения и большей гибкости (включает)

    References: #1537

  • [orm]

    query.select_from() принимает несколько предложений, чтобы получить несколько записей, разделенных запятыми, в предложении FROM. Применяется при выборе из многоместных предложений join().

  • [orm]

    query.select_from() также принимает в качестве аргументов сопоставленные классы, конструкции aliased() и mappers. В частности, это помогает при запросе из нескольких классов объединенных таблиц, чтобы обеспечить отображение полного объединения.

  • [orm]

    query.get() можно использовать с отображением для внешнего соединения, в котором одно или несколько значений первичного ключа являются None.

    References: #1135

  • [orm]

    query.from_self(), query.union() и другие вложенные запросы типа «SELECT * from (SELECT…)» лучше справляются с трансляцией выражений столбцов в подзапросе в пункт columns внешнего запроса. Это потенциально несовместимо с 0.5, так как может привести к поломке запросов с литеральными выражениями, к которым не применяются метки (например, literal(„foo“) и т.д.).

    References: #1568

  • [orm]

    Отношения primaryjoin и secondaryjoin теперь проверяют, что они являются выражениями столбцов, а не просто элементами клаузы. Это запрещает помещать туда напрямую такие вещи, как выражения FROM.

    References: #1622

  • [orm]

    expression.null() полностью понимается так же, как и None при сравнении атрибута, ссылающегося на объект/коллекцию, в query.filter(), filter_by() и т.д.

    References: #1415

  • [orm]

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

    References: #1052

  • [orm]

    флаг allow_null_pks в функции mapper() устарел, и по умолчанию эта функция включена. Это означает, что строка, имеющая ненулевое значение для любого из столбцов первичного ключа, будет считаться идентичностью. Необходимость в этом сценарии обычно возникает только при сопоставлении с внешним объединением.

    References: #1339

  • [orm]

    механика «обратной ссылки» была полностью объединена с более тонкой системой «back_populates» и происходит полностью внутри метода _generate_backref() RelationProperty. Это упрощает процедуру инициализации RelationProperty и позволяет легче распространять настройки (например, из подклассов RelationProperty) в обратную ссылку. Внутренняя функция BackRef() исчезла, а функция backref() возвращает обычный кортеж, понятный RelationProperty.

  • [orm]

    Функция version_id_col в mapper() будет выдавать предупреждение при использовании диалектов, не поддерживающих адекватно «rowcount».

    References: #1569

  • [orm]

    добавлена опция «execution_options()» в Query, чтобы можно было передавать опции результирующему оператору. В настоящее время такие опции есть только в операторах Select, и единственная используемая опция - «stream_results», а единственный диалект, который знает «stream_results», - это psycopg2.

  • [orm]

    Query.yield_per() автоматически установит опцию оператора «stream_results».

  • [orm]

    Утратил актуальность или удален:
    • Флаг „allow_null_pks“ на mapper() устарел. Теперь он ничего не делает, а его установка во всех случаях означает «on».

    • Флаг „transactional“ в функции sessionmaker() и других удален. Используйте „autocommit=True“ для указания „transactional=False“.

    • Убран аргумент „polymorphic_fetch“ в функции mapper(). Загрузка может контролироваться с помощью опции „with_polymorphic“.

    • Аргумент „select_table“ в функции mapper() удален. Для этой функциональности используйте „with_polymorphic=(«*», <some selectable>)“.

    • Убран аргумент „proxy“ в функции synonym(). В версии 0.5 этот флаг ничего не делал, так как теперь «генерация прокси» происходит автоматически.

    • Передача одного списка элементов в функции eagerload(), eagerload_all(), contains_eager(), lazyload(), defer() и undefer() вместо нескольких позиционных *args является устаревшей.

    • Передача одного списка элементов в query.order_by(), query.group_by(), query.join() или query.outerjoin() вместо нескольких позиционных *args является устаревшей.

    • query.iterate_instances() удалена. Используйте query.instances().

    • Функция Query.query_from_parent() удалена. Для создания «родительского» предложения используйте функцию sqlalchemy.orm.with_parent() или альтернативный вариант query.with_parent().

    • query._from_self() удалена, вместо нее используйте query.from_self().

    • аргумент «comparator» в composite() удален. Используйте «comparator_factory».

    • RelationProperty._get_join() удалена.

    • флаг „echo_uow“ на Session снят. Используйте протоколирование по имени «sqlalchemy.orm.unitofwork».

    • session.clear() удалена. используйте session.expunge_all().

    • Убраны session.save(), session.update(), session.save_or_update(). Используйте session.add() и session.add_all().

    • флаг «objects» в session.flush() остается устаревшим.

    • флаг «dont_load=True» в session.merge() устарел в пользу «load=False».

    • ScopedSession.mapper остается устаревшим. См. рецепт использования на https://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper.

    • Передача InstanceState (внутреннего объекта состояния SQLAlchemy) в функции attributes.init_collection() или attributes.get_history() является устаревшей. Эти функции являются публичными API и обычно ожидают обычный экземпляр сопоставленного объекта.

    • удален параметр „engine“ в declarative_base(). Используйте аргумент с ключевым словом „bind“.

sql

  • [sql]

    Флаг «autocommit» для select() и text(), а также select().autocommit() устарели - теперь для любой из этих конструкций вызывается .execution_options(autocommit=True), также доступный непосредственно для Connection и orm.Query.

  • [sql]

    флаг autoincrement в column теперь указывает на столбец, который должен быть связан с cursor.lastrowid, если используется этот метод. Подробности см. в документации по API.

  • [sql]

    executemany() теперь требует, чтобы во всех связанных наборах параметров присутствовали все ключи, которые присутствуют в первом связанном наборе параметров. Структура и поведение оператора вставки/обновления в значительной степени определяются первым набором параметров, в том числе и тем, какие значения по умолчанию будут срабатывать, а в отношении остальных параметров делается минимум предположений, чтобы не снижать производительность. По этой причине в противном случае умолчания могли бы «провалиться» при отсутствии параметров, поэтому теперь это исключено.

    References: #1566

  • [sql]

    Поддержка returning() присуща insert(), update(), delete(). Реализации с разным уровнем функциональности существуют для PostgreSQL, Firebird, MSSQL и Oracle. returning() может быть вызван явно с выражениями столбцов, которые затем возвращаются в наборе результатов, обычно через fetchone() или first().

    Конструкции insert() также будут неявно использовать RETURNING для получения новых значений первичного ключа, если это поддерживает используемая версия базы данных (выполняется проверка номера версии). Это происходит, если не был указан конечный пользователь return().

  • [sql]

    Операции union(), intersect(), except() и другие «составные» типы операторов имеют более последовательное поведение в отношении раскрытия круглых скобок. Теперь каждый составной элемент, вложенный в другой, будет группироваться с помощью круглых скобок - ранее первый составной элемент в списке не группировался, поскольку SQLite не любит, когда оператор начинается с круглых скобок. Однако, в частности, в PostgreSQL существуют правила старшинства в отношении INTERSECT, и более последовательным является применение скобок одинаково ко всем вложенным элементам. Таким образом, сейчас для SQLite существует такое же решение, как и для PG - при вложении составных элементов в первый из них обычно нужно вызвать «.alias().select()», чтобы обернуть его внутри подзапроса.

    References: #1665

  • [sql]

    В конструкциях insert() и update() теперь можно встраивать объекты bindparam() с именами, совпадающими с ключами столбцов. Такие параметры привязки позволяют обойти обычный путь, по которому эти ключи отображаются в предложениях VALUES или SET генерируемого SQL.

    References: #1579

  • [sql]

    Тип Binary теперь возвращает данные в виде строки Python (или типа «bytes» в Python 3), а не встроенного типа «buffer». Это позволяет симметрично обходить двоичные данные.

    References: #1524

  • [sql]

    Добавлена конструкция tuple_(), позволяющая сравнивать набор выражений с другим набором, обычно с IN против составных первичных ключей или аналогичных. Также допускается IN с несколькими столбцами. Сообщение об ошибке «scalar select может иметь только один столбец» удалено - теперь о проблемах с несовпадением столбцов будет сообщать база данных.

  • [sql]

    Определенные пользователем вызываемые модули «default» и «onupdate», принимающие контекст, теперь должны обращаться к «context.current_parameters» для получения словаря параметров связывания, которые обрабатываются в данный момент. Этот словарь доступен одинаково, независимо от того, выполняется оператор в однократном или многократном режиме.

  • [sql]

    многокомпонентные имена схем, т.е. с точками, например, «dbo.master», теперь отображаются в метках select() с подчеркиванием точек, например, «dbo_master_table_column». Это «дружественная» метка, которая лучше ведет себя в наборах результатов.

    References: #1428

  • [sql]

    Устранено ненужное «встречное» поведение с именами меток select(), совпадающими с именем столбца в таблице, т.е. генерируется «tablename_id» для «id», а не «tablename_id_1» в попытке избежать конфликта имен, когда в таблице есть столбец с именем «tablename_id» - это сделано потому, что логика маркировки всегда применяется ко всем столбцам, поэтому конфликт имен никогда не возникнет.

  • [sql]

    Вызов expr.in_([]), т.е. с пустым списком, выдает предупреждение перед тем, как выдать обычную оговорку «expr != expr». Предложение «expr != expr» может быть очень дорогим, поэтому предпочтительнее, чтобы пользователь не вызывал in_(), если список пуст, а просто не запрашивал или модифицировал критерий в зависимости от более сложных ситуаций.

    References: #1628

  • [sql]

    В select()/text() добавлен параметр «execution_options()», который устанавливает опции по умолчанию для Connection. См. примечание в разделе «Двигатели».

  • [sql]

    Утратил актуальность или удален:
    • Флаг «scalar» в select() снят, используйте select.as_scalar().

    • Убран атрибут «shortname» у функции bindparam().

    • Флаги postgres_returning, firebird_returning при insert(), update(), delete() устарели, используйте новый метод returning().

    • Флаг fold_equivalents на join устарел (останется до тех пор, пока не будет реализован)

    References: #1131

schema

  • [schema]

    метод __contains__() метода MetaData теперь принимает в качестве аргументов строки или объекты Table. Если в качестве аргумента передается Table, то сначала аргумент преобразуется в table.key, т.е. «[schemaname.]<tablename>».

    References: #1541

  • [schema]

    Устаревшие MetaData.connect() и ThreadLocalMetaData.connect() были удалены - для связывания метаданных передавайте атрибут «bind».

  • [schema]

    Устранен устаревший метод metadata.table_iterator() (используйте sorted_tables)

  • [schema]

    deprecated PassiveDefault - используйте DefaultClause.

  • [schema]

    аргумент «metadata» удаляется из DefaultGenerator и подклассов, но остается локально присутствующим в Sequence, которая является самостоятельной конструкцией в DDL.

  • [schema]

    Убрана публичная мутабельность из объектов Index и Constraint:

    • ForeignKeyConstraint.append_element()

    • Index.append_column()

    • UniqueConstraint.append_column()

    • PrimaryKeyConstraint.add()

    • PrimaryKeyConstraint.remove()

    Они должны быть построены декларативно (т.е. в одной конструкции).

  • [schema]

    Атрибуты «start» и «increment» в Sequence теперь генерируют «START WITH» и «INCREMENT BY» по умолчанию для Oracle и PostgreSQL. Firebird в настоящее время не поддерживает эти ключевые слова.

    References: #1545

  • [schema]

    UniqueConstraint, Index, PrimaryKeyConstraint принимают в качестве аргументов списки имен столбцов или объектов столбцов.

  • [schema]

    Другие удаленные вещи:
    • Table.key (не знаю, для чего это нужно)

    • Table.primary_key не является назначаемым - используйте table.append_constraint(PrimaryKeyConstraint(…))

    • Column.bind (получить через column.table.bind)

    • Column.metadata (получение через column.table.metadata)

    • Column.sequence (используется column.default)

    • ForeignKey(constraint=some_parent) (теперь это частный _constraint)

  • [schema]

    Флаг use_alter для ForeignKey теперь является опцией быстрого доступа к операциям, которые могут быть выполнены вручную с помощью системы событий DDL(). Побочным эффектом этого рефактора является то, что объекты ForeignKeyConstraint с use_alter=True не будут выдаваться на SQLite, который не поддерживает ALTER для внешних ключей.

  • [schema]

    Объекты ForeignKey и ForeignKeyConstraint теперь корректно копируют() все свои аргументы с открытым ключевым словом.

    References: #1605

postgresql

  • [postgresql]

    Новые диалекты: pg8000, zxjdbc и pypostgresql на py3k.

  • [postgresql]

    Диалект «postgres» теперь называется «postgresql»! Строки подключения имеют вид:

    postgresql://scott:tiger@localhost/test postgresql+pg8000://scott:tiger@localhost/test

    Имя «postgres» сохраняется для обратной совместимости следующим образом:

    • Существует фиктивный диалект «postgres.py», который позволяет работать старым URL, т.е. postgres://scott:tiger@localhost/test

    • Имя «postgres» можно импортировать из старого модуля «databases», т.е. «from sqlalchemy.databases import postgres», так же как и «dialects», «from sqlalchemy.dialects.postgres import base as pg», выдаст предупреждение об устаревании.

    • Специальные аргументы выражений теперь называются «postgresql_returning» и «postgresql_where», но старые имена «postgres_returning» и «postgres_where» по-прежнему работают с предупреждением об устаревании.

  • [postgresql]

    Теперь «postgresql_where» принимает SQL-выражения, которые также могут включать литералы, которые при необходимости будут заключены в кавычки.

  • [postgresql]

    Диалект psycopg2 теперь использует «расширение unicode» psycopg2 при всех новых соединениях, что позволяет всем типам String/Text/etc. отказаться от постобработки байтстрингов в unicode (дорогостоящий этап из-за их объема). Другие диалекты, возвращающие юникод нативно (pg8000, zxjdbc), также пропускают постобработку юникода.

  • [postgresql]

    Добавлен новый тип ENUM, который существует как конструкция на уровне схемы и расширяет общий тип Enum. Автоматически связывается с таблицами и их родительскими метаданными для выдачи соответствующих команд CREATE TYPE/DROP TYPE при необходимости, поддерживает юникодные метки, поддерживает отражение.

    References: #1511

  • [postgresql]

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

  • [postgresql]

    использование новой функции dialect.initialize() для настройки поведения, зависящего от версии.

  • [postgresql]

    Несколько улучшена поддержка знаков % в именах таблиц/столбцов; однако psycopg2 не может обрабатывать имена параметров связывания, состоящие из %(foobar)s, и SQLA не хочет увеличивать накладные расходы только для обработки этого единственного несуществующего случая использования.

    References: #1279

  • [postgresql]

    Вставка NULL в столбец с первичным ключом + внешним ключом приведет к ошибке «not null constraint», а не к попытке выполнить несуществующую последовательность «col_id_seq».

    References: #1516

  • [postgresql]

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

  • [postgresql]

    Диалект postgresql может правильно определять строки версий pg «devel», т.е. «8.5devel».

    References: #1636

  • [postgresql]

    В psycopg2 теперь учитывается опция statement «stream_results». Эта опция переопределяет настройку соединения «server_side_cursors». Если параметр равен true, то курсоры на стороне сервера будут использоваться при выполнении утверждения. Если false, то они не будут использоваться, даже если параметр «server_side_cursors» равен true на соединении.

    References: #1619

mysql

  • [mysql]

    Новые диалекты: oursql, новый собственный диалект, MySQL Connector/Python, собственный порт MySQLdb на Python, и, конечно, zxjdbc на Jython.

  • [mysql]

    VARCHAR/NVARCHAR не будут отображаться без длины, выдавая ошибку перед передачей в MySQL. На CAST это не влияет, так как VARCHAR в любом случае не допускается в MySQL CAST, диалект в этих случаях выводит CHAR/NCHAR.

  • [mysql]

    все функции _detect_XXX() теперь запускаются один раз под dialect.initialize()

  • [mysql]

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

    References: #1279

  • [mysql]

    типы BINARY и MSBinary теперь генерируют «BINARY» во всех случаях. Если опустить параметр «length», то будет сгенерирован «BINARY» без длины. Для генерации двоичного столбца без длины используйте BLOB.

  • [mysql]

    аргумент «quoting=“quoted“» в MSEnum/ENUM является устаревшим. Лучше полагаться на автоматическое цитирование.

  • [mysql]

    ENUM теперь является подклассом нового общего типа Enum, а также неявно обрабатывает значения unicode, если заданные имена меток являются объектами unicode.

  • [mysql]

    столбец типа TIMESTAMP теперь по умолчанию принимает значение NULL, если в Column() не передано значение «nullable=False» и нет значения по умолчанию. Теперь это соответствует всем остальным типам, а в случае TIMESTAMP явно выдает значение «NULL» из-за «переключения» MySQL на нулевую возможность по умолчанию для столбцов TIMESTAMP.

    References: #1539

sqlite

  • [sqlite]

    Типы DATE, TIME и DATETIME теперь могут принимать необязательные аргументы storage_format и regexp. storage_format может использоваться для хранения этих типов в пользовательском строковом формате. regexp позволяет использовать пользовательское регулярное выражение для сопоставления строковых значений из базы данных.

  • [sqlite]

    Типы Time и DateTime теперь по умолчанию используют более строгое регулярное выражение для соответствия строкам из базы данных. Используйте аргумент regexp, если вы используете данные, хранящиеся в устаревшем формате.

  • [sqlite]

    __legacy_microseconds__ в типах SQLite Time и DateTime больше не поддерживается. Вместо этого следует использовать аргумент storage_format.

  • [sqlite]

    Типы Date, Time и DateTime теперь более строги к тому, что они принимают в качестве параметров связывания: Тип Date принимает только объекты date (и datetime, поскольку они наследуются от date), Time - только объекты time, а DateTime - только объекты date и datetime.

  • [sqlite]

    Table() поддерживает аргумент ключевого слова «sqlite_autoincrement», который при генерации DDL применяет ключевое слово SQLite «AUTOINCREMENT» к единственному целочисленному столбцу первичного ключа. Это позволит избежать генерации отдельного ограничения PRIMARY KEY.

    References: #1016

mssql

  • [mssql]

    MSSQL + Pyodbc + FreeTDS теперь в основном работают, за исключением бинарных данных и юникодных идентификаторов схем.

  • [mssql]

    флаг «has_window_funcs» снимается. При использовании LIMIT/OFFSET, как и всегда, будет использоваться ROW NUMBER, и если вы используете более старую версию SQL Server, то операция завершится неудачей. Поведение точно такое же, только ошибка выдается SQL-сервером, а не диалектом, и для ее разрешения не требуется установка флага.

  • [mssql]

    снимается флаг «auto_identity_insert». Этот флаг всегда вступает в силу, когда оператор INSERT переопределяет столбец, для которого известна последовательность. Как и в случае с «has_window_funcs», если базовый драйвер не поддерживает эту функцию, то вы не сможете выполнить эту операцию в любом случае, поэтому нет смысла в наличии флага.

  • [mssql]

    использование новой функции dialect.initialize() для настройки поведения, зависящего от версии.

  • [mssql]

    удалены ссылки на последовательности, которые больше не используются. Неявные тождества в mssql работают так же, как и неявные последовательности в любых других диалектах. Явные последовательности включаются с помощью параметра «default=Sequence()». Дополнительную информацию см. в документации по диалекту MSSQL.

oracle

  • [oracle]

    Юнит-тесты проходят 100% с cx_oracle !

  • [oracle]

    поддержка режима «родного юникода» в cx_Oracle, не требующего установки NLS_LANG. Используйте последнюю версию 5.0.2 или более позднюю версию cx_oracle.

  • [oracle]

    к базовым типам добавляется тип NCLOB.

  • [oracle]

    use_ansi=False не просочится в предложение FROM/WHERE оператора, выбирающего из подзапроса, в котором также используется JOIN/OUTERJOIN.

  • [oracle]

    добавлен собственный тип INTERVAL в диалект. Пока он поддерживает только тип интервала DAY TO SECOND из-за отсутствия в cx_oracle поддержки YEAR TO MONTH.

    References: #1467

  • [oracle]

    Использование типа CHAR приводит к тому, что к операторам привязывается dbapi тип FIXED_CHAR компании cx_oracle.

  • [oracle]

    В диалекте Oracle появился тип NUMBER, который должен работать так же, как и тип NUMBER в Oracle. Он является основным числовым типом, возвращаемым при отражении таблицы, и пытается вернуть Decimal()/float/int в зависимости от параметров точности/масштаба.

    References: #885

  • [oracle]

    func.char_length - общая функция для LENGTH

  • [oracle]

    ForeignKey(), включающий onupdate=<value>, выдает предупреждение, а не ON UPDATE CASCADE, что не поддерживается oracle

  • [oracle]

    метод keys() функции RowProxy() теперь возвращает имена столбцов результата нормализованные для SQLAlchemy, нечувствительные к регистру. Это означает, что для нечувствительных к регистру имен они будут в нижнем регистре, в то время как DBAPI обычно возвращает их как имена UPPERCASE. Это позволяет совместить функцию row keys() с дальнейшими операциями SQLAlchemy.

  • [oracle]

    использование новой функции dialect.initialize() для настройки поведения, зависящего от версии.

  • [oracle]

    Использование types.BigInteger в Oracle приведет к появлению NUMBER(19)

    References: #1125

  • [oracle]

    Функция «чувствительность к регистру» обнаружит при отражении имя колонки, чувствительное к регистру всех строчных букв, и добавит в генерируемый Column значение «quote=True», чтобы сохранить правильное цитирование.

misc

  • [major] [release]

    Полный набор описаний функций приведен на сайте https://docs.sqlalchemy.org/en/latest/changelog/migration_06.html . Данный документ находится в стадии разработки.

  • [major] [release]

    Все исправления ошибок и улучшения функций из последней версии 0.5 и ниже также включены в 0.6.

  • [major] [release]

    Платформы, на которые ориентирован данный продукт, включают Python 2.4/2.5/2.6, Python 3.1, Jython2.5.

  • [engines]

    Уровень изоляции транзакций может быть задан с помощью create_engine(… isolation_level=»…»); доступно для postgresql и sqlite.

    References: #443

  • [engines]

    Connection имеет execution_options(), генеративный метод, который принимает ключевые слова, влияющие на способ выполнения оператора в DBAPI. В настоящее время поддерживает «stream_results», заставляющий psycopg2 использовать курсор на стороне сервера для данного оператора, а также «autocommit», который является новым местом для опции «autocommit» из select() и text(). select() и text() также имеют .execution_options(), как и ORM Query().

  • [engines]

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

    References: #1630

  • [engines]

    в ResultProxy добавлен метод first(), который возвращает первую строку и сразу закрывает набор результатов.

  • [engines]

    Объекты RowProxy стали pickleable, т.е. объект, возвращаемый result.fetchone(), result.fetchall() и т.д.

  • [engines]

    RowProxy больше не имеет метода close(), поскольку строка больше не сохраняет ссылку на родителя. Вместо этого вызывайте close() на родительском ResultProxy или используйте автозакрытие.

  • [engines]

    Внутренние компоненты ResultProxy были переработаны таким образом, чтобы значительно уменьшить количество вызовов методов при получении столбцов. Это позволяет значительно повысить скорость (более чем на 100%) при получении больших наборов результатов. Увеличение скорости достигается при получении столбцов, к которым не применяется обработка на уровне типов, а также при использовании результатов в виде кортежей (а не словарей). Большое спасибо Гаэтану де Ментену (Gaëtan de Menten) из Elixir за это значительное улучшение!

    References: #1586

  • [engines]

    Базы данных, которые полагаются на поствыборку «последнего вставленного идентификатора» для получения сгенерированного значения последовательности (т.е. MySQL, MS-SQL), теперь работают корректно при наличии составного первичного ключа, когда столбец «autoincrement» не является первым столбцом первичного ключа в таблице.

  • [engines]

    метод last_inserted_ids() переименован в дескриптор «inserted_primary_key».

  • [engines]

    установка echo=False в create_engine() теперь устанавливает уровень журнала WARN вместо NOTSET. Это позволяет отключить ведение журнала для конкретного движка, даже если в целом ведение журнала для «sqlalchemy.engine» включено. Обратите внимание, что по умолчанию значение параметра «echo» равно None.

    References: #1554

  • [engines]

    ConnectionProxy теперь имеет методы-обертки для всех событий жизненного цикла транзакций, включая begin(), rollback(), commit() begin_nested(), begin_prepared(), prepare(), release_savepoint() и т.д.

  • [engines]

    Журналирование пула подключений теперь использует уровни журнала INFO и DEBUG. INFO - для основных событий, таких как недействительные соединения, DEBUG - для всех операций получения/возврата. Значение echo_pool может быть False, None, True или «debug», аналогично тому, как работает echo.

  • [engines]

    Все pyodbc-диалекты теперь поддерживают дополнительные pyodbc-специфические kw-аргументы „ansi“, „unicode_results“, „autocommit“.

    References: #1621

  • [engines]

    переписан и упрощен механизм «threadlocal», который теперь поддерживает операции SAVEPOINT.

  • [engines]

    устаревшие или удаленные
    • result.last_inserted_ids() устарела. Используйте result.inserted_primary_key

    • dialect.get_default_schema_name(connection) теперь является публичным через dialect.default_schema_name.

    • аргумент «connection» из engine.transaction() и engine.run_callable() удален - теперь эти методы есть у самого Connection. Все четыре метода принимают *args и **kwargs, которые передаются в данный вызываемый модуль, а также рабочее соединение.

  • [reflection/inspection]

    Отражение таблиц было расширено и обобщено в новый API под названием «sqlalchemy.engine.reflection.Inspector». Объект Inspector предоставляет тонкую информацию о широком спектре информации схемы с возможностью расширения, включая имена таблиц, столбцов, определения представлений, последовательностей, индексов и т.д.

  • [reflection/inspection]

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

  • [reflection/inspection]

    Существующая система autoload=True теперь использует под собой Inspector, так что каждый диалект должен возвращать только «сырые» данные о таблицах и других объектах - Inspector является единственным местом, где информация компилируется в объекты Table, чтобы обеспечить максимальную согласованность.

  • [ddl]

    Значительно расширена система DDL. Класс DDL() теперь расширяет более общий DDLElement(), который является основой многих новых конструкций:

    • CreateTable()

    • DropTable()

    • AddConstraint()

    • DropConstraint()

    • CreateIndex()

    • DropIndex()

    • CreateSequence()

    • DropSequence()

    Они поддерживают функции «on» и «execute-at()», как и обычные DDL(). Определяемые пользователем подклассы DDLElement могут быть созданы и связаны с компилятором с помощью расширения sqlalchemy.ext.compiler.

  • [ddl]

    Сигнатура вызываемого элемента «on», передаваемого в DDL() и DDLElement(), изменена следующим образом:

    ddl

    сам объект DDLElement

    мероприятие

    строковое имя события.

    цель

    ранее «schema_item», объект таблицы или метаданных, вызвавший событие.

    подключение

    объект Connection, используемый для данной операции.

    **kw

    аргументы ключевых слов. В случае MetaData before/after create/drop в качестве kw-аргумента «tables» передается список объектов Table, для которых должен быть выпущен CREATE/DROP DDL. Это необходимо для выполнения DDL на уровне метаданных, зависящих от наличия конкретных таблиц.

    Атрибут «schema_item» в DDL был переименован в

    »target».

  • [dialect] [refactor]

    Модули диалектов теперь разбиты на диалекты баз данных и реализации DBAPI. URL-адреса подключения теперь предпочтительнее указывать с использованием dialect+driver://…, т.е. «mysql+mysqldb://scott:tiger@localhost/test». Примеры см. в документации к версии 0.6.

  • [dialect] [refactor]

    точка входа setuptools для внешних диалектов теперь называется «sqlalchemy.dialects».

  • [dialect] [refactor]

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

  • [dialect] [refactor]

    server_version_info становится статическим атрибутом.

  • [dialect] [refactor]

    Диалекты получают событие initialize() при первом подключении для определения свойств соединения.

  • [dialect] [refactor]

    диалекты, получившие событие visit_pool, имеют возможность установить слушателей пула.

  • [dialect] [refactor]

    кэшированные классы TypeEngine кэшируются для каждого класса диалекта, а не для каждого диалекта.

  • [dialect] [refactor]

    new UserDefinedType должен использоваться в качестве базового класса для новых типов, что сохраняет 0.5 поведение get_col_spec().

  • [dialect] [refactor]

    Метод result_processor() всех классов типов теперь принимает второй аргумент «coltype», который является аргументом типа DBAPI из cursor.description. Этот аргумент может помочь некоторым типам принять решение о наиболее эффективной обработке значений результатов.

  • [dialect] [refactor]

    Устранена устаревшая функция Dialect.get_params().

  • [dialect] [refactor]

    Dialect.get_rowcount() переименован в дескриптор «rowcount» и напрямую вызывает cursor.rowcount. Диалекты, которым необходимо жестко привязать счетчик строк к определенным вызовам, должны переопределить этот метод, чтобы обеспечить другое поведение.

  • [dialect] [refactor]

    DefaultRunner и подклассы были удалены. Работа этого объекта была упрощена и перенесена в ExecutionContext. Диалекты, поддерживающие последовательности, должны добавить метод fire_sequence() в свою реализацию контекста выполнения.

    References: #1566

  • [dialect] [refactor]

    Функции и операторы, генерируемые компилятором, теперь используют (почти) обычные функции диспетчеризации вида «visit_<opname>» и «visit_<funcname>_fn» для обеспечения пользовательской обработки. Это заменяет необходимость копирования словарей «функций» и «операторов» в подклассах компилятора прямыми методами visitor, а также позволяет подклассам компилятора полностью контролировать отрисовку, поскольку в них передается полный объект _Function или _BinaryExpression.

  • [firebird]

    метод keys() функции RowProxy() теперь возвращает имена столбцов результата нормализованные для SQLAlchemy, нечувствительные к регистру. Это означает, что для нечувствительных к регистру имен они будут в нижнем регистре, в то время как DBAPI обычно возвращает их как имена UPPERCASE. Это позволяет совместить функцию row keys() с дальнейшими операциями SQLAlchemy.

  • [firebird]

    использование новой функции dialect.initialize() для настройки поведения, зависящего от версии.

  • [firebird]

    Функция «чувствительность к регистру» обнаружит при отражении имя колонки, чувствительное к регистру всех строчных букв, и добавит в генерируемый Column значение «quote=True», чтобы сохранить правильное цитирование.

  • [types]

    Полностью переработано построение типов в диалектах. Диалекты теперь определяют общедоступные типы исключительно как имена UPPERCASE, а внутренние типы реализации - с помощью идентификаторов с подчеркиванием (т.е. являются частными). Система, с помощью которой типы выражаются в SQL и DDL, перенесена в систему компилятора. Это привело к тому, что в большинстве диалектов стало гораздо меньше объектов типов. Подробный документ по этой архитектуре для авторов диалектов находится в lib/sqlalchemy/dialects/type_migration_guidelines.txt .

  • [types]

    Типы больше не делают никаких предположений относительно параметров по умолчанию. В частности, Numeric, Float, NUMERIC, FLOAT, DECIMAL не генерируют никакой длины или масштаба, если они не указаны.

  • [types]

    types.Binary переименован в types.LargeBinary, он выводит только BLOB, BYTEA или аналогичный тип «длинный двоичный». Для доступа к этим типам, специфичным для MySQL/MS-SQL, были добавлены новые базовые типы BINARY и VARBINARY.

    References: #1664

  • [types]

    Типы String/Text/Unicode теперь пропускают проверку unicode() для каждого значения столбца результатов, если диалект определил, что DBAPI возвращает объекты Python unicode нативно. Эта проверка выполняется при первом подключении с помощью команды «SELECT CAST „some text“ AS VARCHAR(10)» или эквивалентной ей, а затем проверяется, является ли возвращаемый объект юникодом Python. Это позволяет значительно увеличить производительность нативных юникодных DBAPI, включая pysqlite/sqlite3, psycopg2 и pg8000.

  • [types]

    Большинство типов результирующих процессоров были проверены на предмет возможного повышения скорости работы. В частности, были оптимизированы следующие общие типы, что привело к различному увеличению скорости: Unicode, PickleType, Interval, TypeDecorator, Binary. Также были улучшены следующие специфические для dbapi реализации: Time, Date и DateTime на Sqlite, ARRAY на PostgreSQL, Time на MySQL, Numeric(as_decimal=False) на MySQL, oursql и pypostgresql, DateTime на cx_oracle и типы на основе LOB на cx_oracle.

  • [types]

    Отражение типов теперь возвращает точный тип UPPERCASE в файле types.py, или тип UPPERCASE в самом диалекте, если тип не является стандартным типом SQL. Это означает, что отражение теперь возвращает более точную информацию об отражаемых типах.

  • [types]

    Добавлен новый общий тип Enum. Enum - это объект с поддержкой схемы, предназначенный для поддержки баз данных, которые требуют специальных DDL для использования enum или эквивалента; в случае PG он обрабатывает детали CREATE TYPE, а в других базах данных без встроенной поддержки enum будет генерировать VARCHAR + встроенное ограничение CHECK для применения enum.

    References: #1109, #1511

  • [types]

    Тип Interval включает флаг «native», который определяет, будут ли выбраны родные типы INTERVAL (postgresql + oracle), если они доступны, или нет. Также добавлены аргументы «day_precision» и «second_precision», которые распространяются соответствующим образом на эти родные типы. Связано с.

    References: #1467

  • [types]

    Тип Boolean при использовании в бэкенде, не имеющем встроенной поддержки boolean, будет генерировать ограничение CHECK «col IN (0, 1)» вместе с типом столбца, основанным на int/smallint. При желании это можно отключить с помощью create_constraint=False. Заметим, что MySQL не имеет встроенной поддержки булевых или CHECK-ограничений, поэтому данная возможность на этой платформе недоступна.

    References: #1589

  • [types]

    PickleType теперь использует == для сравнения значений при mutable=True, если в типе не указан аргумент «comparator» с функцией сравнения. Если не переопределена функция __eq__() или не указана функция сравнения, то сравниваемые объекты будут сравниваться на основе идентичности (что противоречит цели mutable=True).

  • [types]

    Аргументы по умолчанию «precision» и «scale» для Numeric и Float были удалены и теперь имеют значение None. По умолчанию NUMERIC и FLOAT будут отображаться без числовых аргументов, если эти значения не указаны.

  • [types]

    AbstractType.get_search_list() удалена - игры, для которых она использовалась, больше не нужны.

  • [types]

    Добавлен общий тип BigInteger, компилируемый в BIGINT или NUMBER(19).

    References: #1125

  • [types]

    sqlsoup был переделан для явной поддержки сессий в стиле 0.5, используя autocommit=False, autoflush=True. Поведение SQLSoup по умолчанию теперь требует обычного использования commit() и rollback(), которые были добавлены в его интерфейс. В конструктор может быть передан явный аргумент Session или scoped_session, что позволяет переопределять эти аргументы.

  • [types]

    sqlsoup db.<sometable>.update() и delete() теперь вызывают query(cls).update() и delete() соответственно.

  • [types]

    В sqlsoup теперь есть execute() и connection(), которые вызывают методы Session этих имен, обеспечивая привязку в терминах привязки объекта SqlSoup.

  • [types]

    Объекты sqlsoup больше не имеют атрибута „query“ - он не нужен для парадигмы использования sqlsoup и мешает колонке, которая действительно называется „query“.

  • [types]

    Сигнатура вызываемого proxy_factory, передаваемого в association_proxy, теперь имеет вид (lazy_collection, creator, value_attr, association_proxy), добавляя четвертый аргумент, который является аргументом родительского AssociationProxy. Позволяет сериализовать и подклассифицировать встроенные коллекции.

    References: #1259

  • [types]

    В association_proxy появились базовые методы-компараторы .any(), .has(), .contains(), ==, !=, благодаря Скотту Торборгу.

    References: #1372

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