0.6 Changelog¶
0.6.9¶
Released: Sat May 05 2012general¶
Настроен механизм «importlater», который используется для разрешения циклов импорта, таким образом, что использование __import__ завершается при импорте sqlalchemy или sqlalchemy.orm, что позволяет избежать использования __import__ после запуска приложением новых потоков, исправления.
References: #2279
orm¶
исправлена некорректная оценка объекта user-mapped в булевом контексте в query.get().
References: #2310
Исправлено форматирование ошибок, возникающих при случайной передаче кортежа в session.query().
References: #2297
Исправлена ошибка, из-за которой исходное предложение, используемое query.join(), становилось непоследовательным, если в выражении по столбцу объединялось несколько сущностей.
References: #2197
Исправлена ошибка, проявляющаяся только в Python 3, при которой сортировка постоянных и отложенных объектов при flush приводила к некорректному сравнению, если первичный ключ постоянного объекта не являлся целым числом.
References: #2228
Исправлена ошибка, при которой запрос query.join() + aliased=True из структуры join-inh к себе на relationship() с условием join на дочерней таблице неправомерно преобразовывал ведущую сущность в объединенную.
References: #2234
Исправлена ошибка, при которой атрибут mapper.order_by игнорировался во «внутреннем» запросе внутри подзапроса, требующего дополнительной загрузки. .
References: #2287
Исправлена ошибка, из-за которой, если в сопоставленном классе переопределялись __hash__() или __eq__() на что-то нестандартное, что является поддерживаемым случаем использования, так как SQLA никогда не должна обращаться к этим методам, эти методы обращались, если класс был частью «составного» (т.е. не состоящего из одного элемента) набора результатов.
References: #2215
Исправлена тонкая ошибка, приводившая к разрыву SQL при возникновении: column_property() против подзапроса + joinedload + LIMIT + order by the column property(). .
References: #2188
Условие присоединения, создаваемое с помощью функции with_parent, а также при использовании «динамического» отношения к родителю будет генерировать уникальные bindparam, а не некорректно повторять один и тот же bindparam. .
References: #2207
Исправлено утверждение «no statement condition» в Query, которое пыталось подняться, если после вызова from_statement() был вызван генеративный метод.
References: #2199
Cls.column.collate(«some collation») теперь работает.
References: #1776
examples¶
Скорректирован пример dictlike-polymorphic.py для применения CAST таким образом, чтобы он работал на PG, других базах данных.
References: #2266
engine¶
В 0.7.4 перенесено исправление, гарантирующее, что соединение находится в корректном состоянии перед попыткой вызова rollback()/prepare()/release() для транзакций с точкой сохранения и двухфазных транзакций.
References: #2317
sql¶
Исправлены две тонкие ошибки, связанные с соответствием столбцов в селекте, одна из которых связана с повторением подзапроса с одной и той же меткой, а другая - с тем, что метка «группируется» и теряет себя. Затронуты.
References: #2188
Исправлена ошибка, из-за которой при использовании некоторых диалектов для типа String устанавливался флаг «warn on unicode». Эта ошибка отсутствует в версии 0.7.
Исправлена ошибка, из-за которой метод with_only_columns() в Select не работал, если передавался selectable. Однако поведение FROM здесь по-прежнему некорректно, поэтому для использования этого варианта в любом случае нужна версия 0.7.
References: #2270
schema¶
Добавлено информативное сообщение об ошибке, когда ForeignKeyConstraint ссылается на имя столбца в родителе, которое не найдено.
postgresql¶
mysql¶
Исправлен диалект OurSQL, в котором для команд XA вместо символа „»“ используется анси-нейтральный символ кавычек «“». …
References: #2186
CREATE TABLE поместит опцию COLLATE после CHARSET, что, по-видимому, является частью произвольных правил MySQL относительно того, будет ли это действительно работать или нет.
References: #2225
mssql¶
Декодирование входящих значений при получении списка имен индексов и имен столбцов в этих индексах.
References: #2269
oracle¶
0.6.8¶
Released: Sun Jun 05 2011orm¶
Вызов query.get() для сущности, основанной на столбцах, является некорректным, теперь это условие вызывает предупреждение об устаревании.
References: #2144
не_первичный отображатель будет наследовать _идентичность_класса первичного отображателя. Таким образом, при использовании не_первичного отображения для класса, который обычно находится в наследовании, будут получены результаты, совместимые с результатами первичного отображения.
References: #2151
Репортирована реализация карты идентификации 0.7, которая не использует мьютекс для удаления. Это было сделано в связи с тем, что некоторые пользователи по-прежнему получали тупики, несмотря на исправления в 0.6.7; подход 0.7, не использующий мьютекс, похоже, не приводит к проблемам с «изменением размера словаря», что было первоначальным основанием для использования мьютекса.
References: #2148
Исправлено сообщение об ошибке «cannot execute syncrule for destination column „q“; mapper „X“ does not map this column» для ссылки на правильный mapper.
References: #2163
Исправлена ошибка, при которой определение «самоссылающегося» отношения не давало результата, если объединенный подкласс inh был связан с самим собой, или объединенный подкласс inh был связан с подклассом этого подкласса, в условии присоединения которого отсутствовали столбцы в подклассе.
References: #2149
mapper() будет игнорировать ненастроенные внешние ключи к несвязанным таблицам при определении условия наследования между родительским и дочерним классом. Это эквивалентно поведению, уже примененному в декларативном. Заметим, что в 0.7 для этого есть более полное решение, изменяющее способ определения ошибки FK в самой функции join().
References: #2153
Исправлена ошибка, из-за которой отображение mapper на анонимный псевдоним при использовании логирования приводило к ошибке, связанной с отсутствием знака % в имени псевдонима.
References: #2171
Изменить текст сообщения, возникающего в случае, когда ключ «identity» не определяется при прошивке, включив в него общую причину того, что колонка не настроена на корректное определение автоинкремента;.
References: #2170
Исправлена ошибка, из-за которой коллекция «deleted» на уровне транзакций не очищалась от удаленных состояний, что приводило к ошибке, если они впоследствии становились переходными.
References: #2182
engine¶
Скорректирован метод __contains__() строки результата RowProxy таким образом, что внутри строки не генерируется исключение throw; NoSuchColumnError() также будет генерировать свое сообщение независимо от того, может ли конструкция столбца быть приведена к строке.
References: #2178
sql¶
Исправлена ошибка, из-за которой при передаче FetchedValue в колонку server_onupdate ей не назначалась родительская «колонка», добавлено тестовое покрытие для всех шаблонов назначения колонок по умолчанию.
References: #2147
Исправлена ошибка, из-за которой вложение метки select() с другой меткой в нее приводило к некорректному экспорту столбцов. Помимо прочего, это приводило к нарушению сопоставления ORM column_property() с другим column_property(). …
References: #2167
postgresql¶
Исправлена ошибка, затрагивающая PG 9, при которой отражение индекса по столбцу, имя которого изменилось, приводило к ошибке. .
References: #2141
Исправлены некоторые модульные тесты, касающиеся числовых массивов, оператора MATCH. Исправлена потенциальная неточность в работе с плавающей точкой, а некоторые тесты оператора MATCH пока выполняются только в EN-ориентированной локали. .
References: #2175
mssql¶
Исправлена ошибка в диалекте MSSQL, при которой псевдонимия, применяемая к таблице с критериями схемы, просачивалась во вложенные операторы select.
References: #2169
Исправлена ошибка, из-за которой тип DATETIME2 не выполнялся на шаге «адаптация» при использовании в результирующих наборах или связанных параметрах. Эта проблема отсутствует в версии 0.7.
References: #2159
0.6.7¶
Released: Wed Apr 13 2011orm¶
Ужесточили соотношение итерации и удаления мьютекса при итерации карты идентичности, пытаясь снизить вероятность того, что (крайне редко) реентерабельная операция gc приведет к тупику. Возможно, в 0.7 мьютекс будет удален.
References: #2087
Добавлен аргумент name для Query.subquery(), позволяющий присваивать объекту псевдонима фиксированное имя.
References: #2030
Предупреждение выдается в том случае, если мэппер, наследующий объединенную таблицу, не имеет первичных ключей в локально отображаемой таблице (но имеет их в таблице суперкласса).
References: #2019
Исправлена ошибка, при которой «средний» класс в полиморфной иерархии не имел столбца „polymorphic_on“, если в нем не был указан также „polymorphic_identity“, что приводило к странным ошибкам при обновлении, неправильной загрузке класса при запросе от этой цели. Также выдается корректный критерий WHERE при использовании наследования одной таблицы.
References: #2038
Исправлена ошибка, при которой столбец со значением по умолчанию на стороне SQL или сервера, исключенный из отображения с помощью include_properties или exclude_properties, приводил к ошибке UnmappedColumnError.
References: #1995
Предупреждение выдается в том необычном случае, когда append или подобное событие в коллекции происходит после того, как родительский объект был разыменован, что не позволяет пометить родительский объект как «грязный» в сессии. В версии 0.7 это будет исключением.
References: #2046
Исправлена ошибка в query.options(), из-за которой путь, примененный к lazyload с использованием строковых ключей, мог накладываться на одноименный атрибут не той сущности. В примечании 0.7 приведена обновленная версия этого исправления.
References: #2098
Переформулировано исключение, возникающее при попытке прошить подкласс, не являющийся полиморфным по отношению к супертипу.
References: #2063
Некоторые исправления в обработке состояний для обратных ссылок, обычно при autoflush=False, когда коллекция с обратными ссылками не могла корректно обрабатывать добавления/удаления без чистого изменения. Спасибо Ричарду Мурри за тестовый пример + патч.
References: #2123
при использовании функции from_self() предложение «иметь» будет скопировано из внутреннего запроса во внешний.
References: #2130
examples¶
Пример кэширования Beaker допускает аргумент «query_cls» в функции query_callable().
References: #2090
engine¶
Исправлена ошибка в QueuePool, SingletonThreadPool, из-за которой соединения, отброшенные в результате переполнения или периодической очистки(), не закрывались явным образом, оставляя сборку мусора на усмотрение задачи. Это, как правило, касается только бэкендов без подсчета ссылок, таких как Jython и PyPy. Спасибо Jaimy Azle за обнаружение этой проблемы.
References: #2102
sql¶
Column.copy(), используемая в table.tometadata(), копирует атрибут „doc“.
References: #2028
Добавлены некоторые defs в расширение resultproxy.c, чтобы расширение компилировалось и работало на Python 2.4.
References: #2023
Расширение компилятора теперь поддерживает переопределение компиляции по умолчанию выражения expression._BindParamClause, в результате чего автоматически генерируемые привязки в предложениях VALUES/SET операторов insert()/update() также будут использовать новые правила компиляции.
References: #2042
Добавлены аксессоры для ResultProxy «returns_rows», «is_insert»
References: #2089
Ключевые слова limit/offset в select(), а также значение, передаваемое в select.limit()/offset(), будут приведены к целочисленному виду.
References: #2116
postgresql¶
При явном выполнении последовательности выводится имя автогенерируемой последовательности столбца SERIAL, что в настоящее время происходит только при implicit_returning=False, теперь учитывается, если имя таблицы + столбца превышает 63 символа, используя ту же логику, которую использует PostgreSQL.
References: #1083
В список исключений «disconnect» добавлено дополнительное сообщение libpq - «не удалось получить данные от сервера».
References: #2044
Добавлены RESERVED_WORDS для диалекта postgresql.
References: #2092
Исправлен тип BIT, позволяющий использовать параметр «длина», «изменяющийся» параметр. Также исправлено отражение.
References: #2073
mysql¶
Диалект oursql принимает те же аргументы «ssl» в create_engine(), что и MySQLdb.
References: #2047
sqlite¶
Исправлена ошибка, при которой отражение внешнего ключа, созданного как «REFERENCES <tablename>» без имени col, приводило к ошибке.
References: #2115
mssql¶
Переписан запрос, используемый для получения определения представления, как правило, при использовании интерфейса Inspector, с использованием sys.sql_modules вместо информационной схемы, что позволяет полностью возвращать определения представлений длиной более 4000 символов.
References: #2071
oracle¶
При использовании имен столбцов, которые требуют кавычек для самого столбца или для генерируемого именем параметра привязки, например, имен со специальными символами, подчеркиваниями, неаскриптивными символами, теперь правильно транслируются ключи параметров привязки при обращении к cx_oracle.
References: #2100
В диалекте Oracle добавлен флаг use_binds_for_limits=False create_engine(), который выводит значения LIMIT/OFFSET в строку, а не в виде биндов, что, как сообщается, модифицирует план выполнения, используемый Oracle.
References: #2116
misc¶
Добавлен диалект RESERVED_WORDS informix.
References: #2092
Флаг «implicit_returning» в функции create_engine() учитывается, если он установлен в False.
References: #2083
Класс horizontal_shard ShardedSession принимает в качестве аргумента конструктора общий аргумент сессии «query_cls», что позволяет в дальнейшем создавать подклассы ShardedQuery.
References: #2090
Добавлена явная проверка случая, когда для атрибута столбца декларативного класса используется имя „metadata“.
References: #2050
Исправить сообщение об ошибке, ссылающееся на старое имя @classproperty, на ссылку @declared_attr
References: #2061
Аргументы в __mapper_args__, которые не являются «хэшируемыми», не принимаются за всегда хэшируемые, возможно, столбцовые аргументы.
References: #2091
Документированные типы SQLite DATE/TIME/DATETIME.
References: #2029
0.6.6¶
Released: Sat Jan 08 2011orm¶
Исправлена ошибка, при которой событие изменения не «мутабельного» атрибута, произошедшее с объектом, который был чист, за исключением предшествующих изменений мутабельного атрибута, не давало строгой ссылки на себя в карте идентификации. Это приводило к тому, что объект собирался в мусор, теряя информацию о всех изменениях, которые не были ранее сохранены в словаре «mutable changes».
Исправлена ошибка, при которой параметр «passive_deletes=“all“» не передавал правильные символы ленивым загрузчикам при промывке, что приводило к необоснованной загрузке.
References: #2013
Исправлена ошибка, из-за которой составные атрибуты не могли быть использованы в сопоставленном операторе select. Обратите внимание, что в версии 0.7 работа композита будет существенно изменена.
References: #1997
Флаг active_history также добавлен в функцию composite(). Этот флаг не имеет эффекта в 0.6, а является флажком-заместителем для совместимости в будущем, так как в 0.7 он применяется для композитов.
References: #1976
Исправлена ошибка uow, из-за которой при удалении объектов, переданных в Session.delete(), не учитывались выгруженные ссылки и коллекции, несмотря на то, что значение параметра passive_deletes оставалось по умолчанию равным False.
References: #2002
Выдается предупреждение при указании version_id_col в наследуемом мэппере, когда у наследуемого мэппера уже есть такой, если выражения этих колонок не совпадают.
References: #1987
Флаг «innerjoin» не действует в цепочке объединений joinedload(), если предыдущее объединение в этой цепочке является внешним, что позволяет корректно возвращать в результаты первичные строки без ссылающейся дочерней строки.
References: #1954
Исправлена ошибка, связанная со стратегией «subqueryload», при которой стратегия не работала, если сущность представляла собой конструкцию aliased().
References: #1964
Исправлена ошибка, связанная со стратегией «загрузки подзапросов», когда при использовании многоуровневой загрузки вида A->joined-subclass->C соединение не выполнялось
References: #2014
Исправлена индексация объектов Query по -1. Он ошибочно преобразовывался в пустой срез -1:0, что приводило к ошибке IndexError.
References: #1968
Аргумент mapper «primary_key» может передаваться как в виде отдельного столбца, так и в виде списка или кортежа. В примерах документации, где он представлялся в виде скалярного значения, он был заменен на список.
References: #1971
Добавлен флаг active_history в relationship() и column_property(), заставляющий события атрибутов всегда загружать «старое» значение, чтобы оно было доступно для attributes.get_history().
References: #1961
Query.get() будет выдавать ошибку, если количество параметров в составном ключе слишком велико, а также слишком мало.
References: #1977
Перенесено исправление «optimized get» из 0.7, улучшающее генерацию поведения объединенного наследования «load expired row».
References: #1992
Небольшое уточнение для ошибки «primaryjoin», когда условие join «работает» для viewonly, но не работает для non-viewonly, а foreign_keys не был использован - добавление «foreign_keys» в предложение. Также добавьте «foreign_keys» к предложению для общей ошибки «direction».
examples¶
Пример версионирования теперь поддерживает обнаружение изменений в связанном отношении().
engine¶
Предупреждение «unicode warning» в отношении неюникодных данных привязки теперь выдается только при явном использовании типа Unicode, а не при использовании convert_unicode=True для типа engine или String.
Исправлена утечка памяти в C-версии процессора десятичных результатов.
References: #1978
Реализована возможность проверки последовательности для C-версии RowProxy, а также регистрация в стиле 2.7 «collections.Sequence» для RowProxy.
References: #1871
Методы Threadlocal движка rollback(), commit(), prepare() не будут подниматься, если транзакция не выполняется; это было ошибкой, введенной в 0.6.
References: #1998
Движок Threadlocal возвращает себя при выполнении begin(), begin_nested(); затем движок реализует методы контекстного менеджера, чтобы разрешить выполнение оператора «with».
References: #2004
sql¶
Исправлены правила старшинства операторов для нескольких цепочек одного неассоциативного оператора. Например, «x - (y - z)» будет компилироваться как «x - (y - z)», а не как «x - y - z». Также работает с метками, например, «x - (y - z).label(„foo“)».
References: #1984
Атрибут „info“ Column копируется в процессе работы Column.copy(), т.е. так, как это происходит при использовании колонок в декларативных миксинах.
References: #1967
Для DBAPI, таких как pymssql, которые наивно вызывают str() для значений, добавлен процессор привязки для булевых значений, который коэрцитирует их к int.
CheckConstraint будет копировать свои атрибуты „initially“, „deferable“ и „_create_rule“ в рамках функции copy()/tometadata().
References: #2000
postgresql¶
Одноэлементные кортежные выражения внутри предложения IN корректно выводятся за скобки, также из
References: #1984
Обеспечено распознавание каждого числового кода, кода float, int, скаляра + массива базовым типом psycopg2 и pg8000 «numeric».
References: #1955
Для типа UUID добавлен флаг as_uuid=True, который будет принимать и возвращать значения в виде объектов Python UUID(), а не строк. В настоящее время известно, что тип UUID работает только с psycopg2.
References: #1956
Исправлена ошибка, при которой KeyError возникал в версиях PG, не поддерживающих ENUM, после выполнения операции dispose+recreate пула.
References: #1989
mysql¶
Исправлена обработка ошибок для Jython + zxjdbc, в результате чего свойство has_table() снова работает. Регрессия по сравнению с 0.6.3 (у нас нет билдбота для Jython, извините)
References: #1960
sqlite¶
Предложение REFERENCES в таблице CREATE TABLE, включающее удаленную схему на другую таблицу с тем же именем схемы, теперь отображает удаленное имя без предложения schema, как того требует SQLite.
References: #1851
В этой же связи предложение REFERENCES в таблице CREATE TABLE, включающей удаленную схему в другую схему, чем схема родительской таблицы, вообще не отображается, поскольку кросс-схемные ссылки, по-видимому, не поддерживаются.
mssql¶
К сожалению, переписывание отражения индекса в было протестировано некорректно и давало неверные результаты. Теперь эта регрессия исправлена.
References: #1770
oracle¶
Логика «определения десятичной точки» cx_oracle, применяемая для столбцов набора результатов с неоднозначными числовыми характеристиками, теперь использует символ десятичной точки, определяемый настройкой locale/ NLS_LANG, используя определение этого символа по первому соединению. При использовании настройки NLS_LANG с непериодической десятичной точкой также требуется версия cx_oracle 5.0.3 или выше.
References: #1953
misc¶
Числовой тип Firebird теперь явно проверяет наличие Decimal, пропускает float(), что позволяет использовать специальные значения, такие как float(„inf“).
References: #2012
Если __table_args__ не имеет формата tuple или dict и не является None, то возникает ошибка.
References: #1972
В SqlSoup добавлен метод «map_to()», который представляет собой «главный» метод, принимающий явные аргументы для каждого аспекта selectable и mapping, включая базовый класс для каждого mapping.
References: #1975
Mapped selectables, используемые в методах map(), with_labels(), join(), больше не помещают заданный аргумент во внутренний словарь «cache». Тем более, что объекты join() и select() создаются в самом методе, и это было практически чистой утечкой памяти.
0.6.5¶
Released: Sun Oct 24 2010orm¶
Добавлена новая опция «lazyload» «immediateload». Выдает обычную операцию «ленивой» загрузки автоматически по мере заполнения объекта. Применяется в тех случаях, когда необходимо загрузить объекты, которые будут помещены в автономный кэш или иным образом использованы после того, как сессия будет недоступна, и требуется прямая загрузка «select», а не «joined» или «subquery».
References: #1914
Новые методы запросов: query.label(name), query.as_scalar() возвращают оператор запроса в виде скалярного подзапроса с /без метки; query.with_entities(*ent) заменяет список SELECT запроса новыми сущностями. Примерно эквивалентно генеративной форме query.values(), которая принимает сопоставленные сущности, а также выражения столбцов.
References: #1920
Исправлена ошибка рекурсии, которая могла возникать при перемещении объекта из одной ссылки в другую с обратными ссылками, когда инициирующий родитель был подклассом (с собственным маппером) предыдущего родителя.
В 0.6.4 исправлена регрессия, возникавшая в случае передачи пустого списка в параметр «include_properties» в функции mapper()
References: #1918
Исправлена ошибка маркировки в Query, при которой NamedTuple неправильно накладывал метки, если какое-либо из выражений столбца было немаркированным.
Исправлена ситуация, когда query.join() неадекватно подгонял правую часть к правой части левого join
References: #1925
Query.select_from() был усилен, чтобы гарантировать, что последующий вызов query.join() будет использовать сущность select_from(), если это сопоставленная сущность, а не обычная selectable, в качестве «левой» стороны по умолчанию, а не первой в списке сущностей объекта Query.
Исключение, возникающее при использовании Session после отката субтранзакции (что происходит при неудачном flush в режиме autocommit=False), теперь переформулировано (это сообщение «неактивен из-за отката в субтранзакции»). В частности, если откат произошел из-за исключения при выполнении flush(), то в сообщении указывается, что это именно так, и повторяется строковая форма исходного исключения, возникшего при выполнении flush. Если сеанс закрыт из-за явного использования субтранзакций (что встречается нечасто), то в сообщении просто указывается это.
Исключение, возникающее в Mapper при повторных запросах на инициализацию после того, как инициализация уже завершилась неудачей, больше не предполагает случай «hasattr», поскольку есть и другие сценарии, при которых выдается это сообщение, а также сообщение не складывается само на себя несколько раз - вы получаете одно и то же сообщение при каждой попытке использования. Ошибочное название «компилирует» заменяется на «инициализирует».
Исправлена ошибка в query.update(), при которой истечение срока действия „evaluate“ или „fetch“ приводило к неудаче, если ключом выражения столбца являлся атрибут класса с именем, отличным от имени реального столбца.
References: #1935
Добавлено утверждение при промывке, гарантирующее, что для «newly persistent» объектов не были сгенерированы ключи идентификации, удерживающие NULL. Это может произойти, когда пользовательский код случайно запускает флеши на не полностью загруженных объектах.
Ленивые загрузки для атрибутов отношений теперь при выдаче SQL используют текущее состояние, а не «зафиксированное» состояние атрибутов внешнего и первичного ключей, если не выполняется промывка. Ранее использовалось только зафиксированное состояние базы данных. В частности, это приводило к сбою операции get()-on-lazyload, так как при таких загрузках не срабатывает автопромывка, когда атрибуты определены и «зафиксированное» состояние может быть недоступно.
References: #1910
Новый флаг в функции relationship(), load_on_pending, позволяет ленивому загрузчику срабатывать на отложенных объектах без промывки, а также на переходных объектах, которые были вручную «прикреплены» к сессии. Обратите внимание, что этот флаг блокирует события атрибутов при загрузке объекта, поэтому обратные ссылки будут доступны только после промывки. Флаг предназначен только для очень специфических случаев использования.
Еще один новый флаг в функции relationship(), cascade_backrefs, отключает каскад «сохранения-обновления», если событие было инициировано на «обратной» стороне двунаправленной связи. Это более чистое поведение, позволяющее устанавливать «многие-к-одному» для переходного объекта, не втягивая его в сессию дочернего объекта, и при этом сохраняя возможность каскадирования прямой коллекции. В 0.7 мы можем установить по умолчанию значение False.
Немного улучшено поведение параметра «passive_updates=False» при размещении его только на стороне отношения «многие-к-одному»; в документации уточнено, что в действительности passive_updates=False должен использоваться на стороне «один-ко-многим».
Размещение passive_deletes=True на стороне многие-к-одному выдает предупреждение, так как вы, вероятно, собирались разместить его на стороне один-ко-многим.
Исправлена ошибка, из-за которой «subqueryload» не работал корректно при наследовании одной таблицы для отношения из подкласса - «where type in (x, y, z)» помещался только внутри, а не многократно.
При использовании from_self() с наследованием по одной таблице фраза «where type in (x, y, z)» размещается только во внешней части запроса, а не многократно. Возможно, это будет еще немного подкорректировано.
scoped_session выдает предупреждение при вызове configure(), если сессия уже присутствует (проверяется только текущий поток)
References: #1924
переработана внутренняя часть mapper.cascade_iterator(), что позволило сократить количество вызовов метода примерно на 9% в некоторых случаях.
References: #1932
engine¶
Исправлена регрессия в 0.6.4, в результате которой изменение, позволяющее выдавать ошибки курсора, последовательно ломало аксессор result.lastrowid. Добавлено тестовое покрытие для result.lastrowid. Обратите внимание, что lastrowid поддерживается только Pysqlite и некоторыми драйверами MySQL, поэтому в общем случае он не слишком полезен.
сообщение в журнале, выдаваемое движком при первом использовании соединения, теперь имеет вид «BEGIN (implicit)», чтобы подчеркнуть, что в DBAPI нет явного begin().
добавлена опция «views=True» в metadata.reflect(), которая добавляет список доступных представлений к отражаемым.
References: #1936
engine_from_config() теперь принимает значения „debug“ для „echo“, „echo_pool“, „force“ для „convert_unicode“, boolean для „use_native_unicode“.
References: #1899
sql¶
Исправлена ошибка в TypeDecorator, когда при генерации DDL для данного типа подтягивался тип, специфичный для диалекта, что не всегда приводило к правильному результату.
TypeDecorator теперь может иметь полностью сконструированный тип, указанный в качестве его «impl», в дополнение к классу типа.
TypeDecorator теперь будет помещать себя в качестве результирующего типа для бинарного выражения, где правила приведения типов обычно возвращают его impl-тип - ранее возвращалась копия impl-типа, в которую встраивался TypeDecorator в качестве «диалектного» impl, что, вероятно, было непреднамеренным способом достижения желаемого эффекта.
TypeDecorator.load_dialect_impl() по умолчанию возвращает «self.impl», т.е. не тип реализации диалекта «self.impl». Это необходимо для корректной поддержки компиляции. Поведение может быть переопределено пользователем точно так же, как и раньше, с тем же эффектом.
Добавлен элемент выражения type_coerce(expr, type_). Рассматривает данное выражение как заданный тип при оценке выражений и обработке строк результатов, но не влияет на генерацию SQL, за исключением анонимной метки.
Table.tometadata() теперь копирует и объекты Index, связанные с таблицей.
Table.tometadata() выдает предупреждение, если заданная таблица уже присутствует в целевых метаданных - возвращается существующий объект Table.
Информационное сообщение об ошибке выдается, если столбец Column, которому еще не присвоено имя, т.е. как в декларативном варианте, используется в контексте, где он экспортируется в коллекцию columns вложенной конструкции select(), или если любая конструкция, включающая этот столбец, компилируется до присвоения ему имени.
as_scalar(), label() могут быть вызваны на selectable, содержащем Column, который еще не имеет имени.
References: #1862
Исправлено переполнение рекурсии, которое могло возникнуть при работе с двумя выражениями, оба из которых имеют тип «NullType», но не являются синглтоном экземпляра NULLTYPE.
References: #1907
postgresql¶
Для типа ARRAY добавлен флаг «as_tuple», возвращающий результаты в виде кортежей, а не списков для возможности хеширования.
Исправлена ошибка, из-за которой не отражался «домен», построенный на основе пользовательского типа, например, «enum».
References: #1933
mysql¶
Исправлена ошибка, связанная с отражением значения CURRENT_TIMESTAMP по умолчанию, используемого в предложении ON UPDATE, спасибо Таави Бернсу
References: #1940
mssql¶
Исправлена ошибка отражения, которая не позволяла корректно обрабатывать отражение неизвестных типов.
References: #1946
Исправлена ошибка, из-за которой псевдонимы таблиц с «schema» не компилировались должным образом.
References: #1943
Переписано отражение индексов для использования sys. catalogs, чтобы можно было отражать имена столбцов любой конфигурации (пробелы, встроенные запятые и т.д.). Обратите внимание, что для отражения индексов требуется SQL Server 2005 или выше.
References: #1770
Диалект mssql+pymssql теперь учитывает часть «port» в URL, а не отбрасывает ее.
References: #1952
oracle¶
Аргумент implicit_returning в create_engine() теперь учитывается независимо от обнаруженной версии Oracle. Ранее флаг принудительно принимал значение False, если информация о версии сервера была < 10.
References: #1878
tests¶
Плагин NoseSQLAlchemyPlugin был перенесен в новый пакет «sqlalchemy_nose», который устанавливается вместе с пакетом «sqlalchemy». Таким образом, скрипт «nosetests» работает как обычно, а опция –with-coverage позволяет включить покрытие до импорта модулей SQLAlchemy, что обеспечивает корректную работу покрытия.
misc¶
Свойство @classproperty (скоро/теперь @declared_attr) действует для __mapper_args__, __table_args__, __tablename__ в базовом классе, не являющемся mixin, а также в mixins.
References: #1922
Официальное название/местоположение @classproperty для использования с declarative - sqlalchemy.ext.declarative.declared_attr. То же самое, но перемещается туда, поскольку это скорее «маркер», характерный для декларативного, а не просто техника атрибутов.
References: #1915
Исправлена ошибка, из-за которой столбцы в mixin не распространялись корректно на схему наследования с одной или объединенной таблицей, где имя атрибута отличается от имени столбца.
Теперь в mixin можно указать колонку, которая переопределяет одноименную колонку, связанную с суперклассом. Спасибо Ойстейну Хааланду.
Большая чистка / модернизация диалекта Informix для 0.6, любезно предоставленная Флорианом Аполлонером.
References: #1906
CircularDependencyError теперь имеет члены .cycles и .edges, которые представляют собой множество элементов, вовлеченных в один или несколько циклов, и множество ребер в виде 2-кортежей.
References: #1890
0.6.4¶
Released: Tue Sep 07 2010orm¶
Название ConcurrentModificationError было изменено на StaleDataError, а описательные сообщения об ошибке были пересмотрены, чтобы точно отражать суть проблемы. Оба названия останутся доступными в обозримом будущем для схем, которые могут указывать ConcurrentModificationError в оговорке «except:».
В карту идентификаторов добавлен мьютекс, который мьютексирует операции удаления против методов итерации, которые теперь предварительно буферизуются перед возвратом итерируемого элемента. Это сделано потому, что асинхронный gc может удалять элементы через поток gc в любое время.
References: #1891
Класс Session теперь присутствует в sqlalchemy.orm.*. Мы уходим от использования create_session(), имеющего нестандартные значения по умолчанию, для тех ситуаций, когда требуется одношаговый конструктор Session. Однако большинству пользователей следует придерживаться функции sessionmaker() для общего использования.
query.with_parent() теперь принимает переходные объекты и для формулировки критерия использует непостоянные значения их атрибутов pk/fk. В документах также уточнено назначение функции with_parent().
Аргументы include_properties и exclude_properties в mapper() теперь принимают в качестве членов не только строки, но и объекты Column. Это позволяет различать одноименные объекты Column, например, в join().
Теперь выдается предупреждение, если создается отображение на join или другой single selectable, который включает несколько столбцов с одинаковыми именами в своей коллекции .c., и эти столбцы не названы явно как часть одного или отдельных атрибутов (или исключены). В версии 0.7 это предупреждение будет исключением. Обратите внимание, что это предупреждение не выдается, когда комбинация возникает в результате наследования, так что атрибуты по-прежнему могут быть переопределены естественным образом. В 0.7 это будет улучшено.
References: #1896
Теперь в аргументе primary_key функции mapper() можно указать ряд столбцов, которые являются лишь подмножеством вычисляемых столбцов «первичного ключа» отображаемого селекта, при этом не возникнет ошибки. Это поможет в ситуациях, когда эффективный первичный ключ селекта меньше, чем количество столбцов в селекте, которые действительно помечены как «первичный_ключ», например, при объединении двух таблиц по их столбцам первичного ключа.
References: #1896
Удаленный объект теперь получает флаг „deleted“, который запрещает повторное добавление объекта в сессию, так как раньше объект жил в карте идентификации молча, пока к его атрибутам не обращались. Функция make_transient() теперь сбрасывает этот флаг вместе с флагом «key».
Функция make_transient() может быть безопасно вызвана на уже переходящем экземпляре.
в mapper() выдается предупреждение, если колонка polymorphic_on не присутствует ни в прямой, ни в производной форме в mapped selectable или в with_polymorphic selectable, вместо того, чтобы молча игнорировать ее. Ожидайте, что в версии 0.7 это станет исключением.
Еще один проход по серии сообщений об ошибках, выдаваемых при настройке relationship() с неоднозначными аргументами. Параметр «foreign_keys» больше не упоминается, поскольку он практически никогда не нужен, и предпочтительнее, чтобы пользователи устанавливали корректные метаданные ForeignKey, что сейчас и рекомендуется. Если „foreign_keys“ используется и является некорректным, то в сообщении указывается, что атрибут, вероятно, не нужен. Документация по атрибуту расширена. Это связано с тем, что все запутавшиеся пользователи relationship() на ML пытаются использовать foreign_keys из-за сообщения, что только еще больше запутывает их, поскольку метаданные таблицы гораздо понятнее.
Если «вторичная» таблица не имеет метаданных ForeignKey и не заданы foreign_keys, даже если пользователь передает испорченную информацию, предполагается, что выражения primary/secondaryjoin должны рассматривать только и все cols во «вторичной» таблице как иностранные. Для «secondary» невозможно, чтобы внешние ключи находились в другом месте в любом случае. Теперь вместо ошибки выдается предупреждение, и сопоставление выполняется успешно.
References: #1877
Перемещение объекта o2m из одной коллекции в другую или, наоборот, изменение объекта, на который ссылается m2o, где внешний ключ также является членом первичного ключа, теперь будет более тщательно проверяться при промывке, является ли изменение значения внешнего ключа на стороне «многих» результатом изменения первичного ключа на стороне «одного», или же «один» - это просто другой объект. В одном случае БД, поддерживающая каскадирование, уже каскадировала значение, и для выполнения UPDATE нам нужно посмотреть на «новое» значение PK, а в другом - продолжить смотреть на «старое». Теперь мы смотрим на «старое» значение, предполагая, что passive_updates=True, если только мы не знаем, что изменение было вызвано переключением PK.
References: #1856
Значение version_id_col может быть изменено вручную, что приведет к UPDATE строки. Теперь при версионных UPDATE и DELETE в предложении WHERE используется «зафиксированное» значение version_id_col, а не ожидающее изменения значение. Генератор версий также обходится стороной, если в атрибуте присутствуют ручные изменения.
References: #1857
Исправлено использование функции merge() при работе с отображениями, наследующими конкретные классы. Такие отображения часто имеют так называемые «конкретные» атрибуты, которые представляют собой атрибуты подклассов, «отключающие» распространение от родителя - это необходимо для того, чтобы операция merge() проходила без последствий.
Указание аргумента column_mapped_collection, не основанного на столбце, включая string, text() и т.д., приводит к появлению сообщения об ошибке, в котором специально запрашивается элемент столбца, и больше не вводит в заблуждение неверной информацией о text() или literal().
References: #1863
Аналогично, для relationship(), foreign_keys, remote_side, order_by - все выражения, основанные на столбцах, являются принудительными - списки строк явно запрещены, так как это очень распространенная ошибка
Динамические атрибуты не поддерживают создание коллекций - добавлено утверждение для случаев вызова функции set_committed_value(), а также применения опций joinedload() или subqueryload() к динамическому атрибуту, вместо отказа / молчаливого отказа.
References: #1864
Исправлена ошибка, из-за которой при генерации запроса, производного от запроса, в котором один и тот же столбец повторялся с разными именами меток, как правило, в некоторых ситуациях UNION, внутренние столбцы не полностью переносились во внешний запрос.
References: #1852
object_session() вызывает соответствующую ошибку UnmappedInstanceError при представлении не отображенного экземпляра.
References: #1881
Применены дополнительные мемоизации для вычисления свойств Mapper, что привело к значительному (~90%) сокращению количества вызовов mapper.py во время выполнения в сильно полиморфных конфигурациях отображения.
Частный метод mapper _get_col_to_prop, использовавшийся в примере с версионированием, устарел; теперь используйте mapper.get_property_by_column(), который останется публичным методом для этого.
пример версионирования теперь работает корректно, если версионирование производится на col, который ранее был NULL.
examples¶
Пример beaker_caching был реорганизован таким образом, что Session, менеджер кэша, declarative_base являются частью окружения, а пользовательский код кэша переносится и теперь находится в файле «caching_query.py». Это позволяет легче «встраивать» пример в существующие проекты.
в рецепте версионирования history_meta при копировании столбцов устанавливается значение «unique=False», чтобы таблица версионирования обрабатывала несколько строк с повторяющимися значениями.
References: #1887
engine¶
Вызов fetchone() или аналогичной функции для результата, который уже исчерпан, закрыт или не является возвращаемым результатом, теперь вызывает ResourceClosedError, подкласс InvalidRequestError, во всех случаях, независимо от бэкенда. Ранее некоторые DBAPI выдавали ProgrammingError (например, pysqlite), другие возвращали None, что приводило к последующим сбоям (например, MySQL-python).
Исправлена ошибка в Connection, при которой, если на этапе «инициализации» первого подключения пула соединений происходило событие «разъединение», то при попытке Connection аннулировать DBAPI-соединение возникала ошибка AttributeError.
References: #1894
Connection, ResultProxy, а также Session используют ResourceClosedError для всех ошибок типа «данное соединение/транзакция/результат закрыты».
Connection.invalidate() может вызываться более одного раза, и последующие вызовы ничего не дают.
sql¶
Вызов функции execute() для конструкции alias() ожидает своего исключения в версии 0.7, поскольку сама по себе она не является «исполняемой». В настоящее время она «проксирует» свой внутренний элемент и условно является «исполняемой», но это не та двусмысленность, которая нам нравится в наши дни.
Методы execute() и scalar() ClauseElement теперь соответствующим образом перенесены в подкласс Executable. Методы ClauseElement.execute()/ scalar() все еще присутствуют и ожидают отмены в 0.7, но обратите внимание, что они в любом случае будут вызывать ошибку, если вы не являетесь Executable (если только вы не являетесь alias(), см. предыдущее примечание).
Добавлено базовое принуждение математических выражений для Numeric->Integer, чтобы результирующий тип был Numeric независимо от направления выражения.
Изменена схема генерации усеченных имен «авто» индексов при использовании флага «index=True» для Column. Усечение происходит только для автогенерируемого имени, а не для пользовательского (в этом случае выдается ошибка), а сама схема усечения теперь основана на фрагменте md5-хэша имени идентификатора, так что несколько индексов для столбцов с похожими именами по-прежнему имеют уникальные имена.
References: #1855
Генерируемое имя индекса также основано на атрибуте «максимальная длина имени индекса», который отделен от «максимальной длины идентификатора» - это сделано для того, чтобы успокоить MySQL, которая имеет максимальную длину 64 для имен индексов, отдельно от их общей максимальной длины 255.
References: #1412
Конструкция text(), если ее поместить в ситуацию, ориентированную на столбцы, будет, по крайней мере, возвращать NULLTYPE для своего типа вместо None, что позволит использовать ее для специальных столбцовых выражений несколько свободнее, чем раньше. literal_column() все же является лучшим выбором.
Добавлено полное описание родительской таблицы/столбца, целевой таблицы/столбца в сообщении об ошибке, возникающей, когда ForeignKey не может разрешить цель.
Исправлена ошибка, при которой замена составных столбцов внешнего ключа в отраженной таблице приводила к попытке снять отраженное ограничение с таблицы во второй раз, вызывая ошибку KeyError.
References: #1865
конструкция _Label, т.е. та, которая создается всякий раз, когда вы говорите somecol.label(), теперь считает себя в своем «прокси_наборе», объединенном с прокси-набором содержащегося в ней столбца, а не возвращает напрямую прокси-набор содержащегося столбца. Это позволяет операциям соответствия столбцов, зависящим от идентичности самих _меток, возвращать правильный результат
исправлена ошибка ORM.
References: #1852
postgresql¶
Исправлен диалект psycopg2 для использования его метода set_isolation_level() вместо базовой команды «SET SESSION ISOLATION», так как в противном случае psycopg2 сбрасывает уровень изоляции при каждой новой транзакции.
mssql¶
Исправлен запрос «схема по умолчанию» для работы с бэкендом pymssql.
oracle¶
В диалект Oracle добавлен тип ROWID для тех случаев, когда может потребоваться явный CAST.
References: #1879
Отражение индексов в Oracle было настроено таким образом, что отражаются индексы, включающие некоторые или все столбцы первичного ключа, но не тот же набор столбцов, что и в первичном ключе. Индексы, содержащие одинаковые столбцы с первичным ключом, пропускаются при отражении, так как в этом случае предполагается, что индекс является автоматически сгенерированным индексом первичного ключа. Ранее любой индекс, содержащий столбцы PK, пропускался. За исправление спасибо Кенту Боуэру.
References: #1867
Oracle теперь отражает имена ограничений первичного ключа - также благодаря Кенту Боуэру.
References: #1868
misc¶
если @classproperty используется с обычным атрибутом свойства mapper, связанным с классом, то он будет вызван для получения фактического значения атрибута при инициализации. В настоящее время использование @classproperty для атрибута столбца или отношения декларативного класса, не являющегося миксином, не имеет никаких преимуществ - оценка происходит в то же время, как если бы @classproperty не использовался. Но здесь мы, по крайней мере, позволяем ему функционировать так, как ожидается.
Исправлена ошибка, при которой в сообщении «Невозможно добавить дополнительный столбец» отображалось неправильное имя.
Исправлена ошибка, из-за которой столбец по умолчанию не отражался, если ключевое слово «default» было в нижнем регистре.
Применение патчей из для восстановления базовой функциональности Informix. Мы полагаемся на тестирование конечных пользователей, чтобы убедиться, что Informix в той или иной степени работает.
References: #1904
Документация была реорганизована таким образом, что раздел «API Reference» исчез - все подстрочники из него, которые касались публичного API, перенесены в контекст основного раздела, который о нем рассказывает. Основная документация разделена на разделы «SQLAlchemy Core» и «SQLAlchemy ORM», разделена документация по мапперам/отношениям. Многие разделы переписаны и/или реорганизованы.
0.6.3¶
Released: Thu Jul 15 2010orm¶
Устранена ошибочная нагрузка many-to-many в unitofwork, которая излишне срабатывала на просроченные/невыгруженные коллекции. Теперь такая нагрузка происходит только в том случае, если значение passive_updates равно False и первичный ключ родителя изменился, или если значение passive_deletes равно False и произошло удаление родителя.
References: #1845
Сущности-колонки (например, query(Foo.id)) копируют свое состояние более полно, когда запросы производятся от них самих + selectable (например, from_self(), union() и т.д.), так что join() и подобные им имеют правильное состояние для работы.
References: #1853
Исправлена ошибка, при которой Query.join() при запросе неорм. столбца и присоединении без предложения on, когда предложение FROM уже присутствует, выдавал проверенное исключение, как и в случае отсутствия предложения.
References: #1853
Улучшена проверка на наличие «несопоставленного класса», включая случай, когда суперкласс сопоставлен, а подкласс - нет. Теперь любые попытки обращения к cls._sa_class_manager.mapper вызывают ошибку UnmappedClassError().
References: #1142
Добавлен аксессор «column_descriptions» к запросу Query, возвращающий список словарей, содержащих информацию об именовании/типировании сущностей, которые будет возвращать запрос. Может быть полезен для создания графических интерфейсов поверх ORM-запросов.
mysql¶
Метод _extract_error_code() теперь корректно работает с каждым из диалектов MySQL (MySQL-python, OurSQL, MySQL-Connector-Python, PyODBC). Ранее логика переподключения давала сбой при OperationalError, но поскольку MySQLdb и OurSQL имеют собственную функцию переподключения, то никаких симптомов для этих драйверов здесь не было, если только не смотреть логи.
References: #1848
oracle¶
Внесены изменения в обработку десятичных дробей в cx_oracle. «Неоднозначные» числа без десятичного знака принудительно приводятся к int на уровне обработчика соединения. Преимущество заключается в том, что int возвращаются как ints без участия объектов типа SQLA и без ненужного преобразования в Decimal.
К сожалению, в некоторых экзотических случаях подзапросов отдельные строки результатов могут иметь разные типы, поэтому обработчик Numeric, получив команду возвращать Decimal, не может в полной мере воспользоваться преимуществами «родного десятичного» режима и должен выполнять функцию isinstance() для каждого значения, чтобы проверить, не является ли оно уже Decimal. Повторное открытие
References: #1840
0.6.2¶
Released: Tue Jul 06 2010orm¶
Query.join() будет проверять вызов формы query.join(target, clause_expression), т.е. отсутствие кортежа, и выдавать информативное сообщение об ошибке, что это неправильная форма вызова.
Исправлена ошибка, связанная с флешами для двунаправленных двунаправленных отношений «многие-ко-многим», когда два объекта, взаимно ссылающиеся друг на друга в одном флеше, не могли вставить строку для обеих сторон. Регрессия по сравнению с 0.5.
References: #1824
функция post_update функции relationship() была переработана архитектурно для более тесной интеграции с новым модулем работы 0.6. Мотивация изменения заключается в том, что несколько вызовов «post update», каждый из которых затрагивает различные столбцы внешних ключей одной строки, выполняются в одном операторе UPDATE, а не в одном операторе UPDATE для каждого столбца в строке. Обновление нескольких строк также разбивается на несколько исполняемых()операторов, при этом сохраняется последовательное упорядочивание строк.
Query.statement, Query.subquery() и т.д. теперь передают в результирующее SQL-выражение значения связывающих параметров, т.е. тех, которые указаны в query.params(). Ранее значения не передавались, и связывающие параметры выводились как None.
Subquery-eager-loading теперь работает с объектами Query, включающими params(), а также с запросами get().
Теперь можно вызывать make_transient() для экземпляра, на который ссылаются родительские объекты по схеме many-to-one, при этом значение внешнего ключа родительского объекта не будет временно установлено в None - это было связано с обработчиком флеша «detect primary key switch». Теперь он игнорирует объекты, которые больше не находятся в состоянии «persistent», а идентификатор внешнего ключа родительского объекта остается незатронутым.
query.order_by() теперь принимает значение False, которое отменяет все существующие состояния order_by() в запросе, позволяя вызывать последующие генеративные методы, не поддерживающие ORDER BY. Это не то же самое, что уже существующая возможность передачи None, которая подавляет все существующие настройки order_by(), включая настроенные на mapper. False будет выглядеть так, как будто функция order_by() никогда не вызывалась, в то время как None является активной настройкой.
Экземпляр, переведенный в состояние «переходный», имеющий неполный или отсутствующий набор атрибутов первичного ключа и содержащий атрибуты с истекшим сроком действия, при обращении к атрибуту с истекшим сроком действия будет выдавать ошибку InvalidRequestError, вместо того чтобы получить переполнение рекурсии.
Функция make_transient() теперь присутствует в создаваемой документации.
make_transient() удаляет все «загрузчики» callables из состояния, которое делается переходным, удаляя любое «просроченное» состояние - все незагруженные атрибуты возвращаются в состояние undefined, None/empty при доступе.
sql¶
Предупреждение, выдаваемое типами Unicode и String с convert_unicode=True, больше не включает в себя переданное значение. Это сделано для того, чтобы реестр предупреждений Python не увеличивался в размерах, предупреждение выдавалось один раз в соответствии с настройками фильтра предупреждений, а большие строковые значения не загрязняли вывод.
References: #1822
Исправлена ошибка, из-за которой компиляция переопределенных выражений не работала для «аннотированных» элементов выражений, которые часто генерируются ORM.
Аргумент «ESCAPE» оператора LIKE или подобного ему передается через render_literal_value(), который может реализовать экранирование обратных слэшей.
References: #1400
Исправлена ошибка в типе Enum, сбивавшая флаг native_enum при использовании TypeDecorators или других сценариев адаптации.
Инспектор проверяет bind.connect() при вызове, чтобы убедиться, что инициализация была вызвана. Внутреннее имя «.conn» меняется на «.bind», так как это именно оно и есть.
Изменена внутренняя часть «column annotation» таким образом, что пользовательский подкласс Column может безопасно переопределить _constructor для возврата Column, для целей создания «конфигурационных» классов колонок, которые не участвуют в проксировании и т.д.
Column.copy() принимает атрибут «unique» среди прочих, исправления, касающиеся декларативных миксинов
References: #1829
postgresql¶
Переопределена функция render_literal_value(), которая экранирует обратные слэши, в настоящее время она применяется для выражения ESCAPE в выражениях типа LIKE и подобных. В конечном счете, для полноценного поведения это должно определять значение «standard_conforming_strings».
References: #1400
Не генерируются команды «CREATE TYPE» / «DROP TYPE» при использовании types.Enum на PG версии до 8.3 - флаг supports_native_enum полностью соблюдается.
References: #1836
mysql¶
Диалект MySQL не выдает CAST() для обнаруженных версий MySQL < 4.0.2. Это позволяет выполнить проверку юникода при подключении.
References: #1826
Диалект MySQL теперь определяет sql-режим NO_BACKSLASH_ESCAPES, в дополнение к ANSI_QUOTES.
Переопределена функция render_literal_value(), которая экранирует обратные косые черты, в настоящее время это относится к предложению ESCAPE в выражениях LIKE и подобных. Такое поведение обусловлено определением значения NO_BACKSLASH_ESCAPES.
References: #1400
mssql¶
Если server_version_info находится вне обычного диапазона (8, ), (9, ), (10, ), то выдается предупреждение, в котором предлагается проверить, что в конфигурации FreeTDS используется версия 7.0 или 8.0, а не 4.2.
References: #1825
oracle¶
Исправлены флаги совместимости ora-8, благодаря чему они не кэшируют устаревшие значения, полученные до первого подключения к базе данных.
References: #1819
Метаданные Oracle «native decimal» начинают возвращать неоднозначную информацию о типе числовых значений, когда столбцы встраиваются в подзапросы, а также когда ROWNUM используется вместе с подзапросами, как это происходит в случае limit/offset. Мы добавили эти неоднозначные условия в обработчик cx_oracle «convert to Decimal()», чтобы в большем числе случаев получать числовые значения в десятичном виде, а не в виде плавающих чисел. Затем, по запросу, они преобразуются в Integer или Float, либо сохраняются в виде Decimal без потерь.
References: #1840
misc¶
Исправлена некорректная подпись в do_execute(), ошибка, появившаяся в 0.6.1.
References: #1823
В диалекте Firebird добавлены типы CHAR, VARCHAR, принимающие флаг «charset», для поддержки условия Firebird «CHARACTER SET».
References: #1813
Добавлена поддержка @classproperty для предоставления любой конструкции схемы/отображения из декларативного миксина, включая колонки с внешними ключами, отношения, column_property, отложенные. Это решает все подобные проблемы с декларативными миксинами. Если в миксине указан какой-либо подкласс MapperProperty без использования @classproperty, то будет выдана ошибка.
Теперь класс mixin может определить колонку, которая совпадает с колонкой, присутствующей в __table__, определенной в подклассе. Однако он не может определить столбец, который не присутствует в __таблице__, и сообщение об ошибке, приведенное здесь, работает.
References: #1821
Компилятор «по умолчанию» автоматически копируется при переопределении компиляции встроенной конструкции клаузы, поэтому не возникает KeyError, если пользовательский компилятор предназначен для определенных бэкендов, а вызывается компиляция для другого бэкенда.
References: #1838
Добавлена документация по инспектору.
References: #1820
Исправлены декораторы @memoized_property и @memoized_instancemethod, чтобы документация Sphinx воспринимала эти атрибуты и методы, например ResultProxy.inserted_primary_key.
References: #1830
0.6.1¶
Released: Mon May 31 2010orm¶
Исправлена ошибка, появившаяся в 0.6.0, связанная с некорректным учетом истории для мутабельных атрибутов.
References: #1782
Исправлена ошибка, внесенная в рефактор 0.6.0, которая нарушала работу обновлений для двунаправленных relationship() с post_update=True.
References: #1807
session.merge() не приведет к истечению срока действия атрибутов на возвращаемом экземпляре, если этот экземпляр находится в состоянии «pending».
References: #1789
исправлен метод __setstate__ в CollectionAdapter для предотвращения сбоя при десериализации, когда родительский InstanceState еще не десериализован.
References: #1802
Добавлено внутреннее предупреждение на случай, если экземпляр без полного PK окажется просроченным, а затем ему будет предложено обновиться.
References: #1797
Добавлено более агрессивное кэширование при использовании маппером выражений UPDATE, INSERT и DELETE. При условии, что в операторе нет объектных SQL-выражений, объекты выражений кэшируются мэппером после первого создания, а их скомпилированная форма хранится в кэш-словаре в течение всего времени работы связанного Engine. Кэш представляет собой LRUCache на тот редкий случай, когда картограф получает в качестве UPDATE чрезвычайно большое количество различных шаблонов столбцов.
sql¶
Теперь expr.in_() принимает в качестве аргумента конструкцию text(). Группировочные скобки добавляются автоматически, т.е. использование выглядит как col.in_(text(«select id from table»)).
References: #1793
Колонки типа _Binary (т.е. LargeBinary, BLOB и т.д.) будут когерентно преобразовывать «базовую строку» в правой части также в _Binary, чтобы происходила необходимая обработка DBAPI.
Добавлена функция table.add_is_dependent_on(othertable), позволяющая вручную размещать правила зависимости между двумя объектами Table для использования в create_all(), drop_all(), sorted_tables.
References: #1801
Исправлена ошибка, не позволявшая корректно работать неявному RETURNING с составным первичным ключом, содержащим нули.
References: #1778
Исправлен ошибочный символ пробела при генерации ADD CONSTRAINT для именованного ограничения UNIQUE.
Исправлен аргумент «table» в конструкторе ForeignKeyConstraint
References: #1571
Исправлена ошибка в обертке курсора пула соединений, из-за которой, если курсор выбрасывал исключение при закрытии(), протоколирование сообщения не выполнялось.
References: #1786
метод _make_proxy() для ColumnClause и Column теперь использует self.__class__ для определения класса возвращаемого объекта вместо жесткого кодирования в ColumnClause/Column, что несколько упрощает создание специфических подклассов этих объектов, работающих в ситуациях псевдонимов/подзапросов.
func.XXX() не приводит к случайному разрешению в классы, не являющиеся функциями (например, исправляет func.text()).
References: #1798
mysql¶
func.sysdate() выдает на MySQL «SYSDATE()», т.е. с завершающей скобкой.
References: #1794
sqlite¶
Исправлена конкатенация ограничений, когда ограничение «PRIMARY KEY» переносится на уровень столбца из-за того, что ключевое слово SQLite AUTOINCREMENT выводится на экран.
References: #1812
oracle¶
Добавлена проверка на наличие версий cx_oracle ниже версии 5, в этом случае несовместимый «обработчик типов вывода» не будет использоваться. Это повлияет на точность десятичных вычислений и некоторые проблемы работы с юникодом.
References: #1775
Исправлен режим use_ansi=False, который практически во всех случаях приводил к неработающим формулам WHERE.
References: #1790
Восстановлена поддержка Oracle 8 с помощью cx_oracle, в том числе автоматически устанавливается значение use_ansi в False, NVARCHAR2 и NCLOB не приводятся к Unicode, проверка «native unicode» не проходит, режим cx_oracle «native unicode» отключен, VARCHAR() выдается с подсчетом байтов вместо подсчета символов.
References: #1808
oracle_xe 5 не принимает объект Python unicode в строке подключения в обычном режиме Python 2.x - поэтому мы коэрцитивно обращаемся к str() напрямую. Неаскриптивные символы здесь не поддерживаются в строках подключения, поскольку мы не знаем, какую кодировку мы могли бы использовать.
References: #1670
FOR UPDATE выдается в синтаксически правильной позиции, когда используется ограничение/смещение, т.е. в подзапросе ROWNUM. Однако Oracle не умеет работать с FOR UPDATE с ORDER BY или с подзапросами, поэтому он все еще не очень удобен, но, по крайней мере, SQLA пропускает SQL через парсер Oracle.
References: #1815
misc¶
Исправлена сборка расширений на языке C на Python 2.4.
References: #1781
Классы пулов будут повторно использовать один и тот же параметр «имя_пула_логирования» после выполнения функции dispose().
Движок приобретает аргумент «execution_options» и метод update_execution_options(), который будет применяться ко всем соединениям, генерируемым этим движком.
Добавлена метка в запрос, используемый в has_table() и has_sequence(), для работы со старыми версиями Firebird, в которых не предусмотрены метки для столбцов результатов.
References: #1521
Добавлено целочисленное принуждение к атрибуту «type_conv» при передаче через строку запроса, чтобы он правильно интерпретировался Kinterbasdb.
References: #1779
В список строк исключений, указывающих на разрыв соединения, добавлена строка „connection shutdown“.
References: #1646
Конструктор SqlSoup принимает аргумент base, который определяет базовый класс, используемый для сопоставленных классов, по умолчанию это object.
References: #1783
0.6.0¶
Released: Sun Apr 18 2010orm¶
Переработана внутренняя структура блоков работы. Блоки работы с большим количеством взаимозависимых объектов теперь могут быть выгружены без рекурсивных переполнений, так как больше нет зависимости от рекурсивных вызовов. Количество внутренних структур теперь остается постоянным для конкретного состояния сессии, независимо от того, сколько связей присутствует в отображениях. Поток событий теперь соответствует линейному списку шагов, сформированному отображателями и отношениями на основе реально выполняемой работы и отфильтрованному через единую топологическую сортировку для правильного упорядочивания. Для сборки действий по промывке используется гораздо меньшее количество шагов и меньше памяти.
Наряду с переписыванием UOW, это также устраняет проблему, появившуюся в 0.6beta3, связанную с определением топологических циклов для единиц работы с длинными циклами зависимостей. Теперь мы используем алгоритм, написанный Гвидо (спасибо Гвидо!).
Отношения «один-ко-многим» теперь сохраняют список положительных ассоциаций «родитель-ребенок» внутри флеша, не позволяя предыдущим родителям, помеченным как удаленные, каскадировать набор внешних ключей delete или NULL на эти дочерние объекты, несмотря на то, что конечный пользователь не удалил ребенка из старой ассоциации.
References: #1764
Ленивая загрузка коллекции отключает стандартную eagerloading на обратной стороне many-to-one, поскольку такая загрузка по определению не нужна.
References: #1495
Теперь функция Session.refresh() сначала выполняет эквивалентную функцию expire() для данного экземпляра, чтобы каскад «refresh-expire» распространялся. Ранее функция refresh() никак не зависела от наличия каскада «refresh-expire». Это изменение в поведении по сравнению с 0.6beta2, где флаг «lockmode», переданный в refresh(), приводил к проверке версии. Поскольку сначала истекает срок действия экземпляра, refresh() всегда обновляет объект до самой последней версии.
Каскад „refresh-expire“, достигнув объекта, находящегося в состоянии ожидания, удалит его, если каскад также включает «delete-orphan», или просто отсоединит его в противном случае.
References: #1754
id(obj) больше не используется внутри файла topological.py, так как функции сортировки теперь требуют только хэшируемые объекты.
References: #1756
По умолчанию ORM устанавливает в качестве docstring всех генерируемых дескрипторов значение None. Это можно переопределить с помощью команды „doc“ (или, если используется Sphinx, атрибутные docstrings тоже работают).
Добавлен аргумент kw „doc“ во все вызываемые свойства mapper, а также в Column(). Строка „doc“ будет собираться как атрибут „__doc__“ в дескрипторе.
Использование version_id_col на бэкенде, поддерживающем cursor.rowcount для execute(), но не executemany(), теперь работает при удалении (уже работало для сохранений, так как они не используют executemany()). Для бэкенда, который вообще не поддерживает cursor.rowcount, выдается предупреждение, как и в случае с сохранениями.
References: #1761
ORM теперь кратковременно кэширует «скомпилированную» форму конструкций insert() и update() при промывке списков объектов одного класса, что позволяет избежать избыточной компиляции для каждого отдельного INSERT/UPDATE в рамках отдельного вызова flush().
Внутренние методы getattr(), setattr(), getcommitted() для ColumnProperty, CompositeProperty, RelationshipProperty были подчеркнуты (т.е. являются приватными), изменилась сигнатура.
examples¶
Обновлен пример attribute_shard.py для использования более надежного метода поиска в запросе бинарных выражений, которые сравнивают столбцы с литеральными значениями.
sql¶
Восстановлена некоторая логика связывания меток из 0.5, благодаря которой таблицы с именами столбцов, перекрывающими другой столбец вида «<tablename>_<columnname>», не будут выдавать ошибок, если при UPDATE в качестве имени связывания используется column._label. Добавлено тестовое покрытие, отсутствовавшее в 0.5.
References: #1755
somejoin.select(fold_equivalents=True) больше не является устаревшей и со временем будет включена в более полную версию функции for.
References: #1729
тип Numeric выдает огромное предупреждение, когда ожидается преобразование float в Decimal из DBAPI, возвращающего float. К ним относятся SQLite, Sybase, MS-SQL.
References: #1759
Исправлена ошибка в типизации выражений, приводившая к бесконечному циклу для выражений с двумя типами NULL.
Исправлена ошибка в функции execution_options(), из-за которой существующая информация о транзакциях и других состояниях из родительского соединения не распространялась на подсоединение.
Добавлена новая опция выполнения „compiled_cache“. Словарь, в котором будут кэшироваться компилируемые объекты, когда Connection компилирует выражение клаузы в компилируемый объект, специфичный для диалекта и параметров. Пользователь обязан управлять размером этого словаря, который будет иметь ключи, соответствующие диалекту, элементу клаузы, именам столбцов в клаузе VALUES или SET в INSERT или UPDATE, а также «пакетному» режиму для оператора INSERT или UPDATE.
В reflection.Inspector добавлена функция get_pk_constraint(), аналогичная функции get_primary_keys(), но возвращающая dict, включающий имя ограничения, для поддерживаемых бэкендов (на данный момент PG).
References: #1769
Table.create() и Table.drop() больше не применяют события создания/отмены на уровне метаданных.
References: #1771
postgresql¶
Теперь PostgreSQL корректно отражает имена последовательностей, связанных с колонками SERIAL, после того, как имя последовательности было изменено. За исправление спасибо Кумару Макмиллану.
References: #1071
Исправлен недостаток импорта в типе psycopg2._PGNumeric при получении неизвестного числа.
Диалекты psycopg2/pg8000 теперь знают о типах возврата REAL[], FLOAT[], DOUBLE_PRECISION[], NUMERIC[], не вызывая исключения.
PostgreSQL отражает имя ограничений первичного ключа, если таковой существует.
References: #1769
oracle¶
Теперь мы используем конвертеры вывода cx_oracle, чтобы DBAPI возвращал нативно те значения, которые мы предпочитаем:
Значения типа NUMBER с положительной точностью + масштаб преобразуются в cx_oracle.STRING, а затем в Decimal. Это позволяет добиться идеальной точности для типа Numeric при использовании cx_oracle.
References: #1759
STRING/FIXED_CHAR теперь конвертируются в юникод нативно. При этом к типам String в SQLAlchemy не нужно применять никаких преобразований.
misc¶
Расширение C теперь работает и с DBAPI, использующими в качестве строк пользовательские последовательности (а не только кортежи).
References: #1757
расширение компилятора теперь позволяет использовать @compiles декораторы на базовых классах, которые распространяются на дочерние классы, @compiles декораторы на дочерних классах, которые не нарушены @compiles декоратором на базовом классе.
Declarative выдаст информационное сообщение об ошибке, если в строковых аргументах relationship() будет содержаться ссылка на не сопоставленный атрибут класса.
Переработана логика работы с «миксинами» в декларативном режиме, чтобы дополнительно разрешить __mapper_args__ в качестве @classproperty для миксина, например, для динамического назначения polymorphic_identity.
Функциональность result.rowcount может быть отключена для каждого конкретного двигателя путем установки „enable_rowcount=False“ в create_engine(). Обычно cursor.rowcount вызывается после любого оператора UPDATE или DELETE, поскольку курсор закрывается, а Firebird требует открытого курсора, чтобы получить счетчик строк. Однако этот вызов несколько дороговат, поэтому его можно отключить. Для повторного включения на основе каждого выполнения можно использовать опцию выполнения „enable_rowcount=True“.
0.6beta3¶
Released: Sun Mar 28 2010orm¶
Основные возможности: В relationship() добавлена новая возможность загрузки «подзапросов». Это опция ускоренной загрузки, которая генерирует второй SELECT для каждой коллекции, представленной в запросе, по всем родителям сразу. Запрос перевыпускает исходный запрос конечного пользователя, обернутый в подзапрос, применяет присоединения к целевой коллекции и загружает все эти коллекции полностью в одном результате, аналогично «объединенной» загрузке, но с использованием всех внутренних присоединений и без повторной выборки полных родительских строк (как это делают большинство DBAPI, даже если столбцы пропускаются). Загрузка подзапросов доступна на уровне конфигурации маппера с помощью «lazy=“subquery“» и на уровне опций запроса с помощью «subqueryload(props…)», «subqueryload_all(props…)».
References: #1675
Чтобы учесть тот факт, что теперь существует два вида ускоренной загрузки, новые названия для eagerload() и eagerload_all() - joinedload() и joinedload_all(). Старые названия в обозримом будущем останутся синонимами.
Флаг «lazy» в функции relationship() теперь принимает строковый аргумент для всех видов загрузки: «select», «joined», «subquery», «noload» и «dynamic», где по умолчанию теперь стоит «select». Прежние значения True/ False/None сохраняют свои обычные значения и в обозримом будущем останутся синонимами.
В конструкцию Query() добавлен метод with_hint(). Он вызывает непосредственно select().with_hint() и также принимает сущности, а также таблицы и псевдонимы. См. пункт with_hint() в разделе SQL ниже.
References: #921
Исправлена ошибка в Query, при которой вызов q.join(prop).from_self(…).join(prop) при соединении по тому же критерию, что и внутри, не приводил к появлению второго соединения вне подзапроса.
Исправлена ошибка в Query, при которой использование конструкций aliased() приводило к ошибке, если внутри подзапроса, сгенерированного q.from_self() или q.select_from(), ссылалась базовая таблица (но не фактический псевдоним).
Исправлена ошибка, которая затрагивала все опции eagerload() и подобные им, из-за которой «удаленные» ускоренные загрузки, т.е. загрузки после ленивой загрузки, например query(A).options(eagerload(A.b, B.c)), ничего не загружали, а использование eagerload(«b.c») работало нормально.
В запросе появился метод add_columns(*columns), который является мультиверсией add_column(col). add_column(col) в будущем будет устаревшим.
Query.join() определит, будет ли конечным результатом «FROM A JOIN A», и в этом случае выдаст ошибку.
Query.join(Cls.propname, from_joinpoint=True) будет более тщательно проверять совместимость «Cls» с текущей точкой соединения и в этом отношении будет действовать так же, как Query.join(«propname», from_joinpoint=True).
sql¶
В конструкцию select() добавлен метод with_hint(). Укажите таблицу/алиас, текст подсказки и необязательное имя диалекта, и «подсказки» будут выведены в соответствующее место в операторе. Работает для Oracle, Sybase, MySQL.
References: #921
Исправлена ошибка, появившаяся в 0.6beta2, когда метки колонок отображались внутри выражений колонок, которым уже присвоена метка.
References: #1747
postgresql¶
Диалект psycopg2 будет регистрировать сообщения NOTICE через имя логгера «sqlalchemy.dialects.postgresql».
References: #877
типы TIME и TIMESTAMP теперь доступны непосредственно из диалекта postgresql, который добавляет специфичный для PG аргумент „precision“ к обоим типам. „precision“ и „timezone“ корректно отражаются для типов TIME и TIMEZONE.
References: #997
mysql¶
При отражении больше не возникает предположения, что TINYINT(1) должен быть BOOLEAN - возвращается TINYINT(1). Используйте Boolean/ BOOLEAN в определении таблицы, чтобы получить поведение преобразования булевых значений.
References: #1752
oracle¶
Диалект Oracle будет выдавать определения типа VARCHAR с использованием количества символов, т.е. VARCHAR2(50 CHAR), так что размер столбца будет определяться в символах, а не в байтах. При отражении столбцов символьных типов также будет использоваться ALL_TAB_COLUMNS.CHAR_LENGTH вместо ALL_TAB_COLUMNS.DATA_LENGTH. Оба эти поведения применяются, если версия сервера 9 или выше - для 8-й версии используется старое поведение.
References: #1744
misc¶
Использование миксина не приведет к поломке, если миксин реализует непредсказуемый __getattribute__(), т.е. интерфейсы Zope.
References: #1746
Использование @classdecorator и т.п. в миксинах для определения __tablename__, __table_args__ и т.п. теперь работает, если метод ссылается на атрибуты конечного подкласса.
References: #1749
отношения и столбцы с внешними ключами не допускаются в декларативных миксинах, извините.
References: #1751
Модуль sqlalchemy.orm.shard теперь стал расширением, sqlalchemy.ext.horizontal_shard. Старый импорт работает с предупреждением об устаревании.
0.6beta2¶
Released: Sat Mar 20 2010orm¶
Официальное название функции relation() теперь relationship(), чтобы исключить путаницу с термином реляционной алгебры. Однако в обозримом будущем функция relation() останется доступной в том же качестве.
References: #1740
В Mapper добавлен аргумент «version_id_generator», представляющий собой вызываемую переменную, которая, учитывая текущее значение «version_id_col», возвращает номер следующей версии. Может использоваться для альтернативных схем версионирования, таких как uuid, временные метки.
References: #1692
добавлен kw-аргумент «lockmode» в Session.refresh(), который будет передавать строковое значение в Query так же, как и в with_lockmode(), также будет выполняться проверка версии для связки с поддержкой version_id_col.
Исправлена ошибка, при которой вызов query(A).join(A.bs).add_entity(B) в сценарии объединенного наследования приводил к двойному добавлению B в качестве цели и выдавал некорректный запрос.
References: #1188
Исправлена ошибка в функции session.rollback(), которая не удаляла из сессии ранее «ожидающие» объекты перед повторным присоединением «удаленных» объектов, что обычно происходило с естественными первичными ключами. Если между ними возникал конфликт первичных ключей, то присоединение удаленных объектов приводило к внутреннему сбою. Теперь «ожидающие» объекты удаляются первыми.
References: #1674
Убрано большое количество логов, которые на самом деле никого не волнуют, оставшиеся логи реагируют на изменения уровня журнала. Никаких существенных накладных расходов не добавилось.
References: #1719
Исправлена ошибка в session.merge(), которая не позволяла объединять диктоподобные коллекции.
session.merge() работает с отношениями, которые специально не включают «merge» в опции каскада - цель полностью игнорируется.
session.merge() не будет уничтожать существующие скалярные атрибуты на существующей цели, если цель имеет значение для этого атрибута, даже если входящий слитый атрибут не имеет значения для этого атрибута. Это позволяет избежать лишней нагрузки на существующие элементы. При этом атрибут все равно будет помечен как истекший, если у цели не будет этого атрибута, что соответствует некоторым контрактам отложенных cols.
References: #1681
Флаг «allow_null_pks» теперь называется «allow_partial_pks», по умолчанию имеет значение True, действует так же, как и в 0.5. За исключением того, что он также реализован в функции merge() таким образом, что SELECT не будет выдан для входящего экземпляра с частично NULL первичным ключом, если флаг равен False.
References: #1680
В 0.6 исправлена ошибка, связанная с оптимизацией «многие-к-одному», в результате которой при изменении «многие-к-одному» по столбцу с непервичным ключом в удаленной таблице (т.е. по внешнему ключу по столбцу UNIQUE) из базы данных будет извлекаться «старое» значение, поскольку если оно находится в сессии, то оно необходимо для правильного учета истории/обратных ссылок, а мы не можем извлекать его из локальной карты идентификации по столбцу с непервичным ключом.
References: #1737
исправлена внутренняя ошибка, возникавшая при вызове has() или аналогичного сложного выражения для однотабличного отношения наследования().
References: #1731
query.one() больше не применяет LIMIT к запросу, что позволяет обеспечить полный подсчет всех идентификаторов объектов, присутствующих в результате, даже в случае, когда объединение может скрывать несколько идентификаторов для двух или более строк. В качестве бонуса, one() теперь можно вызывать и в запросе, в котором для начала была выполнена функция from_statement(), поскольку она больше не модифицирует запрос.
References: #1688
query.get() теперь возвращает None, если запрашивается идентификатор, который присутствует в карте идентификации с классом, отличным от запрашиваемого, т.е. при использовании полиморфной загрузки.
References: #1727
Существенное исправление в query.join(), когда предложение «on» является атрибутом конструкции aliased(), но уже есть существующее соединение, выполненное к совместимой цели, запрос корректно присоединяется к правой конструкции aliased(), а не приклеивается к правой стороне существующего соединения.
References: #1706
Небольшое улучшение исправления, позволяющее не выдавать ненужные обновления столбца первичного ключа при так называемой операции «переключения строки», т.е. добавления + удаления двух объектов с одним и тем же PK.
References: #1362
Теперь sqlalchemy.orm.exc.DetachedInstanceError используется, когда загрузка или обновление атрибутов не удается из-за того, что объект отсоединен от какой-либо сессии. UnboundExecutionError характерен для движков, привязанных к сессиям и операторам.
Запрос, вызванный в контексте выражения, во всех случаях будет отображать недвусмысленные метки. Обратите внимание, что это не относится к существующим аксессорам/методам .statement и .subquery(), которые по-прежнему используют настройку .with_labels(), имеющую значение по умолчанию False.
Query.union() сохраняет недвусмысленные метки внутри возвращаемого оператора, что позволяет избежать различных ошибок SQL-композиции, которые могут возникнуть из-за конфликтов имен столбцов.
References: #1676
Исправлена ошибка в истории атрибутов, которая непроизвольно вызывала __eq__ на сопоставленных экземплярах.
Некоторая внутренняя оптимизация загрузки объектов дает небольшое ускорение для больших результатов, по оценкам около 10-15%. Проведена серьезная чистка внутренней части «состояния» с уменьшением сложности, уменьшением количества членов данных, вызовов методов, создания пустых словарей.
Уточнение документации для query.delete()
References: #1689
Исправлена ошибка каскадирования в функции many-to-one relation() при установке атрибута в None, появившаяся в r6711 (каскадирование удаленных элементов в сессию при выполнении функции add()).
Вызов query.order_by() или query.distinct() перед вызовом query.select_from(), query.with_polymorphic() или query.from_statement() теперь вызывает исключение, вместо того чтобы молча отбрасывать эти критерии.
References: #1736
query.scalar() теперь вызывает исключение, если возвращается более одной строки. Все остальное поведение остается прежним.
References: #1735
Исправлена ошибка, из-за которой логика «переключения строк», т.е. INSERT и DELETE, замененные UPDATE, при использовании version_id_col не работала.
References: #1692
examples¶
Немного изменили пример кэша beaker, добавив отдельную опцию RelationCache для кэширования lazyload. Этот объект выполняет поиск среди любого количества потенциальных атрибутов более эффективно, группируя их в общую структуру. И FromCache, и RelationCache по отдельности проще.
sql¶
join() теперь по умолчанию будет имитировать NATURAL JOIN. То есть, если левая сторона является join, то сначала будет сделана попытка присоединить правую сторону к крайней правой стороне левой, и в случае успеха не будет вызывать никаких исключений о неоднозначных условиях присоединения, даже если есть другие цели присоединения в оставшейся части левой стороны.
References: #1714
Наиболее распространенные функции преобразования результирующих процессоров были перенесены в новый модуль «Процессоры». Авторам диалектов предлагается использовать эти функции в тех случаях, когда они соответствуют их потребностям, а не реализовывать собственные.
SchemaType и подклассы Boolean, Enum теперь сериализуемы, включая их ddl-слушатель и другие вызываемые события.
Некоторые платформы теперь интерпретируют некоторые литеральные значения как несвязывающие параметры, которые дословно отображаются в операторе SQL. Это сделано для поддержки строгих правил SQL-92, которые соблюдаются некоторыми платформами, включая MS-SQL и Sybase. В этой модели связывающие параметры не допускаются в предложении columns оператора SELECT, равно как и некоторые двусмысленные выражения типа «?=?». При включении этого режима компилятор базы будет отображать связки как встроенные литералы, но только для строк и числовых значений. Другие типы, такие как даты, вызовут ошибку, если только подкласс диалекта не определит для них функцию рендеринга литералов. Параметр bind должен уже иметь встроенное литеральное значение, иначе будет выдана ошибка (т.е. не будет работать прямой bindparam(„x“)). Диалекты также могут расширять области, в которых привязки не принимаются, например, в списках аргументов функций (которые не работают на MS-SQL, когда используется привязка к родному SQL).
Добавлен параметр «unicode_errors» к функциям String, Unicode и др. Ведет себя как аргумент ключевого слова „errors“ для функций string.decode() стандартной библиотеки. Этот флаг требует, чтобы параметр convert_unicode был установлен в значение «force» - в противном случае SQLAlchemy не гарантированно справится с задачей преобразования юникода. Заметим, что этот флаг значительно увеличивает производительность операций выборки строк для бэкендов, которые уже возвращают объекты в юникоде (что делает большинство DBAPI). Этот флаг следует использовать только в крайнем случае для чтения строк из колонок с измененными или поврежденными кодировками, что применимо только к базам данных, которые изначально принимают неверные кодировки (т.е. MySQL. не PG, Sqlite и т.д.).
Добавлена поддержка оператора отрицания в математике, -x.
Подклассы FunctionElement теперь исполняются напрямую, как и любая конструкция func.foo(), с автоматическим применением SELECT при передаче в execute().
Аргументы «type» и «bind» ключевого слова конструкции func.foo() теперь локальны для конструкций «func.» и не являются частью базового класса FunctionElement, что позволяет обрабатывать «type» в пользовательском конструкторе или переменной уровня класса.
В ResultProxy восстановлен метод keys().
Система тип/выражение теперь выполняет более полную работу по определению возвращаемого типа из выражения, а также по адаптации оператора Python в оператор SQL, основываясь на полном левом/правом/операторе данного выражения. В частности, система дата/время/интервал, созданная для PostgreSQL EXTRACT in, теперь обобщена на систему типов. Прежнее поведение, когда выражение «столбец + литерал» заставляло тип «литерала» совпадать с типом «столбца», теперь обычно не встречается - тип «литерала» сначала выводится из Python-типа литерала, предполагая стандартные собственные Python-типы + типы даты, а затем возвращается к типу известного типа на другой стороне выражения. Если «обратный» тип совместим (например, CHAR из String), то со стороны литерала будет использоваться именно он. Типы TypeDecorator переопределяют это по умолчанию для безусловного принуждения «буквальной» стороны, что может быть изменено реализацией метода coerce_compared_value(). Также входит в состав.
Сделали sqlalchemy.sql.expressions.Executable частью публичного API, используемого для любой конструкции выражения, которая может быть отправлена в execute(). FunctionElement теперь наследует Executable, чтобы получить execution_options(), которые также распространяются на select(), генерируемый в execute(). Executable, в свою очередь, является подклассом _Generative, который помечает любой ClauseElement, поддерживающий декоратор @_generative - в какой-то момент они также могут стать «публичными» в интересах расширения компилятора.
Изменение решения для - заданное конечным пользователем имя параметра привязки, которое напрямую конфликтует с привязкой с именем столбца, сгенерированной непосредственно из предложения SET или VALUES в обновлении/вставке, приводит к ошибке компиляции. Это уменьшает количество вызовов и устраняет некоторые случаи, когда нежелательные конфликты имен все же могут возникнуть.
References: #1579
Column() требует указания типа, если у него нет внешних ключей (это не ново). Теперь, если у Column() нет типа и внешних ключей, выдается ошибка.
References: #1705
Аргумент «scale» типа Numeric() учитывается при преобразовании возвращаемого значения с плавающей точкой в строку на пути к Decimal - это позволяет точно работать с SQLite, MySQL.
References: #1717
метод copy() в Column теперь копирует неинициализированные события «on table attach». Помогает новая декларативная возможность «mixin».
mysql¶
Исправлена ошибка отражения, из-за которой при наличии COLLATE не отражались флаг nullable и значения по умолчанию сервера.
References: #1655
Исправлено отражение «булевых» столбцов TINYINT(1), определенных с целочисленными флагами типа UNSIGNED.
Дополнительные исправления для диалекта mysql-connector.
References: #1668
Составная PK-таблица на InnoDB, в которой столбец «autoincrement» не является первым, будет выдавать явную фразу «KEY» в CREATE TABLE, что позволит избежать ошибок.
References: #1496
Добавлена поддержка отражения/создания таблицы для широкого спектра ключевых слов MySQL.
References: #1634
Исправлена ошибка импорта, которая могла возникать при отражении таблиц на хосте Windows
References: #1580
sqlite¶
В функцию create_engine() добавлен флаг «native_datetime=True». Это приведет к тому, что типы DATE и TIMESTAMP будут пропускать всю обработку параметров привязки и строк результатов, в предположении, что в соединении включен параметр PARSE_DECLTYPES. Обратите внимание, что это не совсем совместимо с «func.current_date()», который будет возвращаться в виде строки.
References: #1685
mssql¶
Восстановлена поддержка диалекта pymssql.
Различные исправления, связанные с неявным возвратом, отражением и т.д. - диалекты MS-SQL еще не полностью завершены в 0.6 (но уже близки к этому)
Добавлена базовая поддержка mxODBC.
References: #1710
Удалена опция text_as_varchar.
oracle¶
Для параметров «out» требуется тип, поддерживаемый cx_oracle. Если тип cx_oracle не найден, то будет выдана ошибка.
Oracle „DATE“ теперь не выполняет никакой обработки результатов, поскольку тип DATE в Oracle хранит полные объекты дата+время, что вы и получите. Обратите внимание, что общий тип types.Date по-прежнему будет вызывать value.date() для входящих значений, однако. При отражении таблицы отражаемый тип будет „DATE“.
Добавлена предварительная поддержка режима WITH_UNICODE для Oracle. По крайней мере, это устанавливает начальную поддержку cx_Oracle в Python 3. При использовании режима WITH_UNICODE в Python 2.xx выдается большое и страшное предупреждение с просьбой серьезно задуматься об использовании этого сложного режима работы.
References: #1670
Метод except_() теперь отображается как MINUS на Oracle, что более или менее эквивалентно на этой платформе.
References: #1712
Добавлена поддержка рендеринга и отражения TIMESTAMP WITH TIME ZONE, т.е. TIMESTAMP(timezone=True).
References: #651
Тип Oracle INTERVAL теперь может быть отражен.
misc¶
Улучшена настройка установки/тестирования на Python 3, теперь Distribute работает на Py3k. В комплект поставки включен файл distribute_setup.py. Инструкции по установке/тестированию на Python 3 см. в README.py3k.
Добавлено дополнительное расширение на языке Си для ускорения работы sql-слоя за счет реализации RowProxy и наиболее распространенных процессоров результатов. Фактическое ускорение будет сильно зависеть от вашего DBAPI и набора типов данных, используемых в таблицах, и может варьироваться от 30% до более чем 200%. Кроме того, он обеспечивает скромное (~15-20%) косвенное повышение скорости работы ORM для больших запросов. Обратите внимание, что по умолчанию он не собран/установлен. Инструкции по установке см. в README.
последовательность выполнения извлекает всю информацию о количестве рядов/последнем вставленном идентификаторе из курсора до вызова commit() на DBAPI-соединении в сценарии «autocommit». Это помогает mxodbc в работе с rowcount и, вероятно, является хорошей идеей в целом.
Немного расширили логирование, чтобы функция isEnabledFor() вызывалась чаще, чтобы изменения уровня лога для движка/пула отражались при следующем подключении. Это добавляет небольшое количество накладных расходов на вызов метода. Оно незначительно и значительно облегчит жизнь в тех случаях, когда логирование настраивается после вызова create_engine().
References: #1719
Флаг assert_unicode является устаревшим. SQLAlchemy будет выдавать предупреждение во всех случаях, когда его просят закодировать неюникодную строку Python, а также когда типу Unicode или UnicodeType явно передается байт-строка. Тип String ничего не даст для DBAPI, которые уже принимают объекты Python в юникоде.
Параметры привязки передаются не в виде списка, а в виде кортежа. Некоторые драйверы бэкендов не принимают параметры привязки в виде списка.
Движок threadlocal не корректно закрывал соединение при close() - исправлено.
Объект транзакции не откатывается и не фиксируется, если он не «активен», что позволяет более точно вложить begin/rollback/commit.
Объекты юникода в Python в качестве биндов приводят к типу Unicode, а не string, что позволяет устранить определенный класс ошибок юникода в драйверах, не поддерживающих бинды юникода.
Добавлен аргумент «logging_name» в конструктор create_engine(), Pool(), а также аргумент «pool_logging_name» в create_engine(), который фильтрует вплоть до имени Pool. Выдает заданное строковое имя в поле «name» сообщений логирования вместо стандартной строки шестнадцатеричного идентификатора.
References: #1555
Метод visit_pool() из Dialect удален и заменен на on_connect(). Этот метод возвращает вызываемую переменную, которая получает необработанное соединение DBAPI после каждого созданного соединения. Если не None, то вызываемый элемент собирается в слушатель пула first_connect/connect по стратегии соединения. Обеспечивает более простой интерфейс для диалектов.
StaticPool теперь инициализируется, утилизируется и пересоздается без открытия нового соединения - соединение открывается только при первом запросе. dispose() теперь работает и для AssertionPool.
References: #1728
Добавлена возможность удаления информации о схеме при использовании «tometadata» путем передачи в качестве аргумента «schema=None». Если schema не указана, то схема таблицы сохраняется.
DeclarativeMeta в качестве источника информации о классе использует исключительно cls.__dict__ (а не dict_), а _as_declarative в качестве источника информации о классе использует исключительно переданный ему dict_ (который при использовании DeclarativeMeta является cls.__dict__). Теоретически это должно облегчить пользовательским метаклассам модификацию состояния, передаваемого в _as_declarative.
declarative теперь принимает классы mixin напрямую, как средство обеспечения общих функциональных и колоночных элементов для всех подклассов, а также как средство распространения фиксированного набора __table_args__ или __mapper_args__ в подклассы. Для пользовательских комбинаций __table_args__/__mapper_args__ от унаследованного миксина к локальному теперь можно использовать дескрипторы. Новые подробности приведены в документации по Declarative. Спасибо Крису Витерсу за то, что он терпел мои пререкания по этому поводу.
References: #1707
Диктант __mapper_args__ копируется при распространении в подкласс и берется прямо из класса __dict__, чтобы избежать распространения от родителя. Наследование маппера уже распространяет то, что нужно, от родительского маппера.
References: #1393
Возникает исключение, когда в подклассе однотабличной таблицы указывается колонка, которая уже присутствует в базовом классе.
References: #1732
Реализован предварительный рабочий диалект для Sybase, с подреализацией для Python-Sybase, а также Pyodbc. Реализована работа с созданием/удалением таблиц и базовая функциональность обхода. Пока не включает отражение или всестороннюю поддержку юникода/специальных выражений/и т.д.
Проведена большая работа по очистке документации, чтобы связать имена классов, функций и методов с документами API.
References: #1700
0.6beta1¶
Released: Wed Feb 03 2010orm¶
- Изменения в query.update() и query.delete():
Опция „expire“ в query.update() была переименована в „fetch“, что соответствует опции query.delete(). Опция „expire“ является устаревшей и выдает предупреждение.
Для стратегий синхронизации query.update() и query.delete() по умолчанию установлено значение „evaluate“.
стратегия „synchronize“ для update() и delete() приводит к ошибке. Неявного возврата на «fetch» не существует. Неудачная оценка основана на структуре критериев, поэтому успех/неудача детерминированы структурой кода.
- Усовершенствования отношений «многие-к-одному»:
Отношения «многие-к-одному» теперь вызывают ленивую загрузку в меньшем количестве случаев, в том числе в большинстве случаев не будут получать «старое» значение при замене его новым.
отношение «многие-к-одному» к подклассу объединенной таблицы теперь использует get() для простой загрузки (известное как условие «use_get»), т.е. Related->Sub(Base), без необходимости переопределять условие primaryjoin в терминах базовой таблицы.
Указание внешнего ключа в декларативном столбце, т.е. ForeignKey(MyRelatedClass.id), не нарушает условия «use_get»
В relation(), eagerload() и eagerload_all() появилась опция «innerjoin». Укажите True или False, чтобы определить, будет ли соединение eager join построено как INNER или OUTER join. По умолчанию, как всегда, используется False. Опции отображателя будут переопределять ту настройку, которая задана в relation(). Обычно это значение следует устанавливать для отношений типа «многие к одному», а не для отношений с нулевым внешним ключом, чтобы повысить производительность соединения.
в поведении ускоренной загрузки, когда основной запрос оборачивается подзапросом при наличии LIMIT/OFFSET, теперь сделано исключение для случая, когда все ускоренные загрузки являются объединениями «многие к одному». В этих случаях нетерпеливые соединения выполняются непосредственно к родительской таблице вместе с ограничением/смещением без дополнительных затрат на подзапрос, поскольку соединение «многие к одному» не добавляет строк к результату.
Улучшения / Изменения в работе функции Session.merge():
Флаг «dont_load=True» в функции Session.merge() устарел и теперь имеет значение «load=False».
Session.merge() оптимизирована по производительности, используя вдвое меньше вызовов для режима «load=False» по сравнению с 0,5 и значительно меньше SQL-запросов в случае коллекций для режима «load=True».
merge() не будет выдавать ненужное объединение атрибутов, если заданный экземпляр является тем же самым экземпляром, который уже присутствует.
merge() теперь объединяет и «опции», связанные с данным состоянием, т.е. те, которые передаются через query.options() и следуют вместе с экземпляром, например, опции нетерпеливой или ленивой загрузки различных атрибутов. Это необходимо для построения высокоинтегрированных схем кэширования. Это незначительное изменение поведения по сравнению с 0.5.
Исправлена ошибка, связанная с сериализацией «пути загрузчика», присутствующего в состоянии экземпляра, что также необходимо при комбинированном использовании функции merge() с сериализованным состоянием и связанными с ним опциями, которые должны быть сохранены.
Новая функция merge() демонстрируется в новом комплексном примере интеграции Beaker с SQLAlchemy. См. примечания в разделе «Примеры» ниже.
Значения первичных ключей теперь можно изменять в объекте наследования объединенных таблиц, при этом ON UPDATE CASCADE будет учитываться при промывке. Установите новый флаг «passive_updates» в значение False в mapper() при использовании SQLite или MySQL/MyISAM.
References: #1362
Функция flush() теперь определяет, когда столбец первичного ключа был обновлен операцией ON UPDATE CASCADE из другого первичного ключа, и может определить местоположение строки для последующего UPDATE по новому значению PK. Это происходит при наличии связи relation() для установления связи, а также при passive_updates=True.
References: #1671
каскад «сохранение-обновление» теперь будет каскадировать ожидающие удаленные значения из скалярного атрибута или атрибута коллекции в новую сессию во время операции add(). Таким образом, операция flush() также будет удалять или модифицировать строки этих отсоединенных элементов.
При использовании «динамического» загрузчика с «вторичной» таблицей теперь формируется запрос, в котором «вторичная» таблица не является алиасной. Это позволяет использовать объект вторичной таблицы в атрибуте «order_by» отношения relation(), а также использовать его в критерии фильтрации по динамическому отношению.
References: #1531
relation() с uselist=False будет выдавать предупреждение, если при ускоренной или ленивой загрузке будет найдено более одного допустимого значения для строки. Это может быть связано с условиями primaryjoin/secondaryjoin, которые не подходят для eager LEFT OUTER JOIN, или с другими условиями.
References: #1643
при использовании синонима() с map_column=True происходит явная проверка, что в словаре свойств, переданном в mapper, существует отдельно свойство ColumnProperty (отложенное или иное) с тем же ключевым именем. Вместо того чтобы молча заменить существующее свойство (и возможные варианты этого свойства), выдается ошибка.
References: #1633
»Динамический» загрузчик устанавливает критерий запроса во время конструирования таким образом, что реальный запрос возвращается из неклонируемых аксессоров типа «statement».
объекты «именованный кортеж», возвращаемые при итерации Query(), теперь являются pickleable.
При сопоставлении с конструкцией select() теперь требуется сделать из нее отдельный alias(). Это сделано для устранения путаницы в таких вопросах, как
References: #1542
query.join() был переработан для обеспечения более последовательного поведения и большей гибкости (включает)
References: #1537
query.select_from() принимает несколько предложений, чтобы получить несколько записей, разделенных запятыми, в предложении FROM. Применяется при выборе из многоместных предложений join().
query.select_from() также принимает в качестве аргументов сопоставленные классы, конструкции aliased() и mappers. В частности, это помогает при запросе из нескольких классов объединенных таблиц, чтобы обеспечить отображение полного объединения.
query.get() можно использовать с отображением для внешнего соединения, в котором одно или несколько значений первичного ключа являются None.
References: #1135
query.from_self(), query.union() и другие вложенные запросы типа «SELECT * from (SELECT…)» лучше справляются с трансляцией выражений столбцов в подзапросе в пункт columns внешнего запроса. Это потенциально несовместимо с 0.5, так как может привести к поломке запросов с литеральными выражениями, к которым не применяются метки (например, literal(„foo“) и т.д.).
References: #1568
Отношения primaryjoin и secondaryjoin теперь проверяют, что они являются выражениями столбцов, а не просто элементами клаузы. Это запрещает помещать туда напрямую такие вещи, как выражения FROM.
References: #1622
expression.null() полностью понимается так же, как и None при сравнении атрибута, ссылающегося на объект/коллекцию, в query.filter(), filter_by() и т.д.
References: #1415
добавлена вспомогательная функция «make_transient()», которая превращает постоянный/отсоединенный экземпляр в переходный (т.е. удаляет ключ_экземпляра и удаляет из любой сессии).
References: #1052
флаг allow_null_pks в функции mapper() устарел, и по умолчанию эта функция включена. Это означает, что строка, имеющая ненулевое значение для любого из столбцов первичного ключа, будет считаться идентичностью. Необходимость в этом сценарии обычно возникает только при сопоставлении с внешним объединением.
References: #1339
механика «обратной ссылки» была полностью объединена с более тонкой системой «back_populates» и происходит полностью внутри метода _generate_backref() RelationProperty. Это упрощает процедуру инициализации RelationProperty и позволяет легче распространять настройки (например, из подклассов RelationProperty) в обратную ссылку. Внутренняя функция BackRef() исчезла, а функция backref() возвращает обычный кортеж, понятный RelationProperty.
Функция version_id_col в mapper() будет выдавать предупреждение при использовании диалектов, не поддерживающих адекватно «rowcount».
References: #1569
добавлена опция «execution_options()» в Query, чтобы можно было передавать опции результирующему оператору. В настоящее время такие опции есть только в операторах Select, и единственная используемая опция - «stream_results», а единственный диалект, который знает «stream_results», - это psycopg2.
Query.yield_per() автоматически установит опцию оператора «stream_results».
- Утратил актуальность или удален:
Флаг „allow_null_pks“ на mapper() устарел. Теперь он ничего не делает, а его установка во всех случаях означает «on».
Флаг „transactional“ в функции sessionmaker() и других удален. Используйте „autocommit=True“ для указания „transactional=False“.
Убран аргумент „polymorphic_fetch“ в функции mapper(). Загрузка может контролироваться с помощью опции „with_polymorphic“.
Аргумент „select_table“ в функции mapper() удален. Для этой функциональности используйте „with_polymorphic=(«*», <some selectable>)“.
Убран аргумент „proxy“ в функции synonym(). В версии 0.5 этот флаг ничего не делал, так как теперь «генерация прокси» происходит автоматически.
Передача одного списка элементов в функции eagerload(), eagerload_all(), contains_eager(), lazyload(), defer() и undefer() вместо нескольких позиционных *args является устаревшей.
Передача одного списка элементов в query.order_by(), query.group_by(), query.join() или query.outerjoin() вместо нескольких позиционных *args является устаревшей.
query.iterate_instances() удалена. Используйте query.instances().
Функция Query.query_from_parent() удалена. Для создания «родительского» предложения используйте функцию sqlalchemy.orm.with_parent() или альтернативный вариант query.with_parent().
query._from_self() удалена, вместо нее используйте query.from_self().
аргумент «comparator» в composite() удален. Используйте «comparator_factory».
RelationProperty._get_join() удалена.
флаг „echo_uow“ на Session снят. Используйте протоколирование по имени «sqlalchemy.orm.unitofwork».
session.clear() удалена. используйте session.expunge_all().
Убраны session.save(), session.update(), session.save_or_update(). Используйте session.add() и session.add_all().
флаг «objects» в session.flush() остается устаревшим.
флаг «dont_load=True» в session.merge() устарел в пользу «load=False».
ScopedSession.mapper остается устаревшим. См. рецепт использования на https://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper.
Передача InstanceState (внутреннего объекта состояния SQLAlchemy) в функции attributes.init_collection() или attributes.get_history() является устаревшей. Эти функции являются публичными API и обычно ожидают обычный экземпляр сопоставленного объекта.
удален параметр „engine“ в declarative_base(). Используйте аргумент с ключевым словом „bind“.
sql¶
Флаг «autocommit» для select() и text(), а также select().autocommit() устарели - теперь для любой из этих конструкций вызывается .execution_options(autocommit=True), также доступный непосредственно для Connection и orm.Query.
флаг autoincrement в column теперь указывает на столбец, который должен быть связан с cursor.lastrowid, если используется этот метод. Подробности см. в документации по API.
executemany() теперь требует, чтобы во всех связанных наборах параметров присутствовали все ключи, которые присутствуют в первом связанном наборе параметров. Структура и поведение оператора вставки/обновления в значительной степени определяются первым набором параметров, в том числе и тем, какие значения по умолчанию будут срабатывать, а в отношении остальных параметров делается минимум предположений, чтобы не снижать производительность. По этой причине в противном случае умолчания могли бы «провалиться» при отсутствии параметров, поэтому теперь это исключено.
References: #1566
Поддержка returning() присуща insert(), update(), delete(). Реализации с разным уровнем функциональности существуют для PostgreSQL, Firebird, MSSQL и Oracle. returning() может быть вызван явно с выражениями столбцов, которые затем возвращаются в наборе результатов, обычно через fetchone() или first().
Конструкции insert() также будут неявно использовать RETURNING для получения новых значений первичного ключа, если это поддерживает используемая версия базы данных (выполняется проверка номера версии). Это происходит, если не был указан конечный пользователь return().
Операции union(), intersect(), except() и другие «составные» типы операторов имеют более последовательное поведение в отношении раскрытия круглых скобок. Теперь каждый составной элемент, вложенный в другой, будет группироваться с помощью круглых скобок - ранее первый составной элемент в списке не группировался, поскольку SQLite не любит, когда оператор начинается с круглых скобок. Однако, в частности, в PostgreSQL существуют правила старшинства в отношении INTERSECT, и более последовательным является применение скобок одинаково ко всем вложенным элементам. Таким образом, сейчас для SQLite существует такое же решение, как и для PG - при вложении составных элементов в первый из них обычно нужно вызвать «.alias().select()», чтобы обернуть его внутри подзапроса.
References: #1665
В конструкциях insert() и update() теперь можно встраивать объекты bindparam() с именами, совпадающими с ключами столбцов. Такие параметры привязки позволяют обойти обычный путь, по которому эти ключи отображаются в предложениях VALUES или SET генерируемого SQL.
References: #1579
Тип Binary теперь возвращает данные в виде строки Python (или типа «bytes» в Python 3), а не встроенного типа «buffer». Это позволяет симметрично обходить двоичные данные.
References: #1524
Добавлена конструкция tuple_(), позволяющая сравнивать набор выражений с другим набором, обычно с IN против составных первичных ключей или аналогичных. Также допускается IN с несколькими столбцами. Сообщение об ошибке «scalar select может иметь только один столбец» удалено - теперь о проблемах с несовпадением столбцов будет сообщать база данных.
Определенные пользователем вызываемые модули «default» и «onupdate», принимающие контекст, теперь должны обращаться к «context.current_parameters» для получения словаря параметров связывания, которые обрабатываются в данный момент. Этот словарь доступен одинаково, независимо от того, выполняется оператор в однократном или многократном режиме.
многокомпонентные имена схем, т.е. с точками, например, «dbo.master», теперь отображаются в метках select() с подчеркиванием точек, например, «dbo_master_table_column». Это «дружественная» метка, которая лучше ведет себя в наборах результатов.
References: #1428
Устранено ненужное «встречное» поведение с именами меток select(), совпадающими с именем столбца в таблице, т.е. генерируется «tablename_id» для «id», а не «tablename_id_1» в попытке избежать конфликта имен, когда в таблице есть столбец с именем «tablename_id» - это сделано потому, что логика маркировки всегда применяется ко всем столбцам, поэтому конфликт имен никогда не возникнет.
Вызов expr.in_([]), т.е. с пустым списком, выдает предупреждение перед тем, как выдать обычную оговорку «expr != expr». Предложение «expr != expr» может быть очень дорогим, поэтому предпочтительнее, чтобы пользователь не вызывал in_(), если список пуст, а просто не запрашивал или модифицировал критерий в зависимости от более сложных ситуаций.
References: #1628
В select()/text() добавлен параметр «execution_options()», который устанавливает опции по умолчанию для Connection. См. примечание в разделе «Двигатели».
- Утратил актуальность или удален:
Флаг «scalar» в select() снят, используйте select.as_scalar().
Убран атрибут «shortname» у функции bindparam().
Флаги postgres_returning, firebird_returning при insert(), update(), delete() устарели, используйте новый метод returning().
Флаг fold_equivalents на join устарел (останется до тех пор, пока не будет реализован)
References: #1131
schema¶
метод __contains__() метода MetaData теперь принимает в качестве аргументов строки или объекты Table. Если в качестве аргумента передается Table, то сначала аргумент преобразуется в table.key, т.е. «[schemaname.]<tablename>».
References: #1541
Устаревшие MetaData.connect() и ThreadLocalMetaData.connect() были удалены - для связывания метаданных передавайте атрибут «bind».
Устранен устаревший метод metadata.table_iterator() (используйте sorted_tables)
deprecated PassiveDefault - используйте DefaultClause.
аргумент «metadata» удаляется из DefaultGenerator и подклассов, но остается локально присутствующим в Sequence, которая является самостоятельной конструкцией в DDL.
Убрана публичная мутабельность из объектов Index и Constraint:
ForeignKeyConstraint.append_element()
Index.append_column()
UniqueConstraint.append_column()
PrimaryKeyConstraint.add()
PrimaryKeyConstraint.remove()
Они должны быть построены декларативно (т.е. в одной конструкции).
Атрибуты «start» и «increment» в Sequence теперь генерируют «START WITH» и «INCREMENT BY» по умолчанию для Oracle и PostgreSQL. Firebird в настоящее время не поддерживает эти ключевые слова.
References: #1545
UniqueConstraint, Index, PrimaryKeyConstraint принимают в качестве аргументов списки имен столбцов или объектов столбцов.
- Другие удаленные вещи:
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)
Флаг use_alter для ForeignKey теперь является опцией быстрого доступа к операциям, которые могут быть выполнены вручную с помощью системы событий DDL(). Побочным эффектом этого рефактора является то, что объекты ForeignKeyConstraint с use_alter=True не будут выдаваться на SQLite, который не поддерживает ALTER для внешних ключей.
Объекты ForeignKey и ForeignKeyConstraint теперь корректно копируют() все свои аргументы с открытым ключевым словом.
References: #1605
postgresql¶
Новые диалекты: pg8000, zxjdbc и pypostgresql на py3k.
Диалект «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_where» принимает SQL-выражения, которые также могут включать литералы, которые при необходимости будут заключены в кавычки.
Диалект psycopg2 теперь использует «расширение unicode» psycopg2 при всех новых соединениях, что позволяет всем типам String/Text/etc. отказаться от постобработки байтстрингов в unicode (дорогостоящий этап из-за их объема). Другие диалекты, возвращающие юникод нативно (pg8000, zxjdbc), также пропускают постобработку юникода.
Добавлен новый тип ENUM, который существует как конструкция на уровне схемы и расширяет общий тип Enum. Автоматически связывается с таблицами и их родительскими метаданными для выдачи соответствующих команд CREATE TYPE/DROP TYPE при необходимости, поддерживает юникодные метки, поддерживает отражение.
References: #1511
INTERVAL поддерживает необязательный аргумент «точность», соответствующий аргументу, который принимает PG.
использование новой функции dialect.initialize() для настройки поведения, зависящего от версии.
Несколько улучшена поддержка знаков % в именах таблиц/столбцов; однако psycopg2 не может обрабатывать имена параметров связывания, состоящие из %(foobar)s, и SQLA не хочет увеличивать накладные расходы только для обработки этого единственного несуществующего случая использования.
References: #1279
Вставка NULL в столбец с первичным ключом + внешним ключом приведет к ошибке «not null constraint», а не к попытке выполнить несуществующую последовательность «col_id_seq».
References: #1516
Операторы SELECT с автоинкрементами, т.е. те, которые выбирают из процедуры, модифицирующей строки, теперь работают в режиме курсора на стороне сервера (именованный курсор для таких операторов не используется).
Диалект postgresql может правильно определять строки версий pg «devel», т.е. «8.5devel».
References: #1636
В psycopg2 теперь учитывается опция statement «stream_results». Эта опция переопределяет настройку соединения «server_side_cursors». Если параметр равен true, то курсоры на стороне сервера будут использоваться при выполнении утверждения. Если false, то они не будут использоваться, даже если параметр «server_side_cursors» равен true на соединении.
References: #1619
mysql¶
Новые диалекты: oursql, новый собственный диалект, MySQL Connector/Python, собственный порт MySQLdb на Python, и, конечно, zxjdbc на Jython.
VARCHAR/NVARCHAR не будут отображаться без длины, выдавая ошибку перед передачей в MySQL. На CAST это не влияет, так как VARCHAR в любом случае не допускается в MySQL CAST, диалект в этих случаях выводит CHAR/NCHAR.
все функции _detect_XXX() теперь запускаются один раз под dialect.initialize()
Несколько улучшена поддержка знаков % в именах таблиц/столбцов; MySQLdb не может обрабатывать знаки % в SQL, когда используется executemany(), и SQLA не хочет добавлять накладные расходы только для того, чтобы обработать этот единственный несуществующий случай использования.
References: #1279
типы BINARY и MSBinary теперь генерируют «BINARY» во всех случаях. Если опустить параметр «length», то будет сгенерирован «BINARY» без длины. Для генерации двоичного столбца без длины используйте BLOB.
аргумент «quoting=“quoted“» в MSEnum/ENUM является устаревшим. Лучше полагаться на автоматическое цитирование.
ENUM теперь является подклассом нового общего типа Enum, а также неявно обрабатывает значения unicode, если заданные имена меток являются объектами unicode.
столбец типа TIMESTAMP теперь по умолчанию принимает значение NULL, если в Column() не передано значение «nullable=False» и нет значения по умолчанию. Теперь это соответствует всем остальным типам, а в случае TIMESTAMP явно выдает значение «NULL» из-за «переключения» MySQL на нулевую возможность по умолчанию для столбцов TIMESTAMP.
References: #1539
sqlite¶
Типы DATE, TIME и DATETIME теперь могут принимать необязательные аргументы storage_format и regexp. storage_format может использоваться для хранения этих типов в пользовательском строковом формате. regexp позволяет использовать пользовательское регулярное выражение для сопоставления строковых значений из базы данных.
Типы Time и DateTime теперь по умолчанию используют более строгое регулярное выражение для соответствия строкам из базы данных. Используйте аргумент regexp, если вы используете данные, хранящиеся в устаревшем формате.
__legacy_microseconds__ в типах SQLite Time и DateTime больше не поддерживается. Вместо этого следует использовать аргумент storage_format.
Типы Date, Time и DateTime теперь более строги к тому, что они принимают в качестве параметров связывания: Тип Date принимает только объекты date (и datetime, поскольку они наследуются от date), Time - только объекты time, а DateTime - только объекты date и datetime.
Table() поддерживает аргумент ключевого слова «sqlite_autoincrement», который при генерации DDL применяет ключевое слово SQLite «AUTOINCREMENT» к единственному целочисленному столбцу первичного ключа. Это позволит избежать генерации отдельного ограничения PRIMARY KEY.
References: #1016
mssql¶
MSSQL + Pyodbc + FreeTDS теперь в основном работают, за исключением бинарных данных и юникодных идентификаторов схем.
флаг «has_window_funcs» снимается. При использовании LIMIT/OFFSET, как и всегда, будет использоваться ROW NUMBER, и если вы используете более старую версию SQL Server, то операция завершится неудачей. Поведение точно такое же, только ошибка выдается SQL-сервером, а не диалектом, и для ее разрешения не требуется установка флага.
снимается флаг «auto_identity_insert». Этот флаг всегда вступает в силу, когда оператор INSERT переопределяет столбец, для которого известна последовательность. Как и в случае с «has_window_funcs», если базовый драйвер не поддерживает эту функцию, то вы не сможете выполнить эту операцию в любом случае, поэтому нет смысла в наличии флага.
использование новой функции dialect.initialize() для настройки поведения, зависящего от версии.
удалены ссылки на последовательности, которые больше не используются. Неявные тождества в mssql работают так же, как и неявные последовательности в любых других диалектах. Явные последовательности включаются с помощью параметра «default=Sequence()». Дополнительную информацию см. в документации по диалекту MSSQL.
oracle¶
Юнит-тесты проходят 100% с cx_oracle !
поддержка режима «родного юникода» в cx_Oracle, не требующего установки NLS_LANG. Используйте последнюю версию 5.0.2 или более позднюю версию cx_oracle.
к базовым типам добавляется тип NCLOB.
use_ansi=False не просочится в предложение FROM/WHERE оператора, выбирающего из подзапроса, в котором также используется JOIN/OUTERJOIN.
добавлен собственный тип INTERVAL в диалект. Пока он поддерживает только тип интервала DAY TO SECOND из-за отсутствия в cx_oracle поддержки YEAR TO MONTH.
References: #1467
Использование типа CHAR приводит к тому, что к операторам привязывается dbapi тип FIXED_CHAR компании cx_oracle.
В диалекте Oracle появился тип NUMBER, который должен работать так же, как и тип NUMBER в Oracle. Он является основным числовым типом, возвращаемым при отражении таблицы, и пытается вернуть Decimal()/float/int в зависимости от параметров точности/масштаба.
References: #885
func.char_length - общая функция для LENGTH
ForeignKey(), включающий onupdate=<value>, выдает предупреждение, а не ON UPDATE CASCADE, что не поддерживается oracle
метод keys() функции RowProxy() теперь возвращает имена столбцов результата нормализованные для SQLAlchemy, нечувствительные к регистру. Это означает, что для нечувствительных к регистру имен они будут в нижнем регистре, в то время как DBAPI обычно возвращает их как имена UPPERCASE. Это позволяет совместить функцию row keys() с дальнейшими операциями SQLAlchemy.
использование новой функции dialect.initialize() для настройки поведения, зависящего от версии.
Использование types.BigInteger в Oracle приведет к появлению NUMBER(19)
References: #1125
Функция «чувствительность к регистру» обнаружит при отражении имя колонки, чувствительное к регистру всех строчных букв, и добавит в генерируемый Column значение «quote=True», чтобы сохранить правильное цитирование.
misc¶
Полный набор описаний функций приведен на сайте https://docs.sqlalchemy.org/en/latest/changelog/migration_06.html . Данный документ находится в стадии разработки.
Все исправления ошибок и улучшения функций из последней версии 0.5 и ниже также включены в 0.6.
Платформы, на которые ориентирован данный продукт, включают Python 2.4/2.5/2.6, Python 3.1, Jython2.5.
Уровень изоляции транзакций может быть задан с помощью create_engine(… isolation_level=»…»); доступно для postgresql и sqlite.
References: #443
Connection имеет execution_options(), генеративный метод, который принимает ключевые слова, влияющие на способ выполнения оператора в DBAPI. В настоящее время поддерживает «stream_results», заставляющий psycopg2 использовать курсор на стороне сервера для данного оператора, а также «autocommit», который является новым местом для опции «autocommit» из select() и text(). select() и text() также имеют .execution_options(), как и ORM Query().
исправлен импорт для диалектов, управляемых точками входа, чтобы не полагаться на глупый трюк tb_info для определения статуса ошибки импорта.
References: #1630
в ResultProxy добавлен метод first(), который возвращает первую строку и сразу закрывает набор результатов.
Объекты RowProxy стали pickleable, т.е. объект, возвращаемый result.fetchone(), result.fetchall() и т.д.
RowProxy больше не имеет метода close(), поскольку строка больше не сохраняет ссылку на родителя. Вместо этого вызывайте close() на родительском ResultProxy или используйте автозакрытие.
Внутренние компоненты ResultProxy были переработаны таким образом, чтобы значительно уменьшить количество вызовов методов при получении столбцов. Это позволяет значительно повысить скорость (более чем на 100%) при получении больших наборов результатов. Увеличение скорости достигается при получении столбцов, к которым не применяется обработка на уровне типов, а также при использовании результатов в виде кортежей (а не словарей). Большое спасибо Гаэтану де Ментену (Gaëtan de Menten) из Elixir за это значительное улучшение!
References: #1586
Базы данных, которые полагаются на поствыборку «последнего вставленного идентификатора» для получения сгенерированного значения последовательности (т.е. MySQL, MS-SQL), теперь работают корректно при наличии составного первичного ключа, когда столбец «autoincrement» не является первым столбцом первичного ключа в таблице.
метод last_inserted_ids() переименован в дескриптор «inserted_primary_key».
установка echo=False в create_engine() теперь устанавливает уровень журнала WARN вместо NOTSET. Это позволяет отключить ведение журнала для конкретного движка, даже если в целом ведение журнала для «sqlalchemy.engine» включено. Обратите внимание, что по умолчанию значение параметра «echo» равно None.
References: #1554
ConnectionProxy теперь имеет методы-обертки для всех событий жизненного цикла транзакций, включая begin(), rollback(), commit() begin_nested(), begin_prepared(), prepare(), release_savepoint() и т.д.
Журналирование пула подключений теперь использует уровни журнала INFO и DEBUG. INFO - для основных событий, таких как недействительные соединения, DEBUG - для всех операций получения/возврата. Значение echo_pool может быть False, None, True или «debug», аналогично тому, как работает echo.
Все pyodbc-диалекты теперь поддерживают дополнительные pyodbc-специфические kw-аргументы „ansi“, „unicode_results“, „autocommit“.
References: #1621
переписан и упрощен механизм «threadlocal», который теперь поддерживает операции SAVEPOINT.
- устаревшие или удаленные
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, которые передаются в данный вызываемый модуль, а также рабочее соединение.
Отражение таблиц было расширено и обобщено в новый API под названием «sqlalchemy.engine.reflection.Inspector». Объект Inspector предоставляет тонкую информацию о широком спектре информации схемы с возможностью расширения, включая имена таблиц, столбцов, определения представлений, последовательностей, индексов и т.д.
Теперь представления могут отражаться как обычные объекты Table. Используется тот же конструктор Table, с той лишь оговоркой, что «эффективные» ограничения по первичному и внешнему ключу не входят в результаты отражения; их необходимо указывать явно, если это необходимо.
Существующая система autoload=True теперь использует под собой Inspector, так что каждый диалект должен возвращать только «сырые» данные о таблицах и других объектах - Inspector является единственным местом, где информация компилируется в объекты Table, чтобы обеспечить максимальную согласованность.
Значительно расширена система DDL. Класс DDL() теперь расширяет более общий DDLElement(), который является основой многих новых конструкций:
CreateTable()
DropTable()
AddConstraint()
DropConstraint()
CreateIndex()
DropIndex()
CreateSequence()
DropSequence()
Они поддерживают функции «on» и «execute-at()», как и обычные DDL(). Определяемые пользователем подклассы DDLElement могут быть созданы и связаны с компилятором с помощью расширения sqlalchemy.ext.compiler.
Сигнатура вызываемого элемента «on», передаваемого в DDL() и DDLElement(), изменена следующим образом:
- ddl
сам объект DDLElement
- мероприятие
строковое имя события.
- цель
ранее «schema_item», объект таблицы или метаданных, вызвавший событие.
- подключение
объект Connection, используемый для данной операции.
- **kw
аргументы ключевых слов. В случае MetaData before/after create/drop в качестве kw-аргумента «tables» передается список объектов Table, для которых должен быть выпущен CREATE/DROP DDL. Это необходимо для выполнения DDL на уровне метаданных, зависящих от наличия конкретных таблиц.
- Атрибут «schema_item» в DDL был переименован в
»target».
Модули диалектов теперь разбиты на диалекты баз данных и реализации DBAPI. URL-адреса подключения теперь предпочтительнее указывать с использованием dialect+driver://…, т.е. «mysql+mysqldb://scott:tiger@localhost/test». Примеры см. в документации к версии 0.6.
точка входа setuptools для внешних диалектов теперь называется «sqlalchemy.dialects».
ключевой аргумент «owner» удаляется из Table. Используйте «schema» для представления любых пространств имен, которые должны быть добавлены к имени таблицы.
server_version_info становится статическим атрибутом.
Диалекты получают событие initialize() при первом подключении для определения свойств соединения.
диалекты, получившие событие visit_pool, имеют возможность установить слушателей пула.
кэшированные классы TypeEngine кэшируются для каждого класса диалекта, а не для каждого диалекта.
new UserDefinedType должен использоваться в качестве базового класса для новых типов, что сохраняет 0.5 поведение get_col_spec().
Метод result_processor() всех классов типов теперь принимает второй аргумент «coltype», который является аргументом типа DBAPI из cursor.description. Этот аргумент может помочь некоторым типам принять решение о наиболее эффективной обработке значений результатов.
Устранена устаревшая функция Dialect.get_params().
Dialect.get_rowcount() переименован в дескриптор «rowcount» и напрямую вызывает cursor.rowcount. Диалекты, которым необходимо жестко привязать счетчик строк к определенным вызовам, должны переопределить этот метод, чтобы обеспечить другое поведение.
DefaultRunner и подклассы были удалены. Работа этого объекта была упрощена и перенесена в ExecutionContext. Диалекты, поддерживающие последовательности, должны добавить метод fire_sequence() в свою реализацию контекста выполнения.
References: #1566
Функции и операторы, генерируемые компилятором, теперь используют (почти) обычные функции диспетчеризации вида «visit_<opname>» и «visit_<funcname>_fn» для обеспечения пользовательской обработки. Это заменяет необходимость копирования словарей «функций» и «операторов» в подклассах компилятора прямыми методами visitor, а также позволяет подклассам компилятора полностью контролировать отрисовку, поскольку в них передается полный объект _Function или _BinaryExpression.
метод keys() функции RowProxy() теперь возвращает имена столбцов результата нормализованные для SQLAlchemy, нечувствительные к регистру. Это означает, что для нечувствительных к регистру имен они будут в нижнем регистре, в то время как DBAPI обычно возвращает их как имена UPPERCASE. Это позволяет совместить функцию row keys() с дальнейшими операциями SQLAlchemy.
использование новой функции dialect.initialize() для настройки поведения, зависящего от версии.
Функция «чувствительность к регистру» обнаружит при отражении имя колонки, чувствительное к регистру всех строчных букв, и добавит в генерируемый Column значение «quote=True», чтобы сохранить правильное цитирование.
Полностью переработано построение типов в диалектах. Диалекты теперь определяют общедоступные типы исключительно как имена UPPERCASE, а внутренние типы реализации - с помощью идентификаторов с подчеркиванием (т.е. являются частными). Система, с помощью которой типы выражаются в SQL и DDL, перенесена в систему компилятора. Это привело к тому, что в большинстве диалектов стало гораздо меньше объектов типов. Подробный документ по этой архитектуре для авторов диалектов находится в lib/sqlalchemy/dialects/type_migration_guidelines.txt .
Типы больше не делают никаких предположений относительно параметров по умолчанию. В частности, Numeric, Float, NUMERIC, FLOAT, DECIMAL не генерируют никакой длины или масштаба, если они не указаны.
types.Binary переименован в types.LargeBinary, он выводит только BLOB, BYTEA или аналогичный тип «длинный двоичный». Для доступа к этим типам, специфичным для MySQL/MS-SQL, были добавлены новые базовые типы BINARY и VARBINARY.
References: #1664
Типы String/Text/Unicode теперь пропускают проверку unicode() для каждого значения столбца результатов, если диалект определил, что DBAPI возвращает объекты Python unicode нативно. Эта проверка выполняется при первом подключении с помощью команды «SELECT CAST „some text“ AS VARCHAR(10)» или эквивалентной ей, а затем проверяется, является ли возвращаемый объект юникодом Python. Это позволяет значительно увеличить производительность нативных юникодных DBAPI, включая pysqlite/sqlite3, psycopg2 и pg8000.
Большинство типов результирующих процессоров были проверены на предмет возможного повышения скорости работы. В частности, были оптимизированы следующие общие типы, что привело к различному увеличению скорости: 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.
Отражение типов теперь возвращает точный тип UPPERCASE в файле types.py, или тип UPPERCASE в самом диалекте, если тип не является стандартным типом SQL. Это означает, что отражение теперь возвращает более точную информацию об отражаемых типах.
Добавлен новый общий тип Enum. Enum - это объект с поддержкой схемы, предназначенный для поддержки баз данных, которые требуют специальных DDL для использования enum или эквивалента; в случае PG он обрабатывает детали CREATE TYPE, а в других базах данных без встроенной поддержки enum будет генерировать VARCHAR + встроенное ограничение CHECK для применения enum.
Тип Interval включает флаг «native», который определяет, будут ли выбраны родные типы INTERVAL (postgresql + oracle), если они доступны, или нет. Также добавлены аргументы «day_precision» и «second_precision», которые распространяются соответствующим образом на эти родные типы. Связано с.
References: #1467
Тип Boolean при использовании в бэкенде, не имеющем встроенной поддержки boolean, будет генерировать ограничение CHECK «col IN (0, 1)» вместе с типом столбца, основанным на int/smallint. При желании это можно отключить с помощью create_constraint=False. Заметим, что MySQL не имеет встроенной поддержки булевых или CHECK-ограничений, поэтому данная возможность на этой платформе недоступна.
References: #1589
PickleType теперь использует == для сравнения значений при mutable=True, если в типе не указан аргумент «comparator» с функцией сравнения. Если не переопределена функция __eq__() или не указана функция сравнения, то сравниваемые объекты будут сравниваться на основе идентичности (что противоречит цели mutable=True).
Аргументы по умолчанию «precision» и «scale» для Numeric и Float были удалены и теперь имеют значение None. По умолчанию NUMERIC и FLOAT будут отображаться без числовых аргументов, если эти значения не указаны.
AbstractType.get_search_list() удалена - игры, для которых она использовалась, больше не нужны.
Добавлен общий тип BigInteger, компилируемый в BIGINT или NUMBER(19).
References: #1125
sqlsoup был переделан для явной поддержки сессий в стиле 0.5, используя autocommit=False, autoflush=True. Поведение SQLSoup по умолчанию теперь требует обычного использования commit() и rollback(), которые были добавлены в его интерфейс. В конструктор может быть передан явный аргумент Session или scoped_session, что позволяет переопределять эти аргументы.
sqlsoup db.<sometable>.update() и delete() теперь вызывают query(cls).update() и delete() соответственно.
В sqlsoup теперь есть execute() и connection(), которые вызывают методы Session этих имен, обеспечивая привязку в терминах привязки объекта SqlSoup.
Объекты sqlsoup больше не имеют атрибута „query“ - он не нужен для парадигмы использования sqlsoup и мешает колонке, которая действительно называется „query“.
Сигнатура вызываемого proxy_factory, передаваемого в association_proxy, теперь имеет вид (lazy_collection, creator, value_attr, association_proxy), добавляя четвертый аргумент, который является аргументом родительского AssociationProxy. Позволяет сериализовать и подклассифицировать встроенные коллекции.
References: #1259
В association_proxy появились базовые методы-компараторы .any(), .has(), .contains(), ==, !=, благодаря Скотту Торборгу.
References: #1372