0.7 Changelog¶
0.7.11¶
no release dateorm¶
Исправлена ошибка, из-за которой инструментарий списков не мог корректно представить фрагмент множества
[0:0]
, что, в частности, могло происходить при использованииinsert(0, item)
с прокси ассоциации. Из-за некоторой причуды в коллекциях Python эта проблема была гораздо более вероятна в Python 3, а не 2.References: #2807
Исправлена ошибка, когда запрос вида:
query(SubClass).options(subqueryload(Baseclass.attrname))
, гдеSubClass
является объединенным входомBaseClass
, не применялJOIN
внутри подзапроса на загрузку атрибутов, создающих картезианское произведение. При этом заполненные результаты, как правило, оставались корректными, поскольку дополнительные строки просто игнорировались, поэтому данная проблема может проявляться как снижение производительности в приложениях, которые в остальном работают корректно.References: #2699
Исправлена ошибка в единице работы, при которой подкласс с объединенным наследованием мог вставить строку для «под» таблицы перед родительской таблицей, если между двумя таблицами не были установлены ограничения ForeignKey.
References: #2689
Улучшено сообщение об ошибке, выдаваемое при обнаружении «петли обратной ссылки», т.е. когда событие атрибута вызывает двунаправленное присвоение между двумя другими атрибутами без конца. Такое состояние может возникнуть не только при присвоении объекта неправильного типа, но и при неправильной настройке атрибута на обратную ссылку в существующую пару обратных ссылок.
References: #2674
Предупреждение выдается при назначении MapperProperty, заменяющего существующее свойство, если эти свойства не являются обычными свойствами, основанными на столбцах. Замена свойств отношений редко (никогда?) является целью и обычно относится к неправильной конфигурации отображателя. Это также предупреждает, если обратная ссылка конфигурируется поверх существующей в отношениях наследования (что является ошибкой в 0.8).
References: #2674
engine¶
Regexp, используемый функцией
make_url()
, теперь разбирает ipv6-адреса, например, окруженные скобками.References: #2851
sql¶
Исправлена ошибка, восходящая к 0.7.9, в результате которой имя CTE могло не заключаться в кавычки, если на него ссылались в нескольких предложениях FROM.
References: #2801
Исправлена ошибка в системе общих табличных выражений, когда если CTE использовался только как конструкция
alias()
, то при использовании ключевого слова WITH он не выводился.References: #2783
Исправлена ошибка в DDL
CheckConstraint
, когда флаг «quote» из объектаColumn
не распространялся.References: #2784
postgresql¶
Добавлена поддержка традиционного для PostgreSQL синтаксиса функции SUBSTRING, которая при использовании обычного
func.substring()
отображается как «SUBSTRING(x FROM y FOR z)». Предоставлено Gunnlaugur Þór Briem.References: #2676
mysql¶
Обновления зарезервированных слов MySQL для версий 5.5, 5.6, любезно предоставленные Ханно Шлихтингом (Hanno Schlichting).
References: #2791
tests¶
Исправлен импорт «logging» в test_execute, который не работал на некоторых платформах linux.
References: #2669, pull request 41
0.7.10¶
Released: Thu Feb 7 2013orm¶
Исправлена потенциальная утечка памяти, которая могла произойти при создании произвольного количества объектов
sessionmaker
. Анонимный подкласс, созданный сеансовым диспетчером, при разыменовании не собирал мусор из-за оставшихся ссылок на уровне класса из пакета событий. Эта проблема также относится к любой пользовательской системе, использующей специальные подклассы совместно с диспетчером событий.References: #2650
<<<Теперь
Query.merge_result()
может загружать строки из внешнего объединения, в котором сущность может бытьNone
, без возникновения ошибки.References: #2640
Тип
MutableComposite
не позволял использовать методMutableBase.coerce()
, хотя код, казалось, указывал на это, так что теперь это работает, и добавлен краткий пример. Как побочный эффект, механика этого обработчика событий была изменена таким образом, что новые типыMutableComposite
больше не добавляют глобальные обработчики событий для каждого типа. Также в 0.8.0b2.References: #2624
Исправлена ошибка учета сессий, при которой замена удаленного объекта в карте идентификации на другой объект с тем же первичным ключом приводила к ошибке «конфликтующее состояние» при откате(), если замененный первичный ключ был установлен либо через не связанный с работой оператор INSERT, либо путем переключения первичного ключа другого экземпляра.
References: #2583
engine¶
Исправлено
MetaData.reflect()
для корректного использования заданногоConnection
, если оно задано, без открытия второго соединения изEngine
этого соединения.References: #2604
sql¶
Резервная корректировка
__repr__
дляTypeDecorator
до 0.7, позволяетPickleType
производить чистыйrepr()
для помощи в работе с Alembic.Исправлена ошибка, при которой
Table.tometadata()
приводил к ошибке, еслиColumn
имел как внешний ключ, так и альтернативное имя «.key» для столбца.References: #2643
Исправлена ошибка, при которой использование server_onupdate=<FetchedValue|DefaultClause> без передачи флага «for_update=True» приводило к применению объекта по умолчанию к server_default, уничтожая все, что там было. Явный аргумент for_update=True при таком использовании не нужен (тем более что в документации приведен пример без его использования), поэтому теперь, если флаг не установлен на то, что соответствует этому аргументу, он организуется внутренне, используя копию данного объекта по умолчанию.
References: #2631
Добавлен условный импорт в диалект
gaerdbms
, который пытается импортировать rdbms_apiproxy вместо rdbms_googleapi для работы на платформах dev и production. Также теперь учитывается атрибутinstance
. Любезно предоставлено Шоном Линчем. Также перенесены улучшения, позволяющие использовать имя пользователя/пароль, а также исправлена интерпретация кода ошибки из 0.8.References: #2649
mysql¶
sqlite¶
В 0.7.9 была выпущена дополнительная доработка, связанная с SQLite, для перехвата устаревших символов кавычек SQLite при отражении внешних ключей. Помимо перехвата двойных кавычек, теперь перехватываются и другие символы кавычек, такие как скобки, обратные знаки и одинарные кавычки.
References: #2568
mssql¶
Исправлена ошибка, при которой использование «key» с Column в сочетании со «schema» для таблицы-владельца приводило к невозможности найти строки результата из-за того, что логика «рендеринга схемы» диалекта MSSQL не учитывала .key.
Добавлено Py3K-условие вокруг ненужного вызова .decode() в информационной схеме mssql, исправлено отражение в Py3k.
References: #2638
oracle¶
Тип Oracle LONG, являясь неограниченным текстовым типом, не использует тип cx_Oracle.LOB при возврате строк результатов, поэтому диалект был исправлен, чтобы исключить применение к LONG фильтрации cx_Oracle.LOB.
References: #2620
Исправлено использование
.prepare()
в связке с cx_Oracle таким образом, что при возврате значенияFalse
вызовconnection.commit()
не производится, что позволяет избежать ошибок «нет транзакции». В настоящее время доказана возможность рудиментарной работы двухфазных транзакций с SQLAlchemy и cx_oracle, однако при этом существуют оговорки, связанные с драйвером; подробности можно узнать из документации.References: #2611
изменен список типов cx_oracle, которые исключаются из шага setinputsizes(), теперь в него входят только STRING и UNICODE; CLOB и NCLOB удалены. Это сделано для того, чтобы обойти поведение cx_oracle, которое нарушается при вызове executemany(). В 0.8 применено то же самое изменение, однако оно настраивается с помощью аргумента exclude_setinputsizes.
References: #2561
0.7.9¶
Released: Mon Oct 01 2012orm¶
Исправлена ошибка, в основном локальная для нового помощника AbstractConcreteBase, когда атрибут «type» из суперкласса не переопределялся в подклассе, чтобы выдать сообщение об ошибке «reserved for base», а вместо этого помещал туда атрибут do-nothing. Это было несовместимо с использованием ConcreteBase, а также со всем поведением классических конкретных отображений, где столбец «type» из полиморфной базы был бы явно отключен в подклассах, если бы не был переопределен явно.
Предупреждение выдается, когда lazy=“dynamic“ сочетается с uselist=False. Это исключение повышено в версии 0.8.
Исправлена ошибка, при которой ошибка пользователя в присваивании related-object могла привести к переполнению рекурсии, если присваивание вызывало обратную ссылку на одноименный двунаправленный атрибут некорректного класса на ту же цель. Теперь выдается информативная ошибка.
Исправлена ошибка, из-за которой при использовании функции «версия» в ORM передавалась некорректная информация о типе при связывании столбца «версия». Тесты предоставлены Дэниелом Миллером.
References: #2539
В «промывку», выполняемую в рамках Session.commit(), была добавлена дополнительная логика: дополнительное состояние, добавленное хуком after_flush() или after_flush_postexec(), также будет промыто в последующей промывке, до завершения «фиксации». Последующие вызовы flush() будут продолжаться до тех пор, пока крючки after_flush не перестанут добавлять новое состояние. Также имеется счетчик «переполнения», равный 100, на случай, если неработающий крючок after_flush() будет каждый раз добавлять новое содержимое.
References: #2566
engine¶
Значительно улучшено использование памяти системой событий; коллекции уровня экземпляра больше не создаются для определенного типа событий до тех пор, пока для этого события не будут созданы слушатели уровня экземпляра.
References: #2516
Исправлена ошибка, в результате которой при выполнении функции disconnect detect + dispose, когда в пуле QueuePool есть потоки, ожидающие соединения, эти потоки оставались в ожидании в течение всего времени таймаута старого пула (или неопределенного времени, если таймаут был отключен). Теперь исправление уведомляет ожидающих в специальном исключительном случае и заставляет их перейти на новый пул.
References: #2522
В mysql/__init__.py добавлен импорт gaerdbms, отсутствие которого препятствовало загрузке нового диалекта GAE.
References: #2529
Исправлена ошибка cextension, при которой «ошибка неоднозначного столбца» не работала, если заданный индекс был объектом Column, а не строкой. Обратите внимание, что здесь все еще существуют некоторые проблемы с нацеливанием на столбцы, которые будут исправлены в 0.8.
References: #2553
Исправлен repr() Enum для включения флагов «name» и «native_enum». Помогает автогенерации Alembic.
sql¶
Исправлена конструкция DropIndex для поддержки индекса, связанного с таблицей в удаленной схеме.
References: #2571
Исправлена ошибка в конструкции over(), при которой передача пустого списка для partition_by или order_by, а не None, приводила к некорректной генерации. Предоставлено Гуннлаугуром Þór Бримом.
References: #2574
Исправлена ошибка CTE, при которой позиционно связанные параметры, присутствующие в самих CTE, нарушали общий порядок связанных параметров. В первую очередь это касалось SQL Server как платформы с поддержкой позиционных привязок + CTE.
References: #2521
Исправлены неинтуитивные ошибки в CTE, которые не позволяли ссылаться на CTE в объединении с самим собой без его алиасинга. CTE теперь рендерится уникально по имени, рендерится только крайний CTE данного имени - все остальные ссылки рендерятся просто как имя. Это касается даже других CTE/SELECT, которые ссылаются на различные версии одного и того же объекта CTE, например, SELECT или UNION ALL этого SELECT. В данном случае мы несколько ослабляем обычную связь между идентичностью объекта и лексической идентичностью. Истинный конфликт имен между двумя несвязанными CTE теперь приводит к ошибке.
Кавычки применяются к именам столбцов внутри предложения WITH RECURSIVE общего табличного выражения в соответствии с правилами кавычек для исходного столбца.
References: #2512
Исправлена ошибка, появившаяся в 0.7.6, из-за которой список FROM оператора SELECT мог быть некорректным в некоторых сценариях «клон+замена».
References: #2518
Исправлена ошибка, при которой использование UNION или подобного ему внутри вложенного подзапроса мешало нацеливанию на столбец-результат в случае, если столбец-результат имел такое же конечное имя, как и имя внутри вложенного UNION.
References: #2552
Исправлена регрессия с версии 0.6, связанная с таргетингом строк результатов. Должна быть возможность использовать оператор select() со строковыми столбцами, то есть select([„id“, „name“]).select_from(„mytable“), и чтобы этот оператор был нацелен на объекты Column с такими именами; именно по такому механизму работает query(MyClass).from_statement(some_statement). В какой-то момент конкретный случай использования select([„id“]), который эквивалентен select([literal_column(„id“)]), здесь перестал работать, поэтому он был восстановлен и, конечно, протестирован.
References: #2558
В базу ColumnOperators добавлены отсутствующие операторы is_(), isnot(), чтобы эти давно доступные операторы присутствовали в виде методов, как и все остальные операторы.
References: #2544
postgresql¶
Теперь столбцы, отраженные в ограничении первичного ключа, возвращаются в том порядке, в котором их определяет само ограничение, а не в том, в котором они упорядочены в таблице. Любезно предоставлено Gunnlaugur Þór Briem…
References: #2531
В список сообщений, используемых для обнаружения разрыва связи с PG, добавлено сообщение „terminating connection“, которое в некоторых версиях появляется при перезапуске сервера.
References: #2570
mysql¶
Обновлен интерфейс mysqlconnector для использования обновленных API «client flag» и «charset», любезно предоставленных Дэвидом Макнелисом.
sqlite¶
Добавлена поддержка SQL-функции localtimestamp(), реализованной в SQLite, любезно предоставленная Ричардом Митчеллом.
Исправлено очень старое исправление, которое пыталось обойти проблему SQLite, «исправленную» в sqlite 3.6.14, касающуюся кавычек вокруг имени таблицы при использовании прагмы «foreign_key_list». Исправление было скорректировано таким образом, чтобы не мешать кавычкам, которые действительно находятся в имени столбца или таблицы, насколько это возможно; sqlite по-прежнему не возвращает корректный результат для функции foreign_key_list(), если целевая таблица действительно имеет кавычки, окружающие ее имя, как часть ее имени (например, «»»mytable»»»).
References: #2568
Скорректирован код отражения значений по умолчанию столбцов для преобразования нестроковых значений в строковые, что позволяет использовать старые версии SQLite, в которых информация по умолчанию не передается в виде строки.
References: #2265
mssql¶
Исправлена ошибка компилятора, при которой использование коррелированного подзапроса в ORDER BY приводило к некорректному отображению, если в операторе также использовались LIMIT/OFFSET, из-за неправильного рендеринга в предложении ROW_NUMBER() OVER. Исправление любезно предоставлено sayap
References: #2538
Исправлена ошибка компилятора, при которой заданный select() модифицировался, если имел атрибут «offset», что приводило к некорректной компиляции конструкции во второй раз.
References: #2545
Исправлена ошибка, при которой отражение ограничения первичного ключа приводило к дублированию столбцов, если одно и то же ограничение/таблица существовали в нескольких схемах.
0.7.8¶
Released: Sat Jun 16 2012orm¶
Аргумент „objects“ для flush() больше не является устаревшим, так как были выявлены некоторые допустимые варианты его использования.
Исправлена ошибка, при которой загрузка подзапроса() из полиморфного отображения в целевое приводила к новому вызову запроса для каждого отдельного класса, встречающегося в полиморфном результате.
References: #2480
Исправлена ошибка в декларативной части, из-за которой приоритет столбцов в объединенной таблице, составной столбец (обычно для id) не мог быть корректным, если столбцы содержали имена, отличные от имен их атрибутов. Это приводило к тому, что такие вещи, как условия первичного соединения, сделанные для атрибутов сущности, оказывались некорректными. Связано это с тем, что должно было быть частью этой темы.
Исправлена функция identity_key(), которая не принимала скалярный аргумент для идентификатора. .
References: #2508
Исправлена ошибка, из-за которой опция populate_existing не распространялась на загрузчики подзапросов. .
References: #2497
engine¶
Исправлена утечка памяти в C-версии result proxy, в результате которой DBAPI, не предоставляющие кортежи на чистом Python для строк результата, не могли корректно декрементировать refcounts. Наиболее заметной проблемой является pyodbc.
References: #2489
Исправлена ошибка, затрагивающая Py3K, при которой строковые позиционные параметры, передаваемые в движок/соединение execute(), не интерпретировались корректно из-за наличия __iter__ в строке Py3K.
References: #2503
sql¶
добавлены BIGINT в types.__all__, BIGINT, BINARY, VARBINARY в пространство имен модуля sqlalchemy, плюс тест, чтобы убедиться, что эта поломка не повторится.
References: #2499
Исправлено отображение общих табличных выражений для корректной работы, когда оператор SELECT содержит UNION или другие составные выражения, любезно предоставленные btbuilder.
References: #2490
Исправлена ошибка, из-за которой функция append_column() некорректно работала в клонированной конструкции select(), любезно предоставлено Gunnlaugur Þór Briem.
References: #2482
postgresql¶
удалена лишняя табличная оговорка при отражении перечислений. Любезно предоставлено Гуннлаугуром Þór Брим.
References: #2510
mysql¶
Добавлен новый диалект для Google App Engine. Предоставлено Ричи Форманом.
References: #2484
oracle¶
Добавлен ROWID в файл oracle.*.
References: #2483
0.7.7¶
Released: Sat May 05 2012orm¶
В Query добавлен метод prefix_with(), вызывающий select().prefix_with() для размещения директив MySQL SELECT в операторах. Предоставлено Дианой Кларк
References: #2443
Добавлен новый флаг в @validates include_removes. При значении True события collection remove и attribute del будут также отправляться в функцию валидации, которая при использовании этого флага принимает дополнительный аргумент «is_remove».
Исправлена проблема в единице работы, когда при установке самореферентного отношения «многие-к-одному» в значение None не сохранялось изменение, если прежнее значение еще не было загружено.
References: #2477
Исправлена ошибка в 0.7.6, из-за которой не работала column_mapped_collection, используемая против столбцов, которые были отображены как joins или другие косвенные selectables.
References: #2409
Исправлена ошибка, при которой столбец polymorphic_on, не отображенный на класс, некорректно включался в операцию merge(), вызывая ошибку.
References: #2449
Исправлена ошибка в механике аннотаций выражений, которая могла приводить к некорректному отображению операторов SELECT с псевдонимами и объединениями, особенно при использовании функции column_property().
References: #2453
Исправлена ошибка, из-за которой OrderingList не мог быть pickleable. Предоставлено Джеффом Дайрики
References: #2454
Исправлена ошибка в сравнениях отношений, когда вызов нереализованных методов типа SomeClass.Someerelationship.like() приводил к переполнению рекурсии, а не к ошибке NotImplementedError.
sql¶
Добавлено новое событие подключения dbapi_error(). Вызывается для всех ошибок уровня DBAPI, передавая исходное исключение DBAPI, перед тем как SQLAlchemy изменит состояние курсора.
Убрано предупреждение о том, что индекс создается без столбцов; хотя это может быть не то, что задумал пользователь, это вполне допустимый случай использования, поскольку индекс может быть заполнителем для простого индекса с определенным именем.
Если при вызове «with engine.begin()» произошел сбой conn.begin(), то вновь полученное соединение закрывается явным образом перед нормальным распространением исключения дальше.
Добавить BINARY, VARBINARY в types.__all__.
References: #2474
postgresql¶
Добавлены новые опции for_update/with_lockmode() для PostgreSQL: for_update=»read»/ with_lockmode(«read»), for_update=»read_nowait»/ with_lockmode(«read_nowait»). Они выдают сообщения «FOR SHARE» и «FOR SHARE NOWAIT» соответственно. Предоставлено Дианой Кларк
References: #2445
удалена лишняя табличная оговорка при отражении доменов.
References: #2473
mysql¶
Исправлена ошибка, при которой имя столбца в предложении «KEY» для автоинкрементного составного столбца в InnoDB заключалось в двойные кавычки, а имя являлось зарезервированным словом. Предоставлено Джеффом Дайрики.
References: #2460
Исправлена ошибка, из-за которой функция get_view_names() для схемы «information_schema» не получала представления, помеченные как «SYSTEM VIEW». любезно предоставлено Мэтью Турландом.
Исправлена ошибка, из-за которой при использовании cast() для SQL-выражения, тип которого не поддерживается cast() и, соответственно, CAST не отображается диалектом, порядок оценки мог измениться, если приведенное выражение требовало группировки; теперь группировка применяется к таким выражениям.
References: #2467
sqlite¶
Добавлена опция выполнения SQLite «sqlite_raw_colnames=True», позволяющая обойти попытки удаления «.» из имен столбцов, возвращаемых SQLite cursor.description.
References: #2475
При замене столбца первичного ключа таблицы, например, с помощью функции extend_existing, происходит сброс столбца «auto increment», используемого конструкциями insert(). Ранее он продолжал ссылаться на предыдущий столбец первичного ключа.
References: #2525
mssql¶
В диалект PyODBC добавлен промежуточный флаг create_engine supports_unicode_binds, позволяющий определить, передает ли диалект юникодные литералы Python в PyODBC или нет.
Исправлен флаг use_scope_identity create_engine() при использовании диалекта pyodbc. Ранее этот флаг игнорировался, если был установлен в False. Если флаг установлен в False, то после каждого INSERT для получения последнего вставленного идентификатора будет выполняться «SELECT @@identity» для тех таблиц, у которых «implicit_returning» установлен в False.
Синтаксис UPDATE..FROM в SQL Server требует, чтобы обновляемая таблица присутствовала в предложении FROM, если псевдоним этой таблицы также присутствует в предложении FROM. Теперь обновленная таблица всегда присутствует в предложении FROM, если FROM присутствует в нем в первую очередь. Любезно предоставлено sayap.
References: #2468
0.7.6¶
Released: Wed Mar 14 2012orm¶
В сессию добавлен контекстный менеджер «no_autoflush», который при использовании с with: временно отключает автопромывку.
В Query добавлен метод cte(), вызывающий поддержку общих табличных выражений из ядра (см. ниже).
References: #1859
Добавлена возможность запроса имен столбцов, связанных с таблицей, при использовании query(sometable).filter_by(colname=value).
References: #2400
Исправлена ошибка регистрации событий, которая проявлялась в том, что события не регистрировались экземплярами sessionmaker(), созданными после того, как событие было связано с классом Session.
References: #2424
Исправлена ошибка, из-за которой условие primaryjoin, содержащее «литерал», вызывало ошибку при компиляции некоторых видов глубоко вложенных выражений, в которых также требовалось вывести одно и то же имя связанного параметра более одного раза.
References: #2425
Убрана проверка количества затронутых строк при выполнении мультиудаления для отображаемых объектов. Если между двумя строками существует ON DELETE CASCADE, то мы не можем получить точный подсчет строк от DBAPI; в любом случае, этот подсчет не поддерживается большинством DBAPI, MySQLdb является ярким примером, где он поддерживается.
References: #2403
Исправлена ошибка, из-за которой объекты, использующие attribute_mapped_collection или column_mapped_collection, не могли быть замаринованы.
References: #2409
Исправлена ошибка, из-за которой MappedCollection не получала соответствующего инструментария коллекции, если она использовалась только в пользовательском подклассе, использующем @collection.internally_instrumented.
References: #2406
Исправлена ошибка, из-за которой в очень вложенном сценарии, включающем объединенное наследование, объединенную загрузку(), limit() и производную функцию в предложении columns, происходила ошибка адаптации SQL-механики.
References: #2419
Исправлена функция repr() для CascadeOptions на refresh-expire. Также переработано представление CascadeOptions в виде <frozenset>.
References: #2417
Улучшен пример «декларативного отражения» для поддержки наследования одной таблицы, нескольких вызовов prepare(), таблиц, присутствующих в альтернативных схемах, установления только подмножества классов в качестве отражаемых.
Уменьшен тест, применяемый в flush() для проверки UPDATE против частично NULL PK в одной таблице, чтобы UPDATE происходил только в том случае, если UPDATE действительно должен произойти.
References: #2390
Исправлена ошибка, из-за которой при конфликте имени метода с именем колонки возникала ошибка TypeError, когда картограф пытался проверить метод __get__() на объекте метода.
References: #2352
examples¶
Функция _params_from_query() в примере Beaker была изменена таким образом, чтобы извлекать bindparams из полностью скомпилированного оператора, что позволяет быстро получить все, включая подзапросы в предложении columns и т.д.
engine¶
Добавлена опция выполнения «no_parameters=True» для соединений. При отсутствии параметров оператор передается как cursor.execute(statement), тем самым вызывая поведение DBAPIs при отсутствии коллекции параметров; для psycopg2 и mysql-python это означает отсутствие интерпретации знаков % в строке. Это происходит только при данной опции, а не только в том случае, если список параметров пуст, поскольку в противном случае это привело бы к несовместимому поведению SQL-выражений, которые обычно обходятся без знаков процента (и при компиляции не могут заранее знать, будут ли присутствовать параметры в некоторых случаях).
References: #2407
В create_engine добавлен аргумент pool_reset_on_return, позволяющий контролировать поведение «возврата соединения». Также в pool.reset_on_return добавлены новые аргументы „rollback“, „commit“, None, позволяющие контролировать активность возврата соединения.
References: #2378
Добавлены достойные контекстные менеджеры в Engine, Connection:
with engine.begin() as conn: # <work with conn in a transaction> ...
и:
with engine.connect() as conn: # <work with conn> ...
Оба закрывают соединение по завершении работы, фиксируют или откатывают транзакцию с ошибками на engine.begin().
Добавлен вызов execution_options() для MockConnection (т.е. используемого со стратегией=»mock»), который работает как проходной для аргументов.
sql¶
Добавлена поддержка общих табличных выражений (CTE) стандарта SQL, позволяющая использовать в качестве источника CTE объекты SELECT (DML пока не поддерживается). Для этого используется метод cte() в любой конструкции select().
References: #1859
Исправлена утечка памяти в ядре, которая возникала при использовании расширений C с определенными типами поиска результатов, в частности, при вызове orm query.count().
References: #2427
Исправлена проблема, при которой обращение к столбцу на основе атрибутов в строке вызывало ошибку AttributeError в версии, отличной от C, и NoSuchColumnError в версии C. Теперь в обоих случаях выдается ошибка AttributeError.
References: #2398
Добавлена поддержка использования .key столбца в качестве строкового идентификатора в строке набора результатов. В настоящее время .key указывается как «альтернативное» имя столбца, которое заменяется именем столбца, имеющего это ключевое значение в качестве своего обычного имени. В следующем крупном выпуске SQLAlchemy мы можем изменить этот приоритет, чтобы .key имел приоритет, но это еще не решено.
References: #2392
Предупреждение выдается, если в предложении values() конструкции insert() или update() указывается несуществующий столбец. В 0.8 будет переведено в исключение.
References: #2413
Существенное изменение в способе применения маркировки к столбцам в операторах SELECT позволяет «усеченным» меткам, то есть именам меток, сгенерированным в Python и превышающим максимальную длину идентификатора (обратите внимание, что это настраивается через label_length в create_engine()), правильно ссылаться при выводе внутри подзапроса, а также присутствовать в строке набора результатов, используя свои оригинальные имена на языке Python.
References: #2396
Исправлена ошибка в новом флаге «autoload_replace», из-за которой не сохранялось ограничение первичного ключа отражаемой таблицы.
References: #2402
Index будет предупреждать, если переданные аргументы не могут быть интерпретированы как столбцы или выражения. Выдаст предупреждение, если индекс создается вообще без столбцов.
References: #2380
mysql¶
Добавлена поддержка типов ограничений MySQL index и primary key constraint (т.е. USING) с помощью нового параметра mysql_using в Index и PrimaryKeyConstraint, любезно предоставленного Дианой Кларк.
References: #2386
Добавлена поддержка параметра «isolation_level» для всех диалектов MySQL. За патч спасибо mu_mind.
References: #2394
sqlite¶
Исправлена ошибка в расширениях C, из-за которой строковый формат не применялся к числовому значению, возвращаемому в виде целого числа; в первую очередь это касалось SQLite, который не поддерживает настройки числовой шкалы.
References: #2432
mssql¶
Добавлена поддержка хинтов таблиц MSSQL INSERT, UPDATE и DELETE с помощью нового метода with_hint() в UpdateBase.
References: #2430
oracle¶
Добавлен новый флаг create_engine() coerce_to_decimal=False, отключающий обработку точных чисел, которая может привести к большим накладным расходам при преобразовании всех числовых значений в десятичную систему.
References: #2399
Добавлена поддержка недостающей компиляции для LONG
References: #2401
В список зарезервированных слов для Oracle добавлено слово „LEVEL“.
References: #2435
0.7.5¶
Released: Sat Jan 28 2012orm¶
Добавлен аргумент «class_registry» для функции declarative_base(). Позволяет двум или более декларативным базам совместно использовать один и тот же реестр имен классов.
query.filter() принимает несколько критериев, которые объединяются через AND, т.е. query.filter(x==y, z>q, …)
В опции загрузчика отношений добавлена возможность использования стратегий загрузчика «по умолчанию». Передайте „*“ любому из вариантов joinedload(), lazyload(), subqueryload() или noload(), и это станет стратегией загрузчика, используемой для всех отношений, кроме тех, которые явно указаны в запросе. Спасибо начинающему контрибьютору Кенту Бауэру за исчерпывающий и хорошо написанный набор тестов!
References: #2351
Добавлен новый пример декларативного отражения, иллюстрирующий, как лучше сочетать табличное отражение с декларативным, а также использующий некоторые новые возможности из.
References: #2356
Исправлена проблема, при которой измененное состояние сеанса, установленное после неудачного flush, фиксировалось в рамках последующей транзакции, автоматически начинающейся после ручного вызова rollback(). Состояние сессии проверяется в рамках функции rollback(), и если в ней появилось новое состояние, то выдается предупреждение и restore_snapshot() вызывается второй раз, отбрасывая эти изменения.
References: #2389
Исправлена ошибка из 0.7.4, в результате которой использование уже инструментированного столбца из суперкласса в качестве «polymorphic_on» не приводило к разрешению базового столбца Column.
References: #2345
Вызывает исключение, если функция xyzload_all() используется не по назначению с двумя не связанными отношениями.
References: #2370
Исправлена ошибка, из-за которой event.listen(SomeClass) заставлял компилировать совершенно ненужный маппер, что затрудняло настройку событий при импорте модуля (никто этого не заметил ??)
References: #2367
Исправлена ошибка, из-за которой hybrid_property не работал в качестве аргумента kw в any(), has().
обеспечить pickleability всех ORM-исключений для совместимости с многопроцессорными системами.
References: #2371
реализована стандартная ошибка AttributeError «cannot set attribute» / «can’t delete attribute» при использовании setattr/delattr на гибриде, не определяющем fset или fdel.
References: #2353
Исправлена ошибка, при которой у распикированного объекта не было достаточно настроенного состояния для корректной работы в событии unpickle(), установленном расширением mutable object, если объекту требовался доступ к атрибутам ORM в __eq__() или подобном.
References: #2362
Исправлена ошибка, при которой каскад «слияние» мог неверно интерпретировать незагруженный атрибут, если в relationship() использовался флаг load_on_pending. Спасибо Кенту Боуэру за тесты.
References: #2374
Исправлена ошибка из 0.6, в результате которой при использовании флага relationship() «load_on_pending» в тех случаях, когда на отложенный объект требовалось выдать ленивое предложение не «get()», он не загружался.
examples¶
engine¶
Добавлено __reduce__ к ошибкам StatementError, DBAPIError, ошибкам колонок, чтобы исключения были pickleable, как при использовании многопроцессорной обработки. Однако пока это поддерживают не все DBAPI, например, psycopg2.
References: #2371
Улучшены сообщения об ошибках, когда любому из процессоров даты/времени, используемых SQLite, включая версии на C и Python, передается нестрока или недопустимая строка.
References: #2382
Исправлена ошибка, из-за которой привязанный к таблице объект Column с именем «<a>_<b>», соответствующий столбцу, помеченному как «<tablename>_<colname>», мог не соответствовать при нацеливании в строку набора результатов.
References: #2377
Исправлена ошибка в стратегии «mock», при которой не вызывался правильный метод посещения DDL, что приводило к дублированию операторов «CREATE/DROP SEQUENCE»
References: #2384
sql¶
Новая функция отражения «autoload_replace»; если для таблицы установлено значение False, то таблица может быть автозагружена без замены существующих столбцов. Позволяет строить более гибкие цепочки построения/отражения таблиц, в том числе помогает сочетать декларативное и табличное отражение. См. новый пример в вики.
References: #2356
В пространство имен sqlalchemy.sql добавлены конструкции выражений «false()» и «true()», хотя пока они не являются частью __all__.
Диалект-специфичные компиляторы теперь выдают CompileError для всех проблем компиляции типов/выражений вместо InvalidRequestError или ArgumentError. DDL для CREATE TABLE будет повторно выдавать CompileError, чтобы включить информацию о таблице/столбце для проблемного столбца.
References: #2361
Улучшен API для add_column() таким образом, что если тот же самый столбец добавляется в собственную таблицу, то ошибка не возникает и ограничения не дублируются. Это также помогает при работе с некоторыми паттернами отражения/декларации.
References: #2356
Исправлена проблема, при которой исключение «required» не возникало для bindparam() с required=True, если в операторе вообще не было параметров.
References: #2381
mysql¶
исправлен regexp, отфильтровывающий предупреждения для неотраженных директив «PARTITION», спасибо Джорджу Рейли
References: #2376
sqlite¶
»Имя» FK-ограничения в SQLite отражается как «None», а не «0» или другое целочисленное значение. Похоже, что SQLite не поддерживает именование ограничений в любом случае.
References: #2364
sql.false() и sql.true() компилируются в sqlite в 0 и 1, соответственно
References: #2368
устранена ошибочная «прибавка» в диалекте SQLite при получении имен таблиц и представлений, где имеется логика возврата к старой версии SQLite, в которой отсутствует таблица «sqlite_temp_master».
mssql¶
Скорректирован regexp, используемый в типе mssql.TIME, чтобы в части значения «microseconds» получалось только шесть цифр, что ожидается в Python’овской datetime.time(). Заметим, что поддержка отправки микросекунд, по крайней мере, в pyodbc, пока невозможна.
References: #2340
Отказались от ограничения в 30 символов для pymssql, основываясь на сообщениях о том, что в настоящее время он работает лучше. pymssql не был хорошо протестирован, и, поскольку DBAPI находится в движении, до сих пор не ясно, каково состояние этого драйвера и как должна адаптироваться реализация SQLAlchemy.
References: #2347
oracle¶
В бесконечный список ошибок oracle «connection lost» добавлена ошибка ORA-03135
References: #2388
misc¶
Изменен LRUCache, используемый mapper’ом для кэширования операторов INSERT/UPDATE/DELETE, чтобы использовать инкрементный счетчик вместо временной метки для отслеживания записей, для большей надежности по сравнению с использованием time.time(), что может привести к сбоям в тестировании на некоторых платформах.
References: #2379
Добавлена булева проверка функции «finalize» в обратном вызове weakref прокси соединения пула перед ее вызовом, чтобы не выдавалось предупреждение о том, что эта функция None, когда приложение завершается и gc удалил функцию из модуля до вызова обратного вызова weakref.
References: #2383
Исправлено некорректное использование флага util.py3k и он переименован в util.py3k_warning, так как этот флаг предназначен только для обнаружения ограничений импорта серии флагов -3.
References: #2348
0.7.4¶
Released: Fri Dec 09 2011orm¶
polymorphic_on теперь принимает множество новых типов значений:
самостоятельные выражения, не имеющие других отображений
объекты column_property()
строковые имена любых column_property() или атрибутов отображаемого Column
В документации приведен пример с использованием конструкции case(), которая, вероятно, часто используется здесь. и часть
Автономные выражения в polymorphic_on распространяются на подклассы с однотабличным наследованием, поэтому они используются в предложении WHERE /JOIN для ограничения строк этим подклассом, как это обычно и происходит.
IdentitySet поддерживает оператор - как то же самое, что и difference(), что удобно при работе с Session.dirty и т.д.
References: #2301
Добавлено новое значение для автоинкремента столбца под названием «ignore_fk», которое может быть использовано для принудительного автоинкремента столбца, который все еще является частью ForeignKeyConstraint. Новый пример в документации по отношениям иллюстрирует его использование.
Исправлено поведение обратной ссылки при «выталкивании» значения из many-to-one в ответ на удаление из устаревшего one-to-many - операция пропускалась, так как many-to-one уже был обновлен.
References: #2315
После нескольких лет отсутствия этого функционала добавлена более детальная проверка «является ли X родителем Y», которая используется при определении необходимости «обнуления» FK на «Y», а также при удалении «Y» с помощью каскада delete-orphan. Теперь тест учитывает Python-идентификатор родителя, а также его идентификационный ключ, чтобы определить, является ли последний известный родитель Y определенно X. Если решение не может быть принято, то выдается ошибка StaleDataError. Условия, при которых возникает эта ошибка, довольно редки: требуется, чтобы предыдущий родитель был собран в мусор, и ранее можно было неправомерно обновить/удалить запись, которая после этого перешла к новому родителю, хотя возможны случаи, когда ранее происходил «тихий успех», который теперь будет возникать в условиях неоднозначности. Истечение срока действия «Y» сбрасывает «родительский» трекер, что означает, что X.remove(Y) может привести к удалению Y, даже если X устарел, но это то же самое поведение, что и раньше; в этом случае рекомендуется также истекать срок действия X.
References: #2264
исправлена некорректная оценка объекта user-mapped в булевом контексте в query.get(). Также в 0.6.9.
References: #2310
Добавлена недостающая запятая в символ PASSIVE_RETURN_NEVER_SET
References: #2304
Cls.column.collate(«some collation») теперь работает. Также в 0.6.9
References: #1776
значение составного атрибута теперь не регенерируется на месте, а истекает после операции вставки или обновления. Это гарантирует, что значение столбца, срок действия которого истек в рамках операции flush, будет загружено первым, прежде чем композит будет регенерирован с использованием этого значения.
References: #2309
Исправление также выдает событие «refresh» при загрузке составного значения при доступе, даже если все значения столбцов уже присутствовали, как и положено. Это исправляет «мутабельное» расширение, которое полагается на событие «load» для обеспечения актуальности словаря _parents, исправления. Спасибо Скотту Торборгу за приведенный здесь тестовый пример.
Исправлена ошибка, при которой подкласс подкласса, использующего конкретное наследование в сочетании с новыми ConcreteBase или AbstractConcreteBase, не мог применить подклассы глубже одного уровня к «полиморфному загрузчику» каждой базы
References: #2312
Исправлена ошибка, из-за которой подкласс подкласса, использующего новый AbstractConcreteBase, не получал корректный атрибут «base_mapper» при генерации маппера «base», что приводило к сбоям в дальнейшей работе.
References: #2312
Исправлена ошибка, из-за которой колонка column_property(), созданная на уровне ORM, могла рассматриваться как отдельная сущность при создании некоторых видов объединений join-inh.
References: #2316
Исправлено форматирование ошибок, возникающих при случайной передаче кортежа в session.query(). Также в 0.6.9.
References: #2297
Вызовы query.join() к подклассу наследования одной таблицы теперь отслеживаются и используются для устранения дополнительного критерия WHERE… IN, который обычно добавляется при наследовании одной таблицы, поскольку соединение должно его учитывать. Это позволяет OUTER JOIN к подклассу одной таблицы выдавать корректные результаты, и в целом будет создаваться меньше критериев WHERE при работе с подклассами наследования одной таблицы.
References: #2328
Теперь __table_args__ можно передавать как в виде пустого кортежа, так и в виде пустого dict. За исправление спасибо Фаязу Юсуфу Хану.
References: #2339
Обновлено предупреждение при установке delete-orphan без delete, теперь оно не относится к 0.6, так как мы так и не смогли перевести его в исключения. В идеале лучше было бы сделать это исключением, но в любом случае это не критично.
References: #2325
Исправлена ошибка в функции get_history() при обращении к составному атрибуту, не имеющему значения; добавлено покрытие для функции get_history() относительно составных атрибутов, которая в остальном является просто пользовательской функцией.
examples¶
Исправлена ошибка в примере history_meta.py, когда флаг «unique» не снимался с подкласса наследования одной таблицы, генерирующего колонки для размещения на базе.
engine¶
Исправлена ошибка, при которой transaction.rollback() выдавал ошибку при недействительном соединении, если транзакция была двухфазной или транзакцией с точкой сохранения. Для обычных транзакций откат() не приводит к ошибке, если соединение недействительно, поэтому, хотя и не было на 100% ясно, должна ли она приводить к ошибке, по крайней мере, теперь интерфейс согласован.
References: #2317
sql¶
Конструкция update() теперь может содержать несколько таблиц в предложении WHERE, что приведет к появлению конструкции «UPDATE..FROM», распознаваемой PostgreSQL и MSSQL. При компиляции на MySQL вместо этого будет сгенерирована конструкция «UPDATE t1, t2, …». MySQL дополнительно может выполнять рендеринг по нескольким таблицам в предложении SET, если в качестве ключей в параметре «values» или генеративном методе используются объекты Column.
Добавлен аксессор к типам «python_type», возвращающий рудиментарный объект типа Python для конкретного экземпляра TypeEngine, если он известен, в противном случае выдающий ошибку NotImplementedError.
References: #77
связанные с этим, внесли некоторые коррективы в изменения, касающиеся списка «from» в select(). Коллекция _froms больше не мемоизируется, так как это упрощает различные случаи использования и устраняет необходимость в «предупреждении», если столбец присоединяется к таблице после того, как он уже использовался в выражении - конструкция select() теперь всегда будет выдавать правильное выражение. Вероятно, реального ущерба производительности здесь нет; объекты select() почти всегда создаются ad-hoc, и системы, желающие оптимизировать повторное использование select(), будут использовать функцию «compiled_cache». Уменьшилась ошибка, возникающая при вызове select.bind, но подавляющее большинство пользователей все равно не должны использовать «связанные метаданные» :).
дополнительная доработка исправления из, чтобы генеративные методы работали немного лучше после клонирования (впрочем, это почти не используется). В частности, это позволяет функции with_only_columns() вести себя более последовательно. Добавлена дополнительная документация к функции with_only_columns(), чтобы прояснить ожидаемое поведение, которое изменилось в результате.
schema¶
Добавлена поддержка удаленных «схем»:
Флаг «extend_existing» для Table теперь позволяет отразить процесс для объекта Table, который уже был определен; когда autoload=True и extend_existing=True установлены одновременно, полный набор столбцов будет отражен от таблицы, которая затем перезапишет уже присутствующие столбцы, а не произойдет никаких действий. При этом столбцы, присутствующие непосредственно в автозагрузке, будут использоваться как обычно.
References: #1410
Исправлена ошибка, при которой TypeDecorator возвращал устаревшее значение для _type_affinity при использовании TypeDecorator, который «переключает» типы, например, тип CHAR/UUID.
Исправлена ошибка, при которой опция «order_by=“foreign_key“» в Inspector.get_table_names не реализовывала сортировку должным образом, заменена на существующий алгоритм сортировки
»Имя» CHECK-ограничения на уровне столбцов, если оно присутствует, теперь выводится в операторе CREATE TABLE с помощью «CONSTRAINT <имя> CHECK <выражение>».
References: #2305
MetaData() принимает аргументы «schema» и «quote_schema», которые будут применяться к одноименным аргументам таблицы или последовательности, оставляя их по умолчанию равными
None
.Последовательность принимает аргумент «quote_schema»
tometadata() для Table будет использовать «схему» входящих метаданных для новой таблицы, если аргумент schema явно равен «None»
Добавлены DDL-конструкции CreateSchema и DropSchema - они принимают только строковое имя схемы и флаг «quote».
При использовании «схемы» по умолчанию в MetaData, ForeignKey также будет принимать схему «по умолчанию» при размещении удаленной таблицы. Это позволяет применять аргумент «схема» в MetaData к любому набору объектов Table, которые в противном случае не имеют «схемы».
метод «has_schema» был реализован на dialect, но пока работает только на PostgreSQL. Предоставлено Манлио Перилло.
References: #1679
postgresql¶
В pg.ENUM добавлен аргумент конструктора create_type. При значении False в рамках события создания/удаления таблицы не будет выполняться ни CREATE/DROP, ни проверка типа; это будут делать только методы create()/drop)(), вызываемые напрямую. Помогает при работе с «автономными» скриптами Alembic.
Диалект PostgreSQL запоминает, что во время последовательности create/drop был обработан ENUM с определенным именем. Это позволяет последовательности create/drop работать без каких-либо вызовов «checkfirst», а также означает, что при включенной «checkfirst» проверка на наличие ENUM должна выполняться только один раз.
References: #2311
mysql¶
Корректировки юникода позволяют последней версии pymysql (пост. 0.4) проходить 100% проверку на Python 2.
mssql¶
снято ограничение на SAVEPOINT для SQL Server. Все тесты проходят с его использованием, однако неизвестно, есть ли более глубокие проблемы.
References: #822
Исправлена функция with_hint(), которая была некорректно реализована на MSSQL - обычно она используется для подсказки «WITH (NOLOCK)» (которую все равно не стоит использовать! используйте вместо нее изоляцию моментальных снимков :) ).
References: #2336
использовать новое определение версии pyodbc для опции _need_decimal_fix.
References: #2318
не приводить «имя таблицы» к виду NVARCHAR на SQL Server 2000. Однако до сих пор не ясно, какие заклинания нужны для полноценной работы PyODBC с FreeTDS 0.91.
References: #2343
Декодирование входящих значений при получении списка имен индексов и имен столбцов в этих индексах.
References: #2269
misc¶
В документацию по гибридам добавлен пример «трансформатора» - гибрида, возвращающего преобразующий запрос вызываемый элемент в сочетании с пользовательским компаратором. Используется новый метод Query под названием with_transformation(). Приведенный здесь вариант использования является достаточно экспериментальным, но добавляет в Query всего одну строку кода.
Диалекты, основанные на pyodbc, теперь точно разбирают pyodbc в части наблюдаемых строк pyodbc, включая такие, как «py3-3.0.1-beta4»
References: #2318
декоратор @compiles при отсутствии обработчика компиляции «по умолчанию» выдает информативное сообщение об ошибке, а не KeyError.
0.7.3¶
Released: Sun Oct 16 2011general¶
Настроен механизм «importlater», который используется для разрешения циклов импорта, таким образом, что использование __import__ завершается при импорте sqlalchemy или sqlalchemy.orm, что позволяет избежать использования __import__ после запуска новых потоков, исправления. Также в 0.6.9.
References: #2279
orm¶
Усовершенствована функция query.join(), в результате чего «левая» сторона может быть более гибкой, например, подзапросом. Теперь в качестве левой стороны будет использоваться selectable, помещенный в select_from(), что предпочтительнее неявного использования сопоставленной сущности. Если объединение все еще не работает из-за отсутствия внешних ключей, сообщение об ошибке будет содержать эту информацию. Спасибо brianrhude на IRC за тестовый пример.
References: #2298
Добавлено событие сессии after_soft_rollback(). Это событие срабатывает безусловно при вызове функции rollback(), независимо от того, произошел ли реальный откат на уровне DBAPI. Это событие специально разработано для того, чтобы позволить продолжить операции с сессией после отката, если параметр Session.is_active равен True.
References: #2241
добавлен булевский флаг «adapt_on_names» в конструкцию orm.aliased(). Позволяет конструкции aliased() связывать ORM-сущность с селектом, содержащим агрегаты или другие производные формы определенного атрибута, при условии, что его имя совпадает с именем отображаемого столбца сущности.
В функцию column_property() добавлен новый флаг expire_on_flush=False, отмечающий, что те свойства, которые в противном случае считались бы «readonly», т.е. полученными из SQL-выражений, сохраняют свое значение после промывки, в том числе если родительский объект был вовлечен в обновление.
Усовершенствован инструментарий в ORM для поддержки нового стиля аргументов Py3K «required kw arguments», т.е. fn(a, b, *, c, d), fn(a, b, *args, c, d). Сигнатуры аргументов метода __init__ сопоставленного объекта будут сохранены, включая правила обязательных kw-аргументов.
References: #2237
Исправлена ошибка в модуле работы, из-за которой определение «циклов» среди классов в сильно взаимосвязанных паттернах не давало детерминированного результата, что иногда приводило к пропуску некоторых узлов, которые должны считаться циклами, и вызывало дополнительные проблемы в дальнейшем. Обратите внимание, что эта ошибка есть и в 0.6; в настоящее время она не перенесена.
References: #2282
Исправлен ряд регрессий, связанных с synonym()в версии 0.6:
создание синонима против синонима теперь работает.
Синонимы, созданные на основе отношения(), могут быть переданы в query.join(), опции - в query.options(), по имени - в query.with_parent().
Исправлена ошибка, при которой атрибут mapper.order_by игнорировался во «внутреннем» запросе внутри подзапроса, требующего дополнительной загрузки. . Также в 0.6.9.
References: #2287
Identity map .discard() использует dict.pop(,None) вместо «del», чтобы избежать KeyError/предупреждения при неопределенном сносе gc
References: #2267
Исправлена ошибка в новом композитном рерайте, когда опция deferred=True не работала из-за отсутствия импорта
References: #2253
Восстановлен аргумент «comparator_factory» в composite(), удаленный при выпуске 0.7.
References: #2248
Исправлена ошибка в query.join(), которая возникала в сложных сценариях с несколькими пересекающимися путями, когда одна и та же таблица могла быть присоединена дважды. Огромное спасибо Дэйву Витеку за отличное исправление.
References: #2247
Query преобразует значение OFFSET, равное нулю, при нарезке в None, чтобы не вызывать ненужные предложения OFFSET.
Исправлена ситуация, когда отображатель не мог полностью обновить внутреннее состояние, когда отношение на новом отображателе устанавливало обратную ссылку на первый отображатель.
Исправлена ошибка, из-за которой при переопределении __eq__() ленивая загрузка отношения многие-к-одному попадала на __eq__() и терпела неудачу. Не относится к версии 0.6.9.
References: #2260
Вызов class_mapper() и передача объекта, который не является «типом» (т.е. классом, который потенциально может быть отображен), теперь вызывает информативную ошибку ArgumentError, а не UnmappedClassError.
References: #2196
Новый крючок событий, MapperEvents.after_configured(). Вызывается после завершения шага configure() и фактического воздействия на мапперы. Теоретически это событие вызывается один раз для каждого приложения, если только не создаются новые отображения после того, как существующие уже были использованы.
Когда открытая сессия очищается от мусора, оставшиеся в ней объекты считаются отсоединенными при добавлении их в новую сессию. Это достигается дополнительной проверкой того, что предыдущий «session_key» не существует в пуле сессий.
References: #2281
Новые декларативные возможности:
Метод __declare_last__() устанавливает слушателя событий для метода класса, который будет вызываться, когда картографы завершат последний шаг «configure».
Флаг __abstract__. При наличии этого флага класс вообще не будет отображаться.
Новые вспомогательные классы ConcreteBase, AbstractConcreteBase. Позволяют использовать конкретные отображения с помощью декларативных, которые автоматически устанавливают «polymorphic_union» при вызове шага «configure» mapper.
Сам отображатель имеет полуприватные методы, которые позволяют назначить выбираемый параметр «with_polymorphic» отображателю после того, как он уже сконфигурирован.
References: #2239
Declarative будет предупреждать, если база подкласса использует @declared_attr для обычного столбца - этот атрибут не распространяется на подклассы.
References: #2283
Целое число «id», используемое для связи отображаемого экземпляра с принадлежащей ему сессией, теперь генерируется функцией генерации последовательности, а не id(Session), чтобы исключить возможность того, что переработанные значения id() приведут к некорректному результату, нет необходимости проверять, что объект действительно находится в сессии.
References: #2280
Поведенческое улучшение: пустые конъюнкции, такие как and_() и or_(), будут сглаживаться в контексте вложенной конъюнкции, т.е. and_(x, or_()) будет давать „X“, а не „X AND ()“.
References: #2257
Исправлена ошибка, связанная с вычислением списка «from» для элемента select(). Теперь вычисление списка «from» происходит с задержкой, так что если в конструкции используется объект Column, который еще не привязан к таблице, но впоследствии будет привязан к таблице, то SQL будет генерироваться с использованием таблицы в качестве FROM. Это изменение довольно сильно повлияло на механику вычисления списка FROM, а также коллекции «коррелятов», поскольку некоторые схемы «адаптации клаузеров» (они очень активно используются в ORM) полагались на то, что коллекция «froms» обычно кэшируется до завершения адаптации. Переработка позволяет сделать так, что коллекция «froms» может быть очищена и сгенерирована заново в любое время.
References: #2261
Исправлена ошибка, из-за которой метод with_only_columns() в Select не выполнялся, если передавался selectable. Также в 0.6.9.
References: #2270
examples¶
Скорректирован пример dictlike-polymorphic.py для применения CAST таким образом, чтобы он работал на PG, других базах данных. Также в 0.6.9.
References: #2266
engine¶
Метод recreate() во всех классах пулов использует self.__class__ для получения типа создаваемого пула в случае подклассификации. Обратите внимание, что обычно нет необходимости в подклассах пулов.
References: #2254
Улучшена журнализация многопараметрических операторов, длинные списки связанных наборов параметров будут сжиматься с информативным индикатором происходящего сжатия. В сообщениях об исключениях используется то же улучшенное форматирование.
References: #2243
Добавлен необязательный аргумент «sa_pool_key» в pool.manage(dbapi).connect(), так что сериализация args не требуется.
Разрешение точек входа, поддерживаемое функцией create_engine(), теперь поддерживает разрешение отдельных драйверов DBAPI поверх встроенного или разрешенного в качестве точки входа диалекта, используя стандартную нотацию „+“ - перед разрешением в качестве точки входа она преобразуется в „.“.
References: #2286
Добавлено исключение catch + предупреждение для шага «return unicode detection» в connect, позволяющее базам данных, аварийно завершающим работу с NVARCHAR, продолжить инициализацию, предполагая, что тип NVARCHAR не реализован.
References: #2299
schema¶
Модифицирована функция Column.copy() для использования _constructor(), которая по умолчанию использует self.__class__ для создания нового объекта. Это позволяет упростить поддержку подклассов Column.
References: #2284
В классы SchemaItem добавлена несколько более удобная функция __repr__(). Обратите внимание, что repr здесь не может полностью поддерживать идею «repr - это конструктор», поскольку элементы схемы могут быть очень глубоко вложенными/циклическими, иметь позднюю инициализацию некоторых вещей и т.д.
References: #2223
postgresql¶
В Index() добавлен аргумент «postgresql_using», производящий предложение USING для указания реализации индекса для PG. . За исправление спасибо Райану П. Келли.
References: #2290
Добавлен параметр client_encoding в create_engine() при использовании диалекта postgresql+psycopg2; при подключении вызывается метод psycopg2 set_client_encoding() с указанным значением.
References: #1839
Исправлена ошибка, связанная с тем, что аналогичное поведение модифицированного индекса в PG 9 влияло на отражение первичного ключа по переименованному столбцу. Также в 0.6.9.
Функции отражения для таблиц, последовательностей больше не чувствительны к регистру. Имена могут отличаться только регистром и будут корректно различаться.
References: #2256
Использование атомарного счетчика в качестве источника «случайных чисел» для имен курсоров на стороне сервера; в редких случаях были зарегистрированы конфликты.
Сужено допущение при отражении таблицы со ссылкой на внешний ключ со схемой в текущем пути поиска; явная схема будет применена к таблице со ссылкой только в том случае, если она действительно совпадает со схемой ссылающейся таблицы, которая также имеет явную схему. Ранее предполагалось, что «текущая» схема является синонимом полного пути_поиска.
References: #2249
mysql¶
в CREATE TABLE опция COLLATE будет стоять после CHARSET, что, по-видимому, является частью произвольных правил MySQL относительно того, будет ли это работать или нет. Также в 0.6.9.
References: #2225
В конструкцию Index добавлен параметр mysql_length, задающий «длину» для индексов.
References: #2293
sqlite¶
Обеспечена выдача одинаковой ошибки ValueError для недопустимой строки даты/времени/времени, разобранной из базы данных, независимо от того, используются ли расширения C или нет.
mssql¶
Изменения, направленные на поддержку FreeTDS 0.91 с помощью Pyodbc. В частности, при обнаружении FreeTDS 0.91 строковые привязки передаются как объекты Python unicode, а при обнаружении таблицы используется CAST(? AS NVARCHAR). Тем не менее, я бы продолжал характеризовать поведение Pyodbc + FreeTDS 0.91 как довольно плохое, все еще существует множество запросов, таких как используемые в reflection, которые вызывают дамп ядра в Linux, и они вообще не могут быть использованы в OSX, MemoryErrors в изобилии и просто сломанная поддержка unicode.
References: #2273
Начиная с версии 0.8 поведение =/!= при сравнении скалярного select со значением больше не будет выдавать IN/NOT IN; это поведение является слишком жестким (используйте
in_()
, если хотите выдать IN) и теперь выдает предупреждение об устаревании. Чтобы сразу получить поведение 0.8 и убрать предупреждение, на сайте https://www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons приведен рецепт компилятора, позволяющий переопределить поведение функции visit_binary().References: #2277
»0» принимается в качестве аргумента для функции limit(), которая выдает «TOP 0».
References: #2222
oracle¶
Исправлен ReturningResultProxy для диалекта zxjdbc… Регрессия по сравнению с 0.6.
References: #2272
Тип String теперь генерирует VARCHAR2 в Oracle, который рекомендуется использовать в качестве VARCHAR по умолчанию. В диалект Oracle также добавлены явные VARCHAR2 и NVARCHAR2. Использование NVARCHAR по-прежнему генерирует «NVARCHAR2» - на Oracle нет «NVARCHAR» - это остается небольшим нарушением политики «прописные типы всегда дают именно это». VARCHAR по-прежнему генерирует «VARCHAR», что соответствует политике. Если Oracle когда-нибудь определит «VARCHAR» как что-то другое, как они утверждают (IMHO этого никогда не произойдет), то тип будет доступен.
References: #2252
misc¶
Дополнительные ключевые слова-аргументы к базовому типу Float, помимо «precision» и «asdecimal», игнорируются; добавлено предупреждение об устаревании здесь и дополнительная документация, связанная с
References: #2258
SQLSoup не будет включен в версию 0.8 SQLAlchemy; несмотря на его полезность, мы хотели бы, чтобы сам SQLAlchemy был ориентирован на одну парадигму использования ORM. Мы надеемся, что SQLSoup вскоре будет вытеснен сторонним проектом.
References: #2262
В AssociationProxy добавлены аксессоры local_attr, remote_attr, attr, обеспечивающие быстрый доступ к проксируемым атрибутам на уровне класса.
References: #2236
Изменен метод update() для ассоциативного прокси-словаря, в котором для различения update({}) и update((a, b)) используется подход «утиной типизации», т.е. проверка на «ключи». Ранее передача словаря, содержащего кортежи в качестве ключей, неверно интерпретировалась как последовательность.
References: #2275
0.7.2¶
Released: Sun Jul 31 2011orm¶
Расширение возможностей: при загрузке объединенных и подзапросов теперь будет выполняться обход уже присутствующих связанных объектов и коллекций в поисках незаполненных атрибутов во всем диапазоне заданной ускоренной загрузки, так что ускоренная загрузка, заданная через отображения или опции запроса, безоговорочно выполняется для всей глубины, заполняя все, что еще не заполнено. Ранее такой обход останавливался, если связанный объект или коллекция уже присутствовали, что приводило к противоречивому поведению (хотя и позволяло сэкономить на загрузках/циклах для уже загруженного графа). Для subqueryload это означает, что дополнительные операторы SELECT, выдаваемые subqueryload, будут вызываться безоговорочно, независимо от того, какая часть существующего графа уже присутствует (отсюда и противоречивость). Прежнее поведение «остановки» остается в силе, когда запрос является результатом инициированной атрибутами lazyload, поскольку в противном случае итерация коллекции в стиле «N+1» может стать неоправданно дорогой, когда один и тот же связанный объект встречается неоднократно. Существует также пока непубличный генеративный метод Query _with_invoke_all_eagers(), который выбирает старое/новое поведение
References: #2213
Переработка «обхода с заменой» в ORM при изменении селектов на псевдонимы вещей (т.е. адаптация клаузул) включает исправление многократно вложенных конструкций any()/has() в структуре объединенных таблиц.
References: #2195
Исправлена ошибка, при которой запрос query.join() + aliased=True из объединенной структуры inh в себя на relationship() с условием join на дочерней таблице неправомерно преобразовывал ведущую сущность в объединенную. Также в 0.6.9.
References: #2234
Исправлена ошибка из 0.6, когда при выполнении Session.add() по отношению к объекту, содержащему None в коллекции, возникало внутреннее исключение. Вернули это к поведению 0.6, которое заключается в том, что None принимается, но, очевидно, ничего не сохраняется. В идеале, коллекции с присутствующим None или при append() должны, по крайней мере, выдавать предупреждение, что рассматривается в 0.8.
References: #2205
Загрузка атрибута deferred() для объекта, в котором не удается найти строку, вызывает ошибку ObjectDeletedError вместо последующего отказа; улучшено сообщение в ObjectDeletedError для включения других условий, кроме простого «delete».
References: #2191
Исправлена регрессия из 0.6, при которой операция get history для некоторых атрибутов, основанных на relationship(), не выполнялась, когда выдавалась lazyload; при определенных условиях это могло срабатывать внутри flush(). Спасибо пользователю, приславшему отличный тест на эту проблему.
References: #2224
Исправлена ошибка, проявляющаяся только в Python 3, при которой сортировка постоянных и отложенных объектов при флеше приводила к некорректному сравнению, если первичный ключ постоянного объекта не являлся целым числом. Также в 0.6.9
References: #2228
Исправлена ошибка, при которой исходное предложение, используемое query.join(), было несовместимо с выражением по столбцу, объединяющим несколько сущностей. Также в 0.6.9
References: #2197
Исправлена ошибка, из-за которой, если в сопоставленном классе переопределялись __hash__() или __eq__() на нестандартные, что является поддерживаемым случаем использования, так как SQLA никогда не должна обращаться к ним, методы обращались к ним, если класс был частью «составного» (т.е. не являющегося единичным) набора результатов. Также в 0.6.9.
References: #2215
В Mapper добавлен публичный атрибут «.validators», представляющий собой неизменяемый словарь всех атрибутов, украшенных декоратором @validates. любезно предоставленный Стефано Фонтанелли
References: #2240
Исправлена тонкая ошибка, приводившая к разрыву SQL при возникновении: column_property() против подзапроса + joinedload + LIMIT + order by the column property(). . Также в 0.6.9
References: #2188
Условие присоединения, создаваемое с помощью функции with_parent, а также при использовании «динамического» отношения к родителю будет генерировать уникальные bindparam, а не некорректно повторять один и тот же bindparam. . Также в 0.6.9.
References: #2207
В mapper.polymorphic_on добавлена та же проверка «только столбцы», которая используется при получении пользовательских аргументов для relationship.order_by, foreign_keys, remote_side и т.д.
Исправлена ошибка, при которой сравнение выражения столбца с запросом Query() не вызывало функцию as_scalar() в операторе SELECT для создания скалярного подзапроса, как это происходит при вызове этой функции в Query().subquery().
References: #2190
Исправлена ошибка декларативного характера, когда класс, наследующий от одноименного суперкласса, не работал из-за лишнего поиска имени в реестре _decl_class_registry.
References: #2194
Исправлено утверждение «no statement condition» в Query, которое пыталось подняться, если после вызова from_statement() вызывался генеративный метод. Также в 0.6.9.
References: #2199
examples¶
Исправлена программа запуска тестов examples/versioning, чтобы не полагаться на тестовые либы SQLAlchemy, nosetests должен запускаться из examples/versioning, чтобы обойти поломку setup.cfg.
Исправление в примерах/версиях для выбора правильного внешнего ключа в ситуации с многоуровневым наследованием.
Исправлен пример с осколками атрибутов для корректной проверки возможности вызова bind param в стиле 0.7.
engine¶
Контекстный менеджер, предоставляемый Connection.begin(), будет выдавать rollback() при неудачном выполнении commit(), а не только при возникновении исключения.
Использование urllib.parse_qsl() в Python 2.6 и выше, отсутствие предупреждения об устаревании cgi.parse_qsl()
References: #1682
Добавлен класс миксина sqlalchemy.ext.DontWrapMixin. Определяемые пользователем исключения этого типа никогда не оборачиваются в StatementException, если они возникают в контексте выполнения оператора.
Обертка StatementException будет отображать в сообщении исходный класс исключения.
Сбои при подключении, вызывающие ошибку dbapi.Error, будут передавать ошибку в dialect.is_disconnect() и устанавливать флаг «connection_invalidated», если диалект знает, что это потенциально «повторное» условие. Пока реализован только Oracle ORA-01033.
References: #2201
sql¶
Исправлены две тонкие ошибки, связанные с соответствием столбцов в селекте, одна из которых связана с повторением подзапроса с одной и той же меткой, а другая - с тем, что метка «группируется» и теряет себя. Затронуты.
References: #2188
schema¶
Новая возможность: метод with_variant() для всех типов. Выдает экземпляр Variant(), специального TypeDecorator, который выбирает использование другого типа в зависимости от используемого диалекта.
References: #2187
Добавлено информативное сообщение об ошибке, когда ForeignKeyConstraint ссылается на имя столбца в родителе, которое не найдено. Также в 0.6.9.
Исправлена ошибка, при которой адаптация старой функции append_ddl_listener() передавала неожиданные **kw в событие Table. Таблица не получает kws, событие MetaData в 0.6 получало «tables=somecollection», это поведение сохранено.
References: #2206
Исправлена ошибка, при которой определение «автоинкремента» в таблице Table не срабатывало, если тип не имел значения «affinity», в частности, это происходило при использовании примера UUID на сайте, использующем TypeEngine в качестве «impl».
В объекты TypeEngine добавлена улучшенная функция repr(), которая отображает только позиционные аргументы конструктора или kwargs, отклоняющиеся от значения по умолчанию.
References: #2209
postgresql¶
В Index добавлен новый аргумент «postgresql_ops», позволяющий указывать классы операторов PostgreSQL для индексированных столбцов. Предоставлено Филипом Зызневским.
References: #2198
mysql¶
Исправлен диалект OurSQL на использование анси-нейтрального символа кавычек «“» для команд XA вместо „»“. . Также в 0.6.9.
References: #2186
sqlite¶
Диалект SQLite больше не убирает кавычки из отражаемого значения по умолчанию, что позволяет работать с CREATE TABLE в обе стороны. Это соответствует другим диалектам, которые также сохраняют точную форму значения по умолчанию.
References: #2189
mssql¶
Настроен диалект pyodbc таким образом, что при обнаружении unix-драйверов «Easysoft» связанные значения передаются как байты, а не как юникод. Это поведение аналогично поведению FreeTDS. При определенных обстоятельствах Easysoft дает сбой, если передаются юникоды Python.
oracle¶
Добавлен ORA-00028 для кодов отключения, для получения кода используйте cx_oracle _Error.code. Также в 0.6.9.
References: #2200
Добавлена функция ORA-01033 для кодов разъединения, которые могут быть пойманы во время события соединения.
References: #2201
исправлен тип oracle.RAW, который не генерировал корректный DDL. Также в 0.6.9.
References: #2220
добавлено слово CURRENT в список зарезервированных слов. Также в 0.6.9.
References: #2212
Исправлена ошибка в расширении mutable, из-за которой, если один и тот же тип дважды использовался в одном отображении, атрибуты, выходящие за пределы первого, не обрабатывались.
Исправлена ошибка в расширении mutable, из-за которой при установке None или несоответствующего типа возникала ошибка. Теперь принимается значение None, которое присваивает None всем атрибутам, недопустимые значения вызывают ошибку ValueError.
0.7.1¶
Released: Sun Jun 05 2011general¶
Добавлено обходное решение для ошибки 7511 в Python, когда при неудачной сборке расширения C не возникает соответствующего исключения на Windows 64 bit + VC express.
References: #2184
orm¶
Каскад «удаление-орфан» теперь разрешен для самореферентных отношений - это связано с тем, что SQLA 0.7 больше не обеспечивает «родитель без дочерних» на уровне ORM; эта проверка оставлена для нулевого внешнего ключа. Связано с
References: #1912
Исправлено новое расширение «mutable» для корректного распространения событий на подклассы; также не нужно создавать несколько слушателей событий для подклассов.
References: #2180
Изменить текст сообщения, возникающего в случае, когда ключ «identity» не определяется при флеше, чтобы включить в него распространенную причину того, что колонка не настроена на корректное определение автоинкремента;. Также в 0.6.8.
References: #2170
Исправлена ошибка, из-за которой коллекция «deleted» на уровне транзакций не очищалась от удаленных состояний, что приводило к ошибке, если они впоследствии становились переходными. Также в 0.6.8.
References: #2182
engine¶
Утрачиваются ориентированные на схему/SQL методы Connection/Engine, которые никогда не были широко известны и являются избыточными: reflecttable(), create(), drop(), text(), engine.func
Скорректирован метод __contains__() строки результата RowProxy таким образом, что внутри строки не генерируется исключение throw; NoSuchColumnError() также будет генерировать свое сообщение независимо от того, может ли конструкция столбца быть приведена к строке. Также в 0.6.8.
References: #2178
sql¶
Исправлена ошибка, при которой metadata.reflect(bind) закрывала Connection, переданный в качестве аргумента bind. Регрессия по сравнению с 0.6.
Упорядочен процесс, в котором Select определяет, что находится в его коллекции „.c“. Поведение идентично, за исключением того, что необработанный ClauseList(), переданный в select([]) (что в любом случае не является документированным случаем), теперь будет разложен на отдельные элементы колонок, а не проигнорирован.
postgresql¶
Исправлены некоторые модульные тесты, касающиеся числовых массивов, оператора MATCH. Исправлена потенциальная неточность в работе с плавающей точкой, а некоторые тесты оператора MATCH пока выполняются только в EN-ориентированной локали. . Также в 0.6.8.
References: #2175
mysql¶
Юнит-тесты проходят на 100% на MySQL, установленном под windows.
Убран шаг «корректировать регистр», который приводил к ошибке при отражении таблицы в MySQL на windows с именем в смешанном регистре. После некоторых экспериментов с сервером MySQL на windows было установлено, что этот шаг не очень-то помогает; MySQL не возвращает имена FK с правильным регистром и на платформах, отличных от Windows, и удаление этого шага, по крайней мере, позволяет отражению вести себя более похоже на то, что происходит на других ОС. Мы рассматривали возможность предупреждения, но трудно определить, при каких условиях оно может быть выдано, поэтому пока отказались от этой идеи - вместо этого добавили документацию.
References: #2181
supports_sane_rowcount будет установлено значение False, если используется MySQLdb и DBAPI не предоставляет модуль constants.CLIENT.
sqlite¶
Принимать None от cursor.fetchone() при вызове «PRAGMA read_uncommitted» для определения текущего режима изоляции во время подключения и по умолчанию устанавливать SERIALIZABLE; это сделано для поддержки версий SQLite до 3.3.0, не имевших этой возможности.
References: #2173
0.7.0¶
Released: Fri May 20 2011orm¶
Исправлена ошибка, появившаяся в 0.7b4 (!), из-за которой при выполнении query.options(someoption(«несуществующее имя»)) не выдавалась ошибка. Также добавлена дополнительная блокировка ошибок для случаев, когда опция пыталась отстроиться от элемента, основанного на столбце, исправлены некоторые сообщения об ошибках, созданные в
References: #2069
query.count() выдает «count(*)» вместо «count(1)».
References: #2162
Тонкая настройка адаптации предложения запроса при выполнении операций from_self(), union() или других операций типа «select from myself» таким образом, чтобы элементы выражений обычного SQL, добавленные в filter(), order_by() и т.д., которые присутствуют во вложенном запросе «from myself», адаптировались так же, как и элементы выражений ORM, поскольку иначе эти элементы не могут быть легко доступны.
References: #2155
Исправлена ошибка, при которой определение «самореферентного» отношения не давало результата, если объединенный подкласс inh был связан с самим собой, или объединенный подкласс inh был связан с подклассом этого подкласса, в условии присоединения которого отсутствовали столбцы в подклассе. Также в 0.6.8.
References: #2149
mapper() будет игнорировать ненастроенные внешние ключи к несвязанным таблицам при определении условия наследования между родительским и дочерним классом, но будет как обычно поднимать вопрос о неразрешенных столбцах и именах таблиц, относящихся к наследуемой таблице. Это расширенное обобщение поведения, которое уже применялось ранее для декларативных классов. В 0.6.8 реализована более консервативная версия, не меняющая принципиально способ определения условий присоединения.
References: #2153
Ошибкой является вызов query.get(), если заданная сущность не является единой сущностью полного класса или маппером (т.е. колонкой). Это предупреждение об устаревании в версии 0.6.8.
References: #2144
Исправлена потенциальная ошибка KeyError, которая при некоторых обстоятельствах могла возникнуть при работе с картой идентификации, являющейся частью
References: #2148
добавлен метод Query.with_session(), переключающий Query на использование другой сессии.
В горизонтальном запросе к шарду должны использоваться опции выполнения для каждого соединения в соответствии с
References: #2131
не_первичный отображатель будет наследовать _идентичность_класса первичного отображателя. Таким образом, не_первичное отображение, созданное для класса, который обычно находится в наследовании, будет выдавать результаты, совместимые с отображением идентичности первичного отображения (также в 0.6.8)
References: #2151
Исправлено сообщение об ошибке «cannot execute syncrule for destination column „q“; mapper „X“ does not map this column» для ссылки на правильный mapper. . Также в 0.6.8.
References: #2163
polymorphic_union() получает опцию «cast_nulls», отключающую использование CAST при выводе помеченных NULL-столбцов.
References: #1502
polymorphic_union() отображает столбцы в их исходном табличном порядке, как в соответствии с первой таблицей/выбираемым элементом в списке полиморфных объединений, в которых они встречаются. (который сам по себе является неупорядоченным отображением, если не передать OrderedDict).
Исправлена ошибка, при которой маппер, сопоставленный с анонимным псевдонимом, не работал при использовании логирования, из-за нерасшифрованного знака % в имени псевдонима. Также в 0.6.8.
References: #2171
examples¶
удалены устаревшие примеры «полиморфных ассоциаций» и заменены обновленным набором примеров, использующих декларативные миксины «generic_associations». В каждом из них представлена альтернативная схема таблицы.
sql¶
Исправлена ошибка, из-за которой вложение метки select() с другой меткой в нее приводило к некорректному экспорту столбцов. Помимо прочего, это приводило к нарушению сопоставления ORM column_property() с другим column_property(). . Также в 0.6.8
References: #2167
Изменена обработка при определении условий присоединения таким образом, что ошибки внешних ключей рассматриваются только между двумя заданными таблицами. То есть t1.join(t2) будет сообщать об ошибках FK, связанных с „t1“ или „t2“, а все, что связано с „t3“, будет пропущено. Это влияет на join(), а также на логику отношений ORM и условия наследования.
Некоторые улучшения в обработке ошибок внутри процедуры execute, обеспечивающие реальное закрытие автозакрываемых соединений при возникновении очень необычных ошибок DBAPI.
metadata.reflect() и reflection.Inspector() при закрытии соединений, которые были получены изнутри, полагались на GC, что было исправлено.
Добавлена явная проверка для случая, когда столбец .name назначен как пустая строка
References: #2140
Исправлена ошибка, из-за которой при передаче FetchedValue колонке server_onupdate не назначался ее родительский «столбец», добавлено тестовое покрытие для всех шаблонов назначения столбцов по умолчанию. также в 0.6.8
References: #2147
postgresql¶
Исправлен разбор psycopg2_version в диалекте psycopg2.
Исправлена ошибка, затрагивающая PG 9, при которой отражение индекса по столбцу, имя которого изменилось, приводило к ошибке. . Также в 0.6.8.
References: #2141
mssql¶
Исправлена ошибка в диалекте MSSQL, при которой псевдонимия, применяемая к таблице с критериями схемы, просачивалась во вложенные операторы select. Также в 0.6.8.
References: #2169
misc¶
В этом разделе описаны изменения, произошедшие с 0.7b4 по 0.7.0. Для обзора того, что нового появилось в SQLAlchemy 0.7, смотрите https://docs.sqlalchemy.org/en/latest/changelog/migration_07.html.
Удалено использование abc «collections.MutableMapping» из документации по ext.mutable, так как он используется некорректно и в любом случае затрудняет понимание примера.
References: #2152
Исправлена ошибка в расширении sqlalchemy.ext.mutable, при которой некорректно обрабатывалось None, некорректно обрабатывались события замены.
References: #2143
0.7.0b4¶
Released: Sun Apr 17 2011general¶
Изменен формат CHANGES этого файла. Изменения формата были применены в релизах 0.7.
Изменения «-declarative» теперь будут перечислены непосредственно под разделом «-orm», поскольку они тесно связаны между собой.
Изменения серии 0.5 перенесены в файл CHANGES_PRE_06, который заменяет CHANGES_PRE_05.
Журнал изменений для 0.6.7 и последующих в серии 0.6 теперь приводится только в файле CHANGES в ветке 0.6. В файле CHANGES ветки 0.7 (т.е. в этом файле) все изменения 0.6 перечислены в строчном порядке в той секции 0.7, в которой они были применены (поскольку все изменения 0.6 присутствуют и в 0.7). Изменения, относящиеся к версии 0.6, здесь отмечены, как и различия в реализации/поведении.
orm¶
Исправлена оценка «evaluate» и «fetch» при вызове query.update(), query.delete(). Извлечение записей во всех случаях производится после автопромывки и перед выполнением update/delete, что защищает от присутствия непромытых данных, а также от выхода из строя просроченных объектов во время оценки.
References: #2122
Переформулировано исключение, возникающее при попытке прошить подкласс, не являющийся полиморфным по отношению к супертипу.
References: #2063
Еще корректировка формулировок, когда вариант запроса не может найти целевую сущность. Объясните, что путь должен быть от одной из корневых сущностей.
Некоторые исправления в обработке состояний для обратных ссылок, обычно при autoflush=False, когда коллекция с обратными ссылками не могла корректно обрабатывать добавления/удаления без чистого изменения. Спасибо Ричарду Мурри за тестовый пример + патч. (также в 0.6.7).
References: #2123
Добавлены проверки внутри UOW для обнаружения необычного состояния, когда запрашивается UPDATE или DELETE для значения первичного ключа, содержащего NULL.
References: #2127
Некоторые уточнения в истории атрибутов. Дополнительные изменения ожидаются, возможно, в 0.8, но на данный момент история изменена таким образом, что скалярная история не имеет «побочного эффекта» заполнения значения None для не присутствующего значения. Это позволяет немного лучше различать набор None и отсутствие фактических изменений, что также влияет на историю.
References: #2127
при использовании функции from_self() из внутреннего запроса во внешний будет скопировано предложение «имея»; в частности, это приведет к поломке запроса count() в стиле 0.7. (также в 0.6.7)
References: #2130
Метод Query.execution_options() теперь передает эти параметры не в оператор SELECT, а в Connection, что позволяет использовать все доступные опции, включая уровень изоляции и скомпилированный кэш.
References: #2131
engine¶
Расширение C теперь включено по умолчанию в CPython 2.x с возможностью возврата к чистому python, если компиляция не удается.
References: #2129
sql¶
Параметр выполнения «compiled_cache» теперь вызывает ошибку, если передается в оператор SELECT, а не в Connection. Ранее она полностью игнорировалась. Возможно, мы рассмотрим возможность работы этой опции на уровне каждого оператора.
References: #2131
Восстановлен конструктор «catchall» для базового класса TypeEngine с предупреждением об устаревании. Таким образом, код, выполняющий что-то вроде Integer(11), по-прежнему работает успешно.
Исправлена ошибка, из-за которой MetaData(), возвращающаяся после распиновки, не отслеживала новые объекты, которые она отслеживает сейчас, т.е. коллекцию объектов Sequence, список имен схем.
References: #2104
Ключевые слова limit/offset в select(), а также значение, передаваемое в select.limit()/offset(), будут приводиться к целому числу. (также в 0.6.7)
References: #2116
Исправлена ошибка, при которой предложение «from», собираемое из предложения over(), представляло собой itertools.chain(), а не список, вызывая ошибку типа «can only concatenate list» при комбинировании с другими предложениями.
Исправлено некорректное использование «,» в предложении over(), которое помещалось между предложениями «partition» и «order by».
References: #2134
Теперь функционируют события «до/после» прикрепления для PrimaryKeyConstraint, добавлены тесты для событий «до/после» для всех типов ограничений.
References: #2105
В либу выражений добавлены явные конструкции true()/false() - правила коэрцитивности будут перехватывать «False»/»True» в эти конструкции. В 0.6 эти конструкции обычно преобразовывались непосредственно в строку, что в 0.7 уже не принимается.
References: #2117
schema¶
Флаг „useexisting“ для Table заменен новой парой флагов „keep_existing“ и „extend_existing“. Флаг „extend_existing“ эквивалентен флагу „useexisting“ - возвращается существующая таблица и добавляются дополнительные элементы конструктора. При использовании флага „keep_existing“ возвращается существующая таблица, но дополнительные элементы конструктора не добавляются - эти элементы применяются только при новом создании таблицы.
References: #2109
postgresql¶
Теперь поддерживается Psycopg2 для Python 3.
Исправлена поддержка точных чисел при использовании pg8000.
References: #2132
sqlite¶
Исправлена ошибка, при которой отражение внешнего ключа, созданного как «REFERENCES <tablename>» без имени col, приводило к ошибке. (также в 0.6.7)
References: #2115
oracle¶
При использовании имен столбцов, требующих кавычек для самого столбца или для генерируемого именем параметра связывания, например, имен со специальными символами, подчеркиваниями, неаскриптивными символами, теперь правильно транслируются ключи параметров связывания при обращении к cx_oracle. (Также в 0.6.7)
References: #2100
В диалекте Oracle добавлен флаг use_binds_for_limits=False create_engine(), который выводит значения LIMIT/OFFSET в строку, а не в виде биндов, что, как сообщается, модифицирует план выполнения, используемый Oracle. (Также в 0.6.7)
References: #2116
misc¶
В число основных типов добавлен REAL. Поддерживается PostgreSQL, SQL Server, MySQL, SQLite. Обратите внимание, что версии SQL Server и MySQL, в которых добавлены дополнительные аргументы, также доступны в этих диалектах.
References: #2081
Добавлен декоратор @event.listens_for(), задающий target + имя события, применяющий декорированную функцию в качестве слушателя.
References: #2106
AssertionPool теперь хранит трассировку, указывающую, где было получено текущее проверенное соединение; эта трассировка сообщается в утверждении, поднимаемом при повторной одновременной проверке; любезно предоставлено Gunnlaugur Briem
References: #2103
Функция «pool.manage» больше не использует pickle для хэширования аргументов для каждого пула.
Документированные типы SQLite DATE/TIME/DATETIME. (также в 0.6.7)
References: #2029
Исправлена документация по мутабельным расширениям для отображения корректных методов ассоциаций типов.
References: #2118
0.7.0b3¶
Released: Sun Mar 20 2011general¶
Много исправлений в юнит-тестах при запуске под PyPy (любезно предоставлено Алексом Гейнором).
orm¶
Изменен основной подход к query.count(). Теперь query.count() во всех случаях работает точно:
- запрос.
from_self(func.count(literal_column(„1“))). scalar()
То есть «select count(1) from (<полный запрос>)». Это приводит к созданию подзапроса во всех случаях, но значительно упрощает все попытки count(), которые все равно не удавались во многих сценариях, особенно при наследовании объединенных таблиц и других объединениях. Если подзапрос, создаваемый для очень простого подсчета, действительно является проблемой, используйте query(func.count()) в качестве оптимизации.
References: #2093
некоторые изменения в карте идентификаторов, касающиеся редких обращений к weakref во время итераций. Мьютекс был удален, так как он, по-видимому, может вызвать реентерабельный (т.е. в одном потоке) тупик, возможно, когда gc собирает объекты в точке итерации, чтобы получить больше памяти. Есть надежда, что «словарь изменился во время итерации» будет встречаться крайне редко, поскольку итерационные методы внутренне получают полный список объектов за один вызов values(). В примечании 0.6.7 приведено более консервативное исправление, сохраняющее мьютекс на месте.
References: #2087
Внесение изменений в блок работы заставляет его упорядочивать флеши по зависимостям relationship(), даже если данные объекты не имеют в памяти межатрибутных ссылок, что было характерно для 0.5 и более ранних версий, поэтому флеши родителя/ребенка с набором только внешних/первичных ключей будут успешными. При этом в 0.6 и выше не генерируется тонна бесполезных внутренних структур зависимостей внутри flush, которые не соответствуют состоянию, фактически находящемуся в текущем flush.
References: #2082
Улучшены сообщения об ошибках, выдаваемые при запросе к сущностям только в столбцах в сочетании с (как правило, некорректным) использованием опций загрузчика, когда родительская сущность присутствует не полностью.
References: #2069
Исправлена ошибка в query.options(), из-за которой путь, примененный к lazyload с использованием строковых ключей, мог перекрывать одноименный атрибут на неправильной сущности. В примечании 0.6.7 это исправлено более консервативно.
References: #2098
examples¶
Обновлены примеры ассоциаций и ассоциативных прокси для использования декларативности, добавлен новый пример dict_of_sets_with_default.py, пример ассоциативного прокси, который «расширяет границы».
Пример кэширования Beaker позволяет использовать аргумент «query_cls» в функции query_callable(). (также в 0.6.7)
References: #2090
engine¶
sql¶
Добавлено полностью описательное сообщение об ошибке для случая, когда Column является подклассом и _make_proxy() не может создать копию из-за ошибки TypeError в конструкторе. В этом случае должен быть реализован метод _constructor.
Добавлено новое событие «column_reflect» для объектов Table. Получает информационный словарь о колонке до того, как объект будет сгенерирован в рамках отражения, и позволяет модифицировать словарь для управления большинством аспектов результирующей колонки, включая ключ, имя, тип, информационный словарь.
References: #2095
Для того чтобы событие «column_reflect» использовалось для конкретных объектов Table, а не для всех экземпляров Table, к объекту Table можно добавлять слушателей непосредственно при его построении с помощью нового аргумента «listeners» - списка кортежей вида (<eventname>, <fn>), которые применяются к таблице до начала процесса отражения.
Добавлена новая общая функция «next_value()», принимающая в качестве аргумента объект Sequence и выдающая соответствующую строку генерации «следующего значения» на целевой платформе, если таковая поддерживается. Также предусмотрен метод «.next_value()» для самого Sequence.
References: #2085
func.next_value() или другое SQL-выражение может быть встроено непосредственно в конструкцию insert(), и если в сочетании с колонкой первичного ключа используется неявное или явное «возвращение», то вновь сгенерированное значение будет присутствовать в result.inserted_primary_key.
References: #2084
Добавлены аксессоры для ResultProxy «returns_rows», «is_insert» (также в 0.6.7)
References: #2089
postgresql¶
mssql¶
Переписан запрос, используемый для получения определения представления, как правило, при использовании интерфейса Inspector, с использованием sys.sql_modules вместо информационной схемы, что позволяет полностью возвращать определения представлений длиной более 4000 символов. (также в 0.6.7)
References: #2071
misc¶
Аргументы в __mapper_args__, которые не являются «хэшируемыми», не принимаются за всегда хэшируемые, возможно, столбцовые аргументы. (также в 0.6.7)
References: #2091
Флаг «implicit_returning» в функции create_engine() выполняется, если он установлен в False. (также в 0.6.7)
References: #2083
Добавлен диалект RESERVED_WORDS informix. (также в 0.6.7)
References: #2092
Класс horizontal_shard ShardedSession принимает в качестве аргумента конструктора общий аргумент сессии «query_cls», что позволяет в дальнейшем создавать подклассы ShardedQuery. (также в 0.6.7)
References: #2090
0.7.0b2¶
Released: Sat Feb 19 2011orm¶
Исправлена ошибка, при которой Session.merge() вызывал событие load() со слишком малым числом аргументов.
References: #2053
Добавлена логика, которая предотвращает генерацию событий от расширения MapperExtension или SessionExtension от генерации «ничегонеделающих» событий для всех не переопределенных методов.
References: #2052
examples¶
Пример Beaker теперь учитывает „limit“ и „offset“, параметры связывания во встроенных предложениях FROM (например, при использовании union() или from_self()) при генерации ключа кэша.
sql¶
Переименован класс событий EngineEvents в ConnectionEvents. Поскольку к этим классам никогда не обращаются напрямую в коде конечного пользователя, для конечных пользователей это является исключительно изменением документации. Также упрощен способ внутренней привязки событий к двигателям и соединениям.
References: #2059
Конструкция Sequence() при передаче ей объекта MetaData() через аргумент „metadata“ будет включаться в операторы CREATE/DROP в рамках metadata.create_all() и metadata.drop_all(), включая логику «checkfirst».
References: #2055
Метод Column.references() теперь возвращает True, если в нем есть внешний ключ, ссылающийся именно на данный столбец, а не только на его родительскую таблицу.
References: #2064
postgresql¶
Исправлена ошибка из 0.6, когда типы SMALLINT и BIGINT генерировали SERIAL для целочисленного PK-столбца, вместо SMALLINT и BIGSERIAL
References: #2065
misc¶
Исправлена ошибка, из-за которой композит() с объектами Column, размещенными в строке, не инициализировался. Теперь объекты Column могут быть как встроенными в composite(), так и внешними и подтягиваться по имени или ссылке на объект.
References: #2058
Исправить сообщение об ошибке, ссылающееся на старое имя @classproperty, на ссылку @declared_attr (также в 0.6.7)
References: #2061
словарь в конце кортежа __table_args__ теперь необязателен.
References: #1468
Ассоциативный прокси теперь имеет корректное поведение для any(), has() и contains() при проксировании скалярного атрибута «многие-к-одному» в коллекцию «один-ко-многим» (т.е. обратное «типичному» случаю использования ассоциативного прокси)
References: #2054
0.7.0b1¶
Released: Sat Feb 12 2011general¶
Новая система событий, заменяющая все расширения, слушатели и т.д.
References: #1902
Улучшение ведения журнала
References: #1926
Установка больше не устанавливает плагин Nose
References: #1949
Псевдоним «sqlalchemy.exceptions» в sys.modules был удален. Базовые исключения SQLA доступны через «from sqlalchemy import exc». Псевдоним «exceptions» для «exc» пока остается в «sqlalchemy», он просто не пропатчен в sys.modules.
orm¶
Более лаконичная форма query.join(target, onclause)
References: #1923
Гибридные атрибуты, реализует/заменяет синоним()
References: #1903
Переработка композитов
References: #2008
Расширение события мутации, заменяет «mutable=True».
Мутабельность PickleType и ARRAY по умолчанию отключена
References: #1980
Упрощенное назначение polymorphic_on
References: #1895
Смыв сирот, не имеющих родителей, разрешен
References: #1912
Скорректирован шаг учета flush, который должен происходить до фиксации в случае autocommit=True. Это позволяет autocommit=True корректно работать с expire_on_commit=True, а также позволяет сессионным крючкам post-flush работать в том же транзакционном контексте, что и при autocommit=False.
References: #2041
Предупреждения, выдаваемые, когда члены коллекции, скалярные референты не являются частью flush
References: #1973
Конструкции, не являющиеся производными от Table, могут быть отображены
References: #1876
Имена меток кортежей в Query Improved
References: #1942
Атрибуты сопоставленных столбцов сначала ссылаются на наиболее специфичный столбец
References: #1892
Сопоставление с объединениями с двумя или более одноименными столбцами требует явного объявления
References: #1896
Mapper требует, чтобы колонка polymorphic_on присутствовала в отображаемом selectable
References: #1875
compile_mappers() переименована в configure_mappers(), упрощены внутренние настройки конфигурации
References: #1966
функция aliased(), если ей передать элемент SQL FromClause (т.е. не сопоставленный класс), будет возвращать element.alias(), а не выдавать ошибку AliasedClass.
References: #2018
Session.merge() будет сверять идентификатор версии входящего состояния с идентификатором версии в базе данных, предполагая, что в связке используются идентификаторы версий и входящему состоянию присвоен идентификатор версии, и при несовпадении выдаст ошибку StaleDataError.
References: #2027
Session.connection(), Session.execute() принимают „bind“, чтобы позволить операциям execute/connection участвовать в открытой транзакции движка в явном виде.
References: #1996
Query.join(), Query.outerjoin(), eagerload(), eagerload_all(), другие больше не допускают в качестве аргументов списки атрибутов (т.е. форма option([x, y, z]), deprecated since 0.5)
ScopedSession.mapper удален (deprecated since 0.5).
Горизонтальный запрос к осколку помещает „shard_id“ в context.attributes, где он доступен по событию «load()».
References: #2031
Единый вызов contains_eager() для нескольких сущностей укажет, что все коллекции на этом пути должны быть загружены, вместо того чтобы требовать отдельных вызовов contains_eager() для каждой конечной точки (что никогда не было правильно документировано).
References: #2032
Поле «name», используемое в orm.aliased(), теперь отображается в результирующем SQL-запросе.
Сессия weak_instance_dict=False является устаревшей.
References: #1473
Исключение возникает в том необычном случае, когда append или подобное событие в коллекции происходит после разыменования родительского объекта, что не позволяет пометить родительский объект как «грязный» в сессии. В версии 0.6.6 это было предупреждением.
References: #2046
Query.distinct() теперь принимает в качестве *args выражения столбцов, интерпретируемые диалектом PostgreSQL как DISTINCT ON (<expr>).
References: #1069
Дополнительная настройка загрузки отношений «многие-к-одному» при выполнении flush(). Изменение в версии 0.6.6 ([ticket:2002]) требовало, чтобы во время flush() происходило больше «ненужных» загрузок m2o. Были добавлены дополнительные режимы загрузки, чтобы сократить SQL, выдаваемый в этом конкретном случае, и при этом получить информацию, необходимую для flush, чтобы ничего не упустить.
References: #2049
значение «passive», передаваемое в attributes.get_history(), должно быть одной из констант, определенных в пакете attributes. Передача значения True или False является устаревшей.
Добавлен аргумент name для Query.subquery(), позволяющий назначить объекту псевдонима фиксированное имя. (также в 0.6.7)
References: #2030
Выдается предупреждение, если у мэппера, наследующего объединенную таблицу, нет первичных ключей в локально отображаемой таблице (но есть ключи в таблице суперкласса). (также в 0.6.7)
References: #2019
Исправлена ошибка, при которой «средний» класс в полиморфной иерархии не имел столбца „polymorphic_on“, если в нем не был указан также „polymorphic_identity“, что приводило к странным ошибкам при обновлении, неправильной загрузке класса при запросе от этой цели. Также выдается корректный критерий WHERE при использовании наследования одной таблицы. (также в 0.6.7)
References: #2038
Исправлена ошибка, при которой столбец, имеющий значение по умолчанию на стороне SQL или сервера, исключенный из отображения с помощью include_properties или exclude_properties, приводил к ошибке UnmappedColumnError. (также в 0.6.7)
References: #1995
Предупреждение выдается в том необычном случае, когда append или подобное событие в коллекции происходит после того, как родительский объект был разыменован, что не позволяет пометить родительский объект как «грязный» в сессии. Это будет исключением в версии 0.7. (также в 0.6.7)
References: #2046
sql¶
В классы FunctionElement добавлена функция over(), метод которой порождает конструкцию _Over(), которая в свою очередь порождает «оконные функции», т.е. «<оконная функция> OVER (PARTITION BY <раздел по>, ORDER BY <порядок по>)».
References: #1844
В формулах LIMIT/OFFSET теперь используются параметры привязки
References: #805
Функция select.distinct() теперь принимает в качестве *args выражения столбцов, интерпретируемые диалектом PostgreSQL как DISTINCT ON (<expr>). Заметим, что это уже было доступно через передачу списка в аргумент ключевого слова distinct в select().
References: #1069
select.prefix_with() принимает несколько выражений (т.е. *expr), ключевой аргумент „prefix“ в select() принимает список или кортеж.
Передача строки в аргумент distinct ключевого слова select() для выделения специальных ключевых слов MySQL (DISTINCTROW и т.п.) устарела - используйте для этого prefix_with().
TypeDecorator работает с колонками с первичным ключом
В конструкциях DDL() теперь исключаются знаки процента
References: #1897
Table.c / MetaData.tables немного доработаны, не допускают прямой мутации
Вызываемые переменные, переданные в bindparam(), не оцениваются
References: #1950
types.type_map теперь является приватным, types._type_map
References: #1870
Подчеркнуты методы непубличного пула
References: #1982
Добавлена поддержка NULLS FIRST и NULLS LAST. Она реализована в виде расширения операторов asc() и desc(), которое называется nullsfirst() и nullslast().
References: #723
Конструкция Index() может быть создана в строке с определением таблицы, используя строки в качестве имен столбцов, как альтернатива созданию индекса вне таблицы.
execution_options() on Connection принимает аргумент «isolation_level», устанавливает уровень изоляции транзакций для данного соединения только до возврата в пул соединений, для тех бэкендов, которые это поддерживают (SQLite, PostgreSQL)
References: #2001
В столбце первичного ключа можно использовать TypeDecorator типа Integer, при этом функция «autoincrement» различных диалектов, а также флаг «sqlite_autoincrement» будут считать, что тип базы данных основан на Integer.
References: #2005
Установлена согласованность при наличии server_default в столбце Integer PK. SQLA не осуществляет предварительную выборку таких столбцов, и они не возвращаются в cursor.lastrowid (DBAPI). Убедился, что все бэкенды стабильно возвращают None в result.inserted_primary_key для этих столбцов. Что касается отражения для данного случая, то отражение int PK col с серверным_дефолтом устанавливает флаг «автоинкремент» в False, за исключением случая PG SERIAL col, где мы обнаружили последовательный дефолт.
При определении содержимого result.inserted_primary_key применяются процессоры строк результата с учетом предварительно выполненных значений SQL по умолчанию, а также cursor.lastrowid.
References: #2006
Параметры привязки, присутствующие в «предложении columns» select, теперь автоматически маркируются, как и другие «анонимные» предложения, что, помимо прочего, позволяет их «типу» быть значимым при извлечении строки, как в процессорах строк результатов.
TypeDecorator присутствует в пространстве импорта «sqlalchemy».
Ошибки, не связанные с DBAPI, возникающие в области действия вызова execute(), теперь оборачиваются в sqlalchemy.exc.StatementError, при этом указывается текст SQL-оператора и repr() params. Это облегчает выявление неудачного выполнения оператора до того, как в дело вступит DBAPI.
References: #2015
Концепция связывания «.bind» непосредственно с ClauseElement была явно перенесена в Executable, т.е. в миксин, описывающий ClauseElements, которые представляют собой исполняемые на движке конструкции. Это изменение является улучшением внутренней организации и вряд ли повлияет на реальное использование.
References: #2048
Column.copy(), используемая в table.tometadata(), копирует атрибут „doc“. (также в 0.6.7)
References: #2028
Добавлены некоторые defs в расширение resultproxy.c, чтобы расширение компилировалось и работало на Python 2.4. (также в 0.6.7)
References: #2023
Расширение компилятора теперь поддерживает переопределение компиляции по умолчанию выражения expression._BindParamClause, в результате чего автоматически генерируемые бинды в предложениях VALUES/SET операторов insert()/update() также будут использовать новые правила компиляции. (также в 0.6.7)
References: #2042
Диалект SQLite теперь использует NullPool для файловых баз данных
References: #1921
Путь, указываемый в качестве местоположения базы данных sqlite, теперь нормализуется с помощью функции os.path.abspath(), чтобы изменения каталога внутри процесса не влияли на конечное местоположение относительного пути к файлу.
References: #2036
postgresql¶
При явном выполнении последовательности выводится имя автогенерируемой последовательности столбца SERIAL, что в настоящее время происходит только при implicit_returning=False, теперь учитывается, если имя таблицы + столбца больше 63 символов, используя ту же логику, что и в PostgreSQL. (также в 0.6.7)
References: #1083
В список исключений «disconnect» добавлено дополнительное сообщение libpq - «не удалось получить данные от сервера» (также в 0.6.7)
References: #2044
mysql¶
mssql¶
типы String/Unicode и их аналоги VARCHAR/ NVARCHAR выдают значение «max» в качестве длины, когда длина не указана, так что длина по умолчанию, обычно равная „1“ согласно документации SQL server, вместо этого становится „unbounded“. Это происходит и для типа VARBINARY.
Такое поведение делает эти типы более совместимыми с типом VARCHAR в PostgreSQL, который аналогично является неограниченным, если длина не указана.
References: #1833
misc¶
Подробное описание каждого изменения приведено ниже на сайте: https://docs.sqlalchemy.org/en/latest/changelog/migration_07.html.
Добавлена явная проверка на случай, когда для атрибута столбца декларативного класса используется имя „metadata“. (также в 0.6.7)
References: #2050
Внесены некоторые изменения для поддержки Interbase. Идентификаторы версий FB/Interbase разбираются в структуру типа (8, 1, 1, „interbase“) или (2, 1, 588, „firebird“), чтобы их можно было различать.
References: #1885