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 от объединенной структуры 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]

    Исправлена ошибка, при которой флаг «warn on unicode» устанавливался для типа String при использовании с некоторыми диалектами. Эта ошибка отсутствует в версии 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]

    Исправлено сообщение об ошибке «не удается выполнить синхронизацию для целевого столбца „q“; отобразитель „X“ не отображает этот столбец», чтобы ссылаться на правильный отобразитель. …

    References: #2163

  • [orm]

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

    References: #2149

  • [orm]

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

    References: #2153

  • [orm]

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

    References: #2171

  • [orm]

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

    References: #2170

  • [orm]

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

    References: #2182

engine

  • [engine]

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

    References: #2178

sql

  • [sql]

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

    References: #2147

  • [sql]

    Исправлена ошибка, при которой вложение метки select() с другой меткой в нее приводило к некорректному экспорту колонок. Кроме всего прочего, это нарушало сопоставление колонки_свойства() ORM с другой колонкой_свойства(). …

    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]

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

    References: #2046

  • [orm]

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

    References: #2098

  • [orm]

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

    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

firebird

  • [firebird]

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

    References: #2083

misc

  • [informix]

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

    References: #2092

  • [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->соединенный-подкласс->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», в необычном случае, когда условие присоединения «работает» для viewonly, но не работает для non-viewonly, а foreign_keys не был использован - добавляет «foreign_keys» к предложению. Также добавьте «foreign_keys» к предложению для общей ошибки «direction».

examples

  • [examples]

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

engine

  • [engine]

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

  • [engine]

    Исправлена утечка памяти в C-версии обработчика результатов Decimal.

    References: #1978

  • [engine]

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

    References: #1871

  • [engine]

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

    References: #1998

  • [engine]

    Движок Threadlocal возвращает себя при выполнении begin(), begin_nested(); затем движок реализует методы contextmanager, чтобы разрешить оператор «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]

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

  • [sql]

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

    References: #2000

postgresql

  • [postgresql]

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

    References: #1984

  • [postgresql]

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

    References: #1955

  • [postgresql]

    Добавлен флаг as_uuid=True для типа UUID, который будет получать и возвращать значения в виде объектов 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, который включает удаленную схему в другую таблицу с тем же именем схемы, теперь отображает удаленное имя без пункта схемы, как того требует SQLite.

    References: #1851

  • [sqlite]

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

mssql

  • [mssql]

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

    References: #1770

oracle

  • [oracle]

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

    References: #1953

firebird

  • [firebird]

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

    References: #2012

misc

  • [declarative]

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

    References: #1972

  • [sqlsoup]

    Добавлен метод «map_to()» в SqlSoup, который является «главным» методом, принимающим явные аргументы для каждого аспекта 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]

    Добавлена новая опция «ленивой загрузки» «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() неадекватно адаптировал правую часть к правой части левого соединения

    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]

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

  • [orm]

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

    References: #1910

  • [orm]

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

  • [orm]

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

  • [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“, булевы значения для „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() выдает предупреждение, если заданная таблица уже присутствует в целевых метаданных - возвращается существующий объект таблицы.

  • [sql]

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

  • [sql]

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

    References: #1862

  • [sql]

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

    References: #1907

postgresql

  • [postgresql]

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

  • [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 теперь учитывает часть URL «port» вместо того, чтобы отбрасывать ее.

    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__ в базовом классе, который не является миксином, а также в миксинах.

    References: #1922

  • [declarative]

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

    References: #1915

  • [declarative]

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

    References: #1930, #1931

  • [declarative]

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

  • [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]

    Добавлен мьютекс в identity map, который мьютексирует операции удаления против методов итерации, которые теперь предварительно буферизуются перед возвратом итерабельной таблицы. Это сделано потому, что асинхронные 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 или другого единственного selectable, который включает несколько колонок с одинаковым именем в своей коллекции .c., и эти колонки не названы явно как часть одного или отдельных атрибутов (или исключены). В версии 0.7 это предупреждение будет исключением. Обратите внимание, что это предупреждение не выдается, когда комбинация возникает в результате наследования, так что атрибуты по-прежнему могут быть переопределены естественным образом… В 0.7 это будет улучшено.

    References: #1896

  • [orm]

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

    References: #1896

  • [orm]

    Объект, который был удален, теперь получает флаг „deleted“, который запрещает повторное добавление()ed объекта в сессию, так как раньше объект жил в карте идентификации молча, пока к его атрибутам не обращались. Функция 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, где внешний ключ также является членом первичного ключа, теперь будет более тщательно проверяться при промывке, является ли изменение значения внешнего ключа на стороне «многих» результатом изменения первичного ключа на стороне «одного», или «один» - это просто другой объект. В одном случае БД с возможностью каскадирования уже каскадировала значение, и нам нужно посмотреть на «новое» значение PK, чтобы выполнить UPDATE, в другом случае нам нужно продолжать смотреть на «старое». Теперь мы смотрим на «старое» значение, предполагая, что passive_updates=True, если только мы не знаем, что изменение было вызвано переключением PK.

    References: #1856

  • [orm]

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

    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 был реорганизован таким образом, что сессия, менеджер кэша, декларативная_база являются частью окружения, а код пользовательского кэша переносится и теперь находится в файле «caching_query.py». Это позволяет легче «вставить» пример в существующие проекты.

  • [examples]

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

    References: #1887

engine

  • [engine]

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

  • [engine]

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

    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]

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

    References: #1879

  • [oracle]

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

    References: #1867

  • [oracle]

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

    References: #1868

firebird

  • [firebird]

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

misc

  • [declarative]

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

  • [declarative]

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

  • [informix]

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

    References: #1904

  • [documentation]

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

0.6.3

Released: Thu Jul 15 2010

orm

  • [orm]

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

    References: #1845

  • [orm]

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

    References: #1853

  • [orm]

    Исправлена ошибка, при которой Query.join() не срабатывал при запросе не-ORM столбца, а затем соединялся без предложения 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 на уровне обработчика соединений. Преимущество в том, что инты возвращаются как инты без участия объектов типа SQLA и без ненужного преобразования в десятичную систему.

    К сожалению, некоторые экзотические подзапросы могут даже видеть различные типы между отдельными строками результатов, поэтому обработчик 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 на столбец в строке. Обновления нескольких строк также группируются в как можно большее количество execemany()s, сохраняя при этом последовательное упорядочивание строк.

  • [orm]

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

  • [orm]

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

  • [orm]

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

  • [orm]

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

  • [orm]

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

  • [orm]

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

  • [orm]

    make_transient() удаляет все «загрузчики» callables из состояния, которое делается переходным, удаляя любое «истекшее» состояние - все незагруженные атрибуты возвращаются к неопределенным, 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 dialect now detects NO_BACKSLASH_ESCAPES sql mode, in addition to 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()», чтобы в большем количестве случаев мы получали числовые значения в виде Decimal, а не в виде float. Затем они преобразуются, если требуется, в Integer или Float, или же сохраняются в виде Decimal без потерь.

    References: #1840

firebird

  • [firebird]

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

    References: #1823

  • [firebird]

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

    References: #1813

misc

  • [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 unit of work, которая нарушала обновления для двунаправленных 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() выдает «SYSDATE()», т.е. с завершающей скобкой, на MySQL.

    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

firebird

  • [firebird]

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

    References: #1521

  • [firebird]

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

    References: #1779

  • [firebird]

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

    References: #1646

misc

  • [engines]

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

    References: #1781

  • [engines]

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

  • [engines]

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

  • [sqlsoup]

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

    References: #1783

0.6.0

Released: Sun Apr 18 2010

orm

  • [orm]

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

    References: #1081, #1742

  • [orm]

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

  • [orm]

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

    References: #1764

  • [orm]

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

    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“ во все вызываемые свойства маппера, а также в 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>», не будут выдавать ошибки, если column._label используется в качестве имени привязки при UPDATE. Добавлено тестовое покрытие, которого не было в 0.5.

    References: #1755

  • [sql]

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

    References: #1729

  • [sql]

    тип Numeric вызывает огромное предупреждение, когда ожидается преобразование плавающих чисел в десятичные из DBAPI, который возвращает плавающие числа. Это включает SQLite, Sybase, MS-SQL.

    References: #1759

  • [sql]

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

  • [sql]

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

  • [sql]

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

  • [sql]

    Добавлена функция get_pk_constraint() в reflection.Inspector, аналогичная 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 теперь не нуждаются в применении каких-либо преобразований.

firebird

  • [firebird]

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

misc

  • [engines]

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

    References: #1757

  • [ext]

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

  • [ext]

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

  • [ext]

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

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]

    Добавлен метод with_hint() в конструкцию Query(). Он вызывает непосредственно 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]

    Query приобретает метод 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) больше не предполагается, что 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]

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

    References: #1692

  • [orm]

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

  • [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() не будет уничтожать существующие скалярные атрибуты на существующей цели, если цель имеет значение для этого атрибута, даже если входящее объединение не имеет значения для атрибута. Это предотвращает ненужную нагрузку на существующие элементы. Однако атрибут все равно будет помечен как просроченный, если у цели нет этого атрибута, что выполняет некоторые контракты отложенных коллов.

    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 для кэширования при ленивой нагрузке. Этот объект выполняет поиск среди любого количества потенциальных атрибутов более эффективно, группируя их в общую структуру. И FromCache, и RelationCache по отдельности проще.

sql

  • [sql]

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

    References: #1714

  • [sql]

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

  • [sql]

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

    References: #1694, #1698

  • [sql]

    Некоторые платформы теперь будут интерпретировать определенные литеральные значения как несвязывающие параметры, которые буквально отображаются в операторе SQL. Это сделано для поддержки строгих правил SQL-92, которые применяются некоторыми платформами, включая MS-SQL и Sybase. В этой модели связывающие параметры не допускаются в предложении columns оператора SELECT, равно как и некоторые неоднозначные выражения типа «?=?». Когда этот режим включен, компилятор базы будет отображать привязки как встроенные литералы, но только для строк и числовых значений. Другие типы, такие как даты, вызовут ошибку, если только подкласс диалекта не определит для них функцию рендеринга литералов. Параметр привязки должен уже иметь встроенное литеральное значение, иначе будет выдана ошибка (т.е. не будет работать прямой 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]

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

  • [sql]

    Система типов/выражений теперь выполняет более полную работу по определению возвращаемого типа из выражения, а также по адаптации оператора Python в оператор SQL, основываясь на полном левом/правом/операторе данного выражения. В частности, система даты/времени/интервала, созданная для PostgreSQL EXTRACT in, теперь обобщена на систему типов. Прежнее поведение, которое часто возникало при выражении «колонка + литерал», заставляя тип «литерала» быть таким же, как у «колонки», теперь обычно не возникает - тип «литерала» сначала выводится из Python-типа литерала, предполагая стандартные собственные типы Python + типы даты, прежде чем вернуться к типу известного типа на другой стороне выражения. Если тип «fallback» совместим (т.е. 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]

    Добавлен флаг «native_datetime=True» в create_engine(). Это заставит типы 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]

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

  • [engines]

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

  • [engines]

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

    References: #1719

  • [engines]

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

  • [engines]

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

  • [engines]

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

  • [engines]

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

  • [engines]

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

  • [engines]

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

    References: #1555

  • [engines]

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

  • [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, чтобы определить, будет ли нетерпеливое соединение построено как INNER или OUTER соединение. По умолчанию, как всегда, False. Опции отобразителя будут переопределять ту настройку, которая указана в relation(). Обычно это значение должно быть установлено для отношений типа «многие-к-одному», а не для нулевых внешних ключей, чтобы улучшить производительность соединения.

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

    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]

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

    References: #1531

  • [orm]

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

    References: #1643

  • [orm]

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

    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() и мапперы. В частности, это помогает при запросе из нескольких классов объединенных таблиц, чтобы обеспечить отображение полного объединения.

  • [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()», которая превращает постоянный/отделенный экземпляр в переходный (т.е. удаляет instance_key и удаляет из любой сессии).

    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() устарел. Теперь он ничего не делает, и его установка «включена» во всех случаях.

    • Флаг „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]

    флаг автоинкремента на колонке теперь указывает колонку, которая должна быть связана с 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 с несколькими столбцами. Сообщение об ошибке «скалярный select может иметь только один столбец» убрано - мы будем полагаться на то, что база данных сообщит о проблемах с несоответствием столбцов.

  • [sql]

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

  • [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]

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

  • [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 по мере необходимости, поддерживает метки unicode, поддерживает отражение.

    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 теперь используется опция оператора «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 принимает только объекты даты (и объекты datetime, поскольку они наследуются от date), Time принимает только объекты времени, а DateTime принимает только объекты даты и datetime.

  • [sqlite]

    Table() поддерживает аргумент ключевого слова «sqlite_autoincrement», который применяет ключевое слово SQLite «AUTOINCREMENT» к единственному целочисленному столбцу первичного ключа при генерации DDL. Это предотвращает генерацию отдельного ограничения 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 в диалект. Пока поддерживается только тип интервала ДЕНЬ - СЕКУНДА из-за отсутствия в cx_oracle поддержки типа ГОД - МЕСЯЦ.

    References: #1467

  • [oracle]

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

  • [oracle]

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

    References: #885

  • [oracle]

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

  • [oracle]

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

  • [oracle]

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

  • [oracle]

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

  • [oracle]

    при использовании types.BigInteger в Oracle будет получено ЧИСЛО(19)

    References: #1125

  • [oracle]

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

firebird

  • [firebird]

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

  • [firebird]

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

  • [firebird]

    Функция «чувствительность к регистру» обнаружит имя колонки, чувствительное к регистру всех строчных букв, во время отражения и добавит «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]

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

  • [engines]

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

  • [engines]

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

  • [engines]

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

    References: #1586

  • [engines]

    Базы данных, которые полагаются на поствыборку «last inserted id» для получения сгенерированного значения последовательности (т.е. 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. Используется тот же конструктор таблиц, с оговоркой, что «эффективные» ограничения первичных и внешних ключей не являются частью результатов отражения; они должны быть указаны явно, если это необходимо.

  • [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 был переименован в

    »цель».

  • [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» для обеспечения пользовательской обработки. Это заменяет необходимость копирования словарей «функций» и «операторов» в подклассах компилятора прямыми методами visit, а также позволяет подклассам компилятора полностью контролировать рендеринг, поскольку передается полный объект _Function или _BinaryExpression.

  • [types]

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

  • [types]

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

  • [types]

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

    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]

    Аргументы по умолчанию «точность» и «масштаб» для 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

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