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
Исправлена ошибка в
CheckConstraint
DDL, когда флаг «quote» из объектаColumn
не распространялся.References: #2784
postgresql¶
Добавлена поддержка традиционного для PostgreSQL синтаксиса функции SUBSTRING, которая отображается как «SUBSTRING(x FROM y FOR z)» при использовании обычного
func.substring()
. Предоставлено Gunnlaugur Þór Briem.References: #2676
mysql¶
Обновления зарезервированных слов MySQL для версий 5.5, 5.6, любезно предоставленные Ханно Шлихтингом.
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
Исправлена ошибка учета сессий, при которой замена удаленного объекта в карте идентификации на другой объект с тем же первичным ключом вызывала ошибку «conflicting state» при откате(), если замененный первичный ключ был установлен либо с помощью оператора 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¶
Дополнительная корректировка этой проблемы, связанной с SQLite, которая была выпущена в 0.7.9, для перехвата устаревших символов цитирования 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 связывал столбец «version», при использовании функции «version». Тесты любезно предоставлены Дэниелом Миллером.
References: #2539
Дополнительная логика была добавлена к «flush», который происходит в Session.commit(), таким образом, что дополнительное состояние, добавленное хуком after_flush() или after_flush_postexec(), также удаляется в последующем flush, до завершения «commit». Последующие вызовы flush() будут продолжаться до тех пор, пока крючки after_flush не перестанут добавлять новое состояние. Также предусмотрен счетчик «переполнения», равный 100, на случай, если сломанный крючок after_flush() будет каждый раз добавлять новое содержимое.
References: #2566
engine¶
Значительное улучшение использования памяти системой событий; коллекции уровня экземпляра больше не создаются для определенного типа событий, пока не будут созданы слушатели уровня экземпляра для этого события.
References: #2516
Исправлена ошибка, в результате которой отключение detect + dispose, происходящее, когда в пуле QueuePool есть потоки, ожидающие соединения, оставляло эти потоки в ожидании на время таймаута старого пула (или на неопределенное время, если таймаут был отключен). Теперь исправление уведомляет этих ожидающих в специальном исключительном случае и заставляет их перейти на новый пул.
References: #2522
Добавлен импорт gaerdbms в mysql/__init__.py, отсутствие которого препятствовало загрузке нового диалекта 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, приводила к некорректной генерации. Предоставлено Gunnlaugur Þór Briem.
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
Добавили отсутствующие операторы is_(), isnot() в базу ColumnOperators, чтобы эти давно доступные операторы присутствовали в виде методов, как и все остальные операторы.
References: #2544
postgresql¶
Колонки в отраженном ограничении первичного ключа теперь возвращаются в том порядке, в котором их определяет само ограничение, а не как их упорядочивает таблица. Любезно предоставлено Gunnlaugur Þór Briem…
References: #2531
Добавлено „terminating connection“ в список сообщений, которые мы используем для обнаружения разрыва связи с PG, который, похоже, присутствует в некоторых версиях при перезапуске сервера.
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() больше не является устаревшим, так как были выявлены некоторые допустимые случаи его использования.
Исправлена ошибка, из-за которой при использовании subqueryload() из полиморфного отображения в целевое происходило новое обращение к запросу для каждого отдельного класса, встречающегося в полиморфном результате.
References: #2480
Исправлена ошибка в декларативе, при которой приоритет столбцов в объединенной таблице, составной столбец (обычно для id) не был корректным, если столбцы содержали имена, отличные от имен их атрибутов. Это приводило к тому, что такие вещи, как условия первичного соединения, сделанные для атрибутов сущности, были некорректны. Связано с тем, что это должно было быть частью этого, вот это.
Исправлена функция identity_key(), которая не принимала скалярный аргумент для идентификатора. .
References: #2508
Исправлена ошибка, при которой опция populate_existing не распространялась на загрузчики нетерпеливых подзапросов. .
References: #2497
engine¶
Исправлена утечка памяти в C-версии прокси результата, при которой DBAPI, не передающие кортежи на чистом Python для строк результата, не могли корректно уменьшать счетчики ссылок. Наиболее сильно пострадавшим DBAPI является 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¶
удален ненужный пункт таблицы при отражении перечислений. Любезно предоставлено Gunnlaugur Þór Briem.
References: #2510
mysql¶
Добавлен новый диалект для Google App Engine. Предоставлено Ричи Форманом.
References: #2484
oracle¶
Добавлен ROWID в oracle.*.
References: #2483
0.7.7¶
Released: Sat May 05 2012orm¶
Добавлен метод prefix_with() в Query, вызывающий select().prefix_with() для размещения директив MySQL SELECT в операторах. Предоставлено Дианой Кларк
References: #2443
Добавлен новый флаг в @validates include_removes. При значении True события collection remove и attribute del также будут отправляться в функцию валидации, которая принимает дополнительный аргумент «is_remove» при использовании этого флага.
Исправлена проблема в единице работы, когда при установке самореферентного отношения «многие-к-одному», не являющегося None, на 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.somerelationship.like() приводил к переполнению рекурсии, вместо NotImplementedError.
sql¶
Добавлено новое событие подключения dbapi_error(). Вызывается для всех ошибок на уровне DBAPI, передавая исходное исключение DBAPI, прежде чем SQLAlchemy изменит состояние курсора.
Убрано предупреждение, когда индекс создается без столбцов; хотя это может быть не то, что задумал пользователь, это допустимый случай использования, так как индекс может быть держателем только для индекса с определенным именем.
Если conn.begin() не работает при вызове «with engine.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¶
Добавлен промежуточный флаг create_engine supports_unicode_binds для диалекта PyODBC, чтобы указать, передает ли диалект юникодовые литералы Python в PyODBC или нет.
Исправлен флаг use_scope_identity create_engine() при использовании диалекта pyodbc. Ранее этот флаг игнорировался, если был установлен в False. При установке значения False вы будете получать «SELECT @@identity» после каждого INSERT, чтобы получить последний вставленный ID, для тех таблиц, у которых «implicit_returning» установлен в False.
Синтаксис UPDATE..FROM в SQL Server требует, чтобы обновленная таблица присутствовала в предложении FROM, если псевдоним этой таблицы также присутствует в предложении FROM. Теперь обновленная таблица всегда присутствует в FROM, если FROM присутствует в первую очередь. Любезно предоставлено sayap.
References: #2468
0.7.6¶
Released: Wed Mar 14 2012orm¶
Добавлен контекстный менеджер «no_autoflush» в Session, используемый с with: временно отключает автозагрузку.
Добавлен метод cte() в Query, вызывающий поддержку общих табличных выражений из Core (см. ниже).
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
Исправлена ошибка, при которой механика адаптации SQL давала сбой в очень вложенном сценарии, включающем объединенное наследование, объединенную загрузку(), limit() и производную функцию в предложении columns.
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
Добавлен аргумент pool_reset_on_return в create_engine, позволяющий контролировать поведение «возврата соединения». Также добавлены новые аргументы „rollback“, „commit“, None к pool.reset_on_return, чтобы обеспечить больший контроль над активностью возврата соединения.
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, позволяющая использовать объекты SELECT в качестве источника CTE (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 (т.е. 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
Добавлено „LEVEL“ в список зарезервированных слов для Oracle.
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 «can’t set attribute» / «can’t delete attribute» при использовании setattr/delattr на гибриде, который не определяет fset или fdel.
References: #2353
Исправлена ошибка, при которой у распикированного объекта не было достаточно настроенного состояния для корректной работы в событии unpickle(), установленном расширением mutable object, если объекту требовался доступ к атрибутам ORM в __eq__() или подобном.
References: #2362
Исправлена ошибка, при которой каскад «слияния» мог неправильно интерпретировать незагруженный атрибут, если флаг load_on_pending использовался с relationship(). Спасибо Кенту Боуэру за тесты.
References: #2374
Исправлена регрессия из версии 0.6, в результате которой при использовании флага «load_on_pending» relationship(), когда на отложенный объект нужно было выдать не «get()» lazy clause, он не загружался.
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
Добавлены конструкции выражений «false()» и «true()» в пространство имен sqlalchemy.sql, хотя пока не являются частью __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() компилируются в 0 и 1 соответственно в sqlite
References: #2368
удалено ошибочное «повышение» в диалекте SQLite при получении имен таблиц и представлений, где имеется логика возврата к более старой версии SQLite, в которой нет таблицы «sqlite_temp_master».
mssql¶
Скорректировал regexp, используемый в типе mssql.TIME, чтобы обеспечить получение только шести цифр для части значения «микросекунды», что ожидается Python’овским datetime.time(). Обратите внимание, что поддержка отправки микросекунд, по крайней мере в pyodbc, пока невозможна.
References: #2340
Отменили ограничение «30 символов» для pymssql, основываясь на сообщениях о том, что в настоящее время он работает лучше. pymssql не был хорошо протестирован, и поскольку DBAPI находится в движении, все еще неясно, каков статус этого драйвера и как реализация SQLAlchemy должна адаптироваться.
References: #2347
oracle¶
Добавлена ошибка ORA-03135 в бесконечный список ошибок oracle «соединение потеряно».
References: #2388
misc¶
Изменен LRUCache, используемый маппером для кэширования операций 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. Новый пример в документации по отношениям иллюстрирует его использование.
Исправлено поведение обратной ссылки при «выпрыгивании» значения из многие-к-одному в ответ на удаление из устаревшего один-ко-многим - операция пропускается, поскольку многие-к-одному уже были обновлены.
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
значение составного атрибута теперь истекает после операции вставки или обновления, а не регенерируется на месте. Это гарантирует, что значение столбца, срок действия которого истек в пределах флеша, будет загружено первым, прежде чем композит будет регенерирован с использованием этого значения.
References: #2309
Исправление также выдает событие «refresh» при загрузке составного значения при доступе, даже если все значения столбцов уже присутствовали, как и положено. Это исправляет расширение «mutable», которое полагается на событие «load» для обеспечения актуальности словаря _parents, исправления. Спасибо Скотту Торборгу за приведенный здесь тестовый пример.
Исправлена ошибка, при которой подкласс подкласса, использующего конкретное наследование в сочетании с новыми ConcreteBase или AbstractConcreteBase, не применял подклассы глубже одного уровня к «полиморфному загрузчику» каждой базы
References: #2312
Исправлена ошибка, при которой подкласс подкласса, использующего новый AbstractConcreteBase, не получал правильный атрибут «base_mapper» при генерации «базового» маппера, что приводило к сбоям в дальнейшем.
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__ теперь можно передавать как пустой кортеж, так и пустой дикт… Спасибо Фаязу Юсуфу Хану за исправление.
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, если объекты Column используются в качестве ключей в параметре «values» или генеративном методе.
Добавлен аксессор к типам под названием «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 <name> CHECK <expression>».
References: #2305
MetaData() принимает аргументы «schema» и «quote_schema», которые будут применены к одноименным аргументам таблицы или последовательности, оставляя их по умолчанию
None
.Последовательность принимает аргумент «quote_schema»
tometadata() для Table будет использовать «схему» входящих метаданных для новой таблицы, если аргумент schema явно «None»
Добавлены конструкции CreateSchema и DropSchema DDL - они принимают только строковое имя схемы и флаг «quote».
При использовании «схемы по умолчанию» в MetaData, ForeignKey также будет принимать схему «по умолчанию» при определении местоположения удаленной таблицы. Это позволяет применять аргумент «схема» в MetaData к любому набору объектов Table, которые в противном случае не имеют «схемы».
метод «has_schema» был реализован на dialect, но пока работает только на PostgreSQL. Предоставлено Манлио Перилло.
References: #1679
postgresql¶
Добавлен аргумент конструктора create_type в pg.ENUM. При значении False в рамках события создания/удаления таблицы не будет выполняться CREATE/DROP или проверка типа; только методы create()/drop)(), вызываемые напрямую, будут делать это. Помогает при работе с «автономными» скриптами Alembic.
Диалект PostgreSQL запоминает, что ENUM с определенным именем был обработан во время последовательности create/drop. Это позволяет последовательности create/drop работать без каких-либо вызовов «checkfirst», а также означает, что при включенном «checkfirst» проверять ENUM нужно только один раз.
References: #2311
mysql¶
Корректировки Unicode позволяют последней версии 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(), благодаря которой «левая» сторона может быть более гибкой и представлять собой не-ORM selectable, например, подзапрос. Теперь в качестве левой стороны будет использоваться 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 с selectable, содержащей агрегаты или другие производные формы определенного атрибута, при условии, что имя совпадает с именем колонки, отображенной на сущность.
Добавлен новый флаг expire_on_flush=False в column_property(), отмечающий те свойства, которые в противном случае считались бы «readonly», т.е. полученными из SQL-выражений, чтобы сохранить их значение после того, как произошла очистка, включая случаи, когда родительский объект сам участвовал в обновлении.
Усовершенствован инструментарий в ORM для поддержки нового стиля аргументов Py3K «требуемые kw аргументы», т.е. fn(a, b, *, c, d), fn(a, b, *args, c, d). Сигнатуры аргументов метода mapped object’s __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
Запрос будет преобразовывать OFFSET, равный нулю, при нарезке в None, чтобы не вызывать ненужные предложения OFFSET.
Исправлена ситуация, когда mapper не мог полностью обновить внутреннее состояние, когда отношения на новом mapper устанавливали обратную ссылку на первый mapper.
Исправлена ошибка, из-за которой, если __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
Добавлена немного более приятная функция __repr__() в классы SchemaItem. Обратите внимание, что repr здесь не может полностью поддерживать идею «repr - это конструктор», поскольку элементы схемы могут быть очень глубоко вложенными/циклическими, иметь позднюю инициализацию некоторых вещей и т.д.
References: #2223
postgresql¶
Добавлен аргумент «postgresql_using» в Index(), создающий предложение 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
Добавлен параметр mysql_length в конструкцию Index, определяющий «длину» для индексов.
References: #2293
sqlite¶
Убедились, что для недопустимой строки даты/времени/времени, разобранной из базы данных, выдается один и тот же ValueError, независимо от того, используются ли расширения C или нет.
mssql¶
Изменения для попытки поддержки FreeTDS 0.91 с Pyodbc. Это включает в себя то, что строковые привязки отправляются как объекты Python unicode при обнаружении FreeTDS 0.91, и CAST(? AS NVARCHAR) используется, когда мы обнаруживаем для таблицы. Однако, я бы продолжил характеризовать поведение Pyodbc + FreeTDS 0.91 как довольно дрянное, все еще есть много запросов, таких как используемые в отражении, которые вызывают дамп ядра в Linux, и это вообще не пригодно для использования в OSX, MemoryErrors изобилуют и просто сломанная поддержка unicode.
References: #2273
The behavior of =/!= when comparing a scalar select to a value will no longer produce IN/NOT IN as of 0.8; this behavior is a little too heavy handed (use
in_()
if you want to emit IN) and now emits a deprecation warning. To get the 0.8 behavior immediately and remove the warning, a compiler recipe is given at https://www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons to override the behavior of visit_binary().References: #2277
»0» is accepted as an argument for limit() which will produce «TOP 0».
References: #2222
oracle¶
Fixed ReturningResultProxy for zxjdbc dialect.. Regression from 0.6.
References: #2272
The String type now generates VARCHAR2 on Oracle which is recommended as the default VARCHAR. Added an explicit VARCHAR2 and NVARCHAR2 to the Oracle dialect as well. Using NVARCHAR still generates «NVARCHAR2» - there is no «NVARCHAR» on Oracle - this remains a slight breakage of the «uppercase types always give exactly that» policy. VARCHAR still generates «VARCHAR», keeping with the policy. If Oracle were to ever define «VARCHAR» as something different as they claim (IMHO this will never happen), the type would be available.
References: #2252
misc¶
Extra keyword arguments to the base Float type beyond «precision» and «asdecimal» are ignored; added a deprecation warning here and additional docs, related to
References: #2258
SQLSoup will not be included in version 0.8 of SQLAlchemy; while useful, we would like to keep SQLAlchemy itself focused on one ORM usage paradigm. SQLSoup will hopefully soon be superseded by a third party project.
References: #2262
Added local_attr, remote_attr, attr accessors to AssociationProxy, providing quick access to the proxied attributes at the class level.
References: #2236
Changed the update() method on association proxy dictionary to use a duck typing approach, i.e. checks for «keys», to discern between update({}) and update((a, b)). Previously, passing a dictionary that had tuples as keys would be misinterpreted as a sequence.
References: #2275
0.7.2¶
Released: Sun Jul 31 2011orm¶
Feature enhancement: joined and subquery loading will now traverse already-present related objects and collections in search of unpopulated attributes throughout the scope of the eager load being defined, so that the eager loading that is specified via mappings or query options unconditionally takes place for the full depth, populating whatever is not already populated. Previously, this traversal would stop if a related object or collection were already present leading to inconsistent behavior (though would save on loads/cycles for an already-loaded graph). For a subqueryload, this means that the additional SELECT statements emitted by subqueryload will invoke unconditionally, no matter how much of the existing graph is already present (hence the controversy). The previous behavior of «stopping» is still in effect when a query is the result of an attribute-initiated lazyload, as otherwise an «N+1» style of collection iteration can become needlessly expensive when the same related object is encountered repeatedly. There’s also an as-yet-not-public generative Query method _with_invoke_all_eagers() which selects old/new behavior
References: #2213
A rework of «replacement traversal» within the ORM as it alters selectables to be against aliases of things (i.e. clause adaption) includes a fix for multiply-nested any()/has() constructs against a joined table structure.
References: #2195
Fixed bug where query.join() + aliased=True from a joined-inh structure to itself on relationship() with join condition on the child table would convert the lead entity into the joined one inappropriately. Also in 0.6.9.
References: #2234
Fixed regression from 0.6 where Session.add() against an object which contained None in a collection would raise an internal exception. Reverted this to 0.6’s behavior which is to accept the None but obviously nothing is persisted. Ideally, collections with None present or on append() should at least emit a warning, which is being considered for 0.8.
References: #2205
Load of a deferred() attribute on an object where row can’t be located raises ObjectDeletedError instead of failing later on; improved the message in ObjectDeletedError to include other conditions besides a simple «delete».
References: #2191
Fixed regression from 0.6 where a get history operation on some relationship() based attributes would fail when a lazyload would emit; this could trigger within a flush() under certain conditions. Thanks to the user who submitted the great test for this.
References: #2224
Fixed bug apparent only in Python 3 whereby sorting of persistent + pending objects during flush would produce an illegal comparison, if the persistent object primary key is not a single integer. Also in 0.6.9
References: #2228
Fixed bug whereby the source clause used by query.join() would be inconsistent if against a column expression that combined multiple entities together. Also in 0.6.9
References: #2197
Fixed bug whereby if a mapped class redefined __hash__() or __eq__() to something non-standard, which is a supported use case as SQLA should never consult these, the methods would be consulted if the class was part of a «composite» (i.e. non-single-entity) result set. Also in 0.6.9.
References: #2215
Added public attribute «.validators» to Mapper, an immutable dictionary view of all attributes that have been decorated with the @validates decorator. courtesy Stefano Fontanelli
References: #2240
Fixed subtle bug that caused SQL to blow up if: column_property() against subquery + joinedload + LIMIT + order by the column property() occurred. . Also in 0.6.9
References: #2188
The join condition produced by with_parent as well as when using a «dynamic» relationship against a parent will generate unique bindparams, rather than incorrectly repeating the same bindparam. . Also in 0.6.9.
References: #2207
Added the same «columns-only» check to mapper.polymorphic_on as used when receiving user arguments to relationship.order_by, foreign_keys, remote_side, etc.
Fixed bug whereby comparison of column expression to a Query() would not call as_scalar() on the underlying SELECT statement to produce a scalar subquery, in the way that occurs if you called it on Query().subquery().
References: #2190
Fixed declarative bug where a class inheriting from a superclass of the same name would fail due to an unnecessary lookup of the name in the _decl_class_registry.
References: #2194
Repaired the «no statement condition» assertion in Query which would attempt to raise if a generative method were called after from_statement() were called.. Also in 0.6.9.
References: #2199
examples¶
Repaired the examples/versioning test runner to not rely upon SQLAlchemy test libs, nosetests must be run from within examples/versioning to get around setup.cfg breaking it.
Tweak to examples/versioning to pick the correct foreign key in a multi-level inheritance situation.
Fixed the attribute shard example to check for bind param callable correctly in 0.7 style.
engine¶
Context manager provided by Connection.begin() will issue rollback() if the commit() fails, not just if an exception occurs.
Use urllib.parse_qsl() in Python 2.6 and above, no deprecation warning about cgi.parse_qsl()
References: #1682
Added mixin class sqlalchemy.ext.DontWrapMixin. User-defined exceptions of this type are never wrapped in StatementException when they occur in the context of a statement execution.
StatementException wrapping will display the original exception class in the message.
Failures on connect which raise dbapi.Error will forward the error to dialect.is_disconnect() and set the «connection_invalidated» flag if the dialect knows this to be a potentially «retryable» condition. Only Oracle ORA-01033 implemented for now.
References: #2201
sql¶
Fixed two subtle bugs involving column correspondence in a selectable, one with the same labeled subquery repeated, the other when the label has been «grouped» and loses itself. Affects.
References: #2188
schema¶
New feature: with_variant() method on all types. Produces an instance of Variant(), a special TypeDecorator which will select the usage of a different type based on the dialect in use.
References: #2187
Added an informative error message when ForeignKeyConstraint refers to a column name in the parent that is not found. Also in 0.6.9.
Fixed bug whereby adaptation of old append_ddl_listener() function was passing unexpected **kw through to the Table event. Table gets no kws, the MetaData event in 0.6 would get «tables=somecollection», this behavior is preserved.
References: #2206
Fixed bug where «autoincrement» detection on Table would fail if the type had no «affinity» value, in particular this would occur when using the UUID example on the site that uses TypeEngine as the «impl».
Added an improved repr() to TypeEngine objects that will only display constructor args which are positional or kwargs that deviate from the default.
References: #2209
postgresql¶
Added new «postgresql_ops» argument to Index, allows specification of PostgreSQL operator classes for indexed columns. Courtesy Filip Zyzniewski.
References: #2198
mysql¶
Fixed OurSQL dialect to use ansi-neutral quote symbol «“» for XA commands instead of „»“. . Also in 0.6.9.
References: #2186
sqlite¶
SQLite dialect no longer strips quotes off of reflected default value, allowing a round trip CREATE TABLE to work. This is consistent with other dialects that also maintain the exact form of the default.
References: #2189
mssql¶
Adjusted the pyodbc dialect such that bound values are passed as bytes and not unicode if the «Easysoft» unix drivers are detected. This is the same behavior as occurs with FreeTDS. Easysoft appears to segfault if Python unicodes are passed under certain circumstances.
oracle¶
Added ORA-00028 to disconnect codes, use cx_oracle _Error.code to get at the code,. Also in 0.6.9.
References: #2200
Added ORA-01033 to disconnect codes, which can be caught during a connection event.
References: #2201
repaired the oracle.RAW type which did not generate the correct DDL. Also in 0.6.9.
References: #2220
added CURRENT to reserved word list. Also in 0.6.9.
References: #2212
Fixed bug in the mutable extension whereby if the same type were used twice in one mapping, the attributes beyond the first would not get instrumented.
Fixed bug in the mutable extension whereby if None or a non-corresponding type were set, an error would be raised. None is now accepted which assigns None to all attributes, illegal values raise ValueError.
0.7.1¶
Released: Sun Jun 05 2011general¶
Added a workaround for Python bug 7511 where failure of C extension build does not raise an appropriate exception on Windows 64 bit + VC express
References: #2184
orm¶
»delete-orphan» cascade is now allowed on self-referential relationships - this since SQLA 0.7 no longer enforces «parent with no child» at the ORM level; this check is left up to foreign key nullability. Related to
References: #1912
Repaired new «mutable» extension to propagate events to subclasses correctly; don’t create multiple event listeners for subclasses either.
References: #2180
Modify the text of the message which occurs when the «identity» key isn’t detected on flush, to include the common cause that the Column isn’t set up to detect auto-increment correctly;. Also in 0.6.8.
References: #2170
Fixed bug where transaction-level «deleted» collection wouldn’t be cleared of expunged states, raising an error if they later became transient. Also in 0.6.8.
References: #2182
engine¶
Deprecate schema/SQL-oriented methods on Connection/Engine that were never well known and are redundant: reflecttable(), create(), drop(), text(), engine.func
Adjusted the __contains__() method of a RowProxy result row such that no exception throw is generated internally; NoSuchColumnError() also will generate its message regardless of whether or not the column construct can be coerced to a string.. Also in 0.6.8.
References: #2178
sql¶
Fixed bug whereby metadata.reflect(bind) would close a Connection passed as a bind argument. Regression from 0.6.
Streamlined the process by which a Select determines what’s in its „.c“ collection. Behaves identically, except that a raw ClauseList() passed to select([]) (which is not a documented case anyway) will now be expanded into its individual column elements instead of being ignored.
postgresql¶
Some unit test fixes regarding numeric arrays, MATCH operator. A potential floating-point inaccuracy issue was fixed, and certain tests of the MATCH operator only execute within an EN-oriented locale for now. . Also in 0.6.8.
References: #2175
mysql¶
Unit tests pass 100% on MySQL installed on windows.
Removed the «adjust casing» step that would fail when reflecting a table on MySQL on windows with a mixed case name. After some experimenting with a windows MySQL server, it’s been determined that this step wasn’t really helping the situation much; MySQL does not return FK names with proper casing on non-windows platforms either, and removing the step at least allows the reflection to act more like it does on other OSes. A warning here has been considered but its difficult to determine under what conditions such a warning can be raised, so punted on that for now - added some docs instead.
References: #2181
supports_sane_rowcount will be set to False if using MySQLdb and the DBAPI doesn’t provide the constants.CLIENT module.
sqlite¶
Accept None from cursor.fetchone() when «PRAGMA read_uncommitted» is called to determine current isolation mode at connect time and default to SERIALIZABLE; this to support SQLite versions pre-3.3.0 that did not have this feature.
References: #2173
0.7.0¶
Released: Fri May 20 2011orm¶
Fixed regression introduced in 0.7b4 (!) whereby query.options(someoption(«nonexistent name»)) would fail to raise an error. Also added additional error catching for cases where the option would try to build off a column-based element, further fixed up some of the error messages tailored in
References: #2069
query.count() emits «count(*)» instead of «count(1)».
References: #2162
Fine tuning of Query clause adaptation when from_self(), union(), or other «select from myself» operation, such that plain SQL expression elements added to filter(), order_by() etc. which are present in the nested «from myself» query will be adapted in the same way an ORM expression element will, since these elements are otherwise not easily accessible.
References: #2155
Fixed bug where determination of «self referential» relationship would fail with no workaround for joined-inh subclass related to itself, or joined-inh subclass related to a subclass of that with no cols in the sub-sub class in the join condition. Also in 0.6.8.
References: #2149
mapper() will ignore non-configured foreign keys to unrelated tables when determining inherit condition between parent and child class, but will raise as usual for unresolved columns and table names regarding the inherited table. This is an enhanced generalization of behavior that was already applied to declarative previously. 0.6.8 has a more conservative version of this which doesn’t fundamentally alter how join conditions are determined.
References: #2153
It is an error to call query.get() when the given entity is not a single, full class entity or mapper (i.e. a column). This is a deprecation warning in 0.6.8.
References: #2144
Fixed a potential KeyError which under some circumstances could occur with the identity map, part of
References: #2148
added Query.with_session() method, switches Query to use a different session.
horizontal shard query should use execution options per connection as per
References: #2131
a non_primary mapper will inherit the _identity_class of the primary mapper. This so that a non_primary established against a class that’s normally in an inheritance mapping will produce results that are identity-map compatible with that of the primary mapper (also in 0.6.8)
References: #2151
Fixed the error message emitted for «can’t execute syncrule for destination column „q“; mapper „X“ does not map this column» to reference the correct mapper. . Also in 0.6.8.
References: #2163
polymorphic_union() gets a «cast_nulls» option, disables the usage of CAST when it renders the labeled NULL columns.
References: #1502
polymorphic_union() renders the columns in their original table order, as according to the first table/selectable in the list of polymorphic unions in which they appear. (which is itself an unordered mapping unless you pass an OrderedDict).
Fixed bug whereby mapper mapped to an anonymous alias would fail if logging were used, due to unescaped % sign in the alias name. Also in 0.6.8.
References: #2171
examples¶
removed the ancient «polymorphic association» examples and replaced with an updated set of examples that use declarative mixins, «generic_associations». Each presents an alternative table layout.
sql¶
Fixed bug whereby nesting a label of a select() with another label in it would produce incorrect exported columns. Among other things this would break an ORM column_property() mapping against another column_property(). . Also in 0.6.8
References: #2167
Changed the handling in determination of join conditions such that foreign key errors are only considered between the two given tables. That is, t1.join(t2) will report FK errors that involve „t1“ or „t2“, but anything involving „t3“ will be skipped. This affects join(), as well as ORM relationship and inherit condition logic.
Some improvements to error handling inside of the execute procedure to ensure auto-close connections are really closed when very unusual DBAPI errors occur.
metadata.reflect() and reflection.Inspector() had some reliance on GC to close connections which were internally procured, fixed this.
Added explicit check for when Column .name is assigned as blank string
References: #2140
Fixed bug whereby if FetchedValue was passed to column server_onupdate, it would not have its parent «column» assigned, added test coverage for all column default assignment patterns. also in 0.6.8
References: #2147
postgresql¶
Fixed the psycopg2_version parsing in the psycopg2 dialect.
Fixed bug affecting PG 9 whereby index reflection would fail if against a column whose name had changed. . Also in 0.6.8.
References: #2141
mssql¶
Fixed bug in MSSQL dialect whereby the aliasing applied to a schema-qualified table would leak into enclosing select statements. Also in 0.6.8.
References: #2169
misc¶
This section documents those changes from 0.7b4 to 0.7.0. For an overview of what’s new in SQLAlchemy 0.7, see https://docs.sqlalchemy.org/en/latest/changelog/migration_07.html
Removed the usage of the «collections.MutableMapping» abc from the ext.mutable docs as it was being used incorrectly and makes the example more difficult to understand in any case.
References: #2152
Fixed bugs in sqlalchemy.ext.mutable extension where None was not appropriately handled, replacement events were not appropriately handled.
References: #2143
0.7.0b4¶
Released: Sun Apr 17 2011general¶
Changes to the format of CHANGES, this file. The format changes have been applied to the 0.7 releases.
The «-declarative» changes will now be listed directly under the «-orm» section, as these are closely related.
The 0.5 series changes have been moved to the file CHANGES_PRE_06 which replaces CHANGES_PRE_05.
The changelog for 0.6.7 and subsequent within the 0.6 series is now listed only in the CHANGES file within the 0.6 branch. In the 0.7 CHANGES file (i.e. this file), all the 0.6 changes are listed inline within the 0.7 section in which they were also applied (since all 0.6 changes are in 0.7 as well). Changes that apply to an 0.6 version here are noted as are if any differences in implementation/behavior are present.
orm¶
Some fixes to «evaluate» and «fetch» evaluation when query.update(), query.delete() are called. The retrieval of records is done after autoflush in all cases, and before update/delete is emitted, guarding against unflushed data present as well as expired objects failing during the evaluation.
References: #2122
Reworded the exception raised when a flush is attempted of a subclass that is not polymorphic against the supertype.
References: #2063
Still more wording adjustments when a query option can’t find the target entity. Explain that the path must be from one of the root entities.
Some fixes to the state handling regarding backrefs, typically when autoflush=False, where the back-referenced collection wouldn’t properly handle add/removes with no net change. Thanks to Richard Murri for the test case + patch. (also in 0.6.7).
References: #2123
Added checks inside the UOW to detect the unusual condition of being asked to UPDATE or DELETE on a primary key value that contains NULL in it.
References: #2127
Some refinements to attribute history. More changes are pending possibly in 0.8, but for now history has been modified such that scalar history doesn’t have a «side effect» of populating None for a non-present value. This allows a slightly better ability to distinguish between a None set and no actual change, affects as well.
References: #2127
a «having» clause would be copied from the inside to the outside query if from_self() were used; in particular this would break an 0.7 style count() query. (also in 0.6.7)
References: #2130
the Query.execution_options() method now passes those options to the Connection rather than the SELECT statement, so that all available options including isolation level and compiled cache may be used.
References: #2131
engine¶
The C extension is now enabled by default on CPython 2.x with a fallback to pure python if it fails to compile.
References: #2129
sql¶
The «compiled_cache» execution option now raises an error when passed to a SELECT statement rather than a Connection. Previously it was being ignored entirely. We may look into having this option work on a per-statement level at some point.
References: #2131
Restored the «catchall» constructor on the base TypeEngine class, with a deprecation warning. This so that code which does something like Integer(11) still succeeds.
Fixed regression whereby MetaData() coming back from unpickling did not keep track of new things it keeps track of now, i.e. collection of Sequence objects, list of schema names.
References: #2104
The limit/offset keywords to select() as well as the value passed to select.limit()/offset() will be coerced to integer. (also in 0.6.7)
References: #2116
fixed bug where «from» clause gathering from an over() clause would be an itertools.chain() and not a list, causing «can only concatenate list» TypeError when combined with other clauses.
Fixed incorrect usage of «,» in over() clause being placed between the «partition» and «order by» clauses.
References: #2134
Before/after attach events for PrimaryKeyConstraint now function, tests added for before/after events on all constraint types.
References: #2105
Added explicit true()/false() constructs to expression lib - coercion rules will intercept «False»/»True» into these constructs. In 0.6, the constructs were typically converted straight to string, which was no longer accepted in 0.7.
References: #2117
schema¶
The „useexisting“ flag on Table has been superseded by a new pair of flags „keep_existing“ and „extend_existing“. „extend_existing“ is equivalent to „useexisting“ - the existing Table is returned, and additional constructor elements are added. With „keep_existing“, the existing Table is returned, but additional constructor elements are not added - these elements are only applied when the Table is newly created.
References: #2109
postgresql¶
Psycopg2 for Python 3 is now supported.
Fixed support for precision numerics when using pg8000.
References: #2132
sqlite¶
Fixed bug where reflection of foreign key created as «REFERENCES <tablename>» without col name would fail. (also in 0.6.7)
References: #2115
oracle¶
Using column names that would require quotes for the column itself or for a name-generated bind parameter, such as names with special characters, underscores, non-ascii characters, now properly translate bind parameter keys when talking to cx_oracle. (Also in 0.6.7)
References: #2100
Oracle dialect adds use_binds_for_limits=False create_engine() flag, will render the LIMIT/OFFSET values inline instead of as binds, reported to modify the execution plan used by Oracle. (Also in 0.6.7)
References: #2116
misc¶
REAL has been added to the core types. Supported by PostgreSQL, SQL Server, MySQL, SQLite. Note that the SQL Server and MySQL versions, which add extra arguments, are also still available from those dialects.
References: #2081
Added @event.listens_for() decorator, given target + event name, applies the decorated function as a listener.
References: #2106
AssertionPool now stores the traceback indicating where the currently checked out connection was acquired; this traceback is reported within the assertion raised upon a second concurrent checkout; courtesy Gunnlaugur Briem
References: #2103
The «pool.manage» feature doesn’t use pickle anymore to hash the arguments for each pool.
Documented SQLite DATE/TIME/DATETIME types. (also in 0.6.7)
References: #2029
Fixed mutable extension docs to show the correct type-association methods.
References: #2118
0.7.0b3¶
Released: Sun Mar 20 2011general¶
Lots of fixes to unit tests when run under PyPy (courtesy Alex Gaynor).
orm¶
Changed the underlying approach to query.count(). query.count() is now in all cases exactly:
- query.
from_self(func.count(literal_column(„1“))). scalar()
That is, «select count(1) from (<full query>)». This produces a subquery in all cases, but vastly simplifies all the guessing count() tried to do previously, which would still fail in many scenarios particularly when joined table inheritance and other joins were involved. If the subquery produced for an otherwise very simple count is really an issue, use query(func.count()) as an optimization.
References: #2093
some changes to the identity map regarding rare weakref callbacks during iterations. The mutex has been removed as it apparently can cause a reentrant (i.e. in one thread) deadlock, perhaps when gc collects objects at the point of iteration in order to gain more memory. It is hoped that «dictionary changed during iteration» will be exceedingly rare as iteration methods internally acquire the full list of objects in a single values() call. Note 0.6.7 has a more conservative fix here which still keeps the mutex in place.
References: #2087
A tweak to the unit of work causes it to order the flush along relationship() dependencies even if the given objects don’t have any inter-attribute references in memory, which was the behavior in 0.5 and earlier, so a flush of Parent/Child with only foreign key/primary key set will succeed. This while still maintaining 0.6 and above’s not generating a ton of useless internal dependency structures within the flush that don’t correspond to state actually within the current flush.
References: #2082
Improvements to the error messages emitted when querying against column-only entities in conjunction with (typically incorrectly) using loader options, where the parent entity is not fully present.
References: #2069
Fixed bug in query.options() whereby a path applied to a lazyload using string keys could overlap a same named attribute on the wrong entity. Note 0.6.7 has a more conservative fix to this.
References: #2098
examples¶
Updated the association, association proxy examples to use declarative, added a new example dict_of_sets_with_default.py, a «pushing the envelope» example of association proxy.
The Beaker caching example allows a «query_cls» argument to the query_callable() function. (also in 0.6.7)
References: #2090
engine¶
sql¶
Added a fully descriptive error message for the case where Column is subclassed and _make_proxy() fails to make a copy due to TypeError on the constructor. The method _constructor should be implemented in this case.
Added new event «column_reflect» for Table objects. Receives the info dictionary about a Column before the object is generated within reflection, and allows modification to the dictionary for control over most aspects of the resulting Column including key, name, type, info dictionary.
References: #2095
To help with the «column_reflect» event being used with specific Table objects instead of all instances of Table, listeners can be added to a Table object inline with its construction using a new argument «listeners», a list of tuples of the form (<eventname>, <fn>), which are applied to the Table before the reflection process begins.
Added new generic function «next_value()», accepts a Sequence object as its argument and renders the appropriate «next value» generation string on the target platform, if supported. Also provides «.next_value()» method on Sequence itself.
References: #2085
func.next_value() or other SQL expression can be embedded directly into an insert() construct, and if implicit or explicit «returning» is used in conjunction with a primary key column, the newly generated value will be present in result.inserted_primary_key.
References: #2084
Added accessors to ResultProxy «returns_rows», «is_insert» (also in 0.6.7)
References: #2089
postgresql¶
mssql¶
Rewrote the query used to get the definition of a view, typically when using the Inspector interface, to use sys.sql_modules instead of the information schema, thereby allowing views definitions longer than 4000 characters to be fully returned. (also in 0.6.7)
References: #2071
firebird¶
The «implicit_returning» flag on create_engine() is honored if set to False. (also in 0.6.7)
References: #2083
misc¶
Arguments in __mapper_args__ that aren’t «hashable» aren’t mistaken for always-hashable, possibly-column arguments. (also in 0.6.7)
References: #2091
Added RESERVED_WORDS informix dialect. (also in 0.6.7)
References: #2092
The horizontal_shard ShardedSession class accepts the common Session argument «query_cls» as a constructor argument, to enable further subclassing of ShardedQuery. (also in 0.6.7)
References: #2090
0.7.0b2¶
Released: Sat Feb 19 2011orm¶
examples¶
Beaker example now takes into account „limit“ and „offset“, bind params within embedded FROM clauses (like when you use union() or from_self()) when generating a cache key.
sql¶
Renamed the EngineEvents event class to ConnectionEvents. As these classes are never accessed directly by end-user code, this strictly is a documentation change for end users. Also simplified how events get linked to engines and connections internally.
References: #2059
The Sequence() construct, when passed a MetaData() object via its „metadata“ argument, will be included in CREATE/DROP statements within metadata.create_all() and metadata.drop_all(), including «checkfirst» logic.
References: #2055
The Column.references() method now returns True if it has a foreign key referencing the given column exactly, not just its parent table.
References: #2064
postgresql¶
Fixed regression from 0.6 where SMALLINT and BIGINT types would both generate SERIAL on an integer PK column, instead of SMALLINT and BIGSERIAL
References: #2065
misc¶
Fixed regression whereby composite() with Column objects placed inline would fail to initialize. The Column objects can now be inline with the composite() or external and pulled in via name or object ref.
References: #2058
Fix error message referencing old @classproperty name to reference @declared_attr (also in 0.6.7)
References: #2061
the dictionary at the end of the __table_args__ tuple is now optional.
References: #1468
Association proxy now has correct behavior for any(), has(), and contains() when proxying a many-to-one scalar attribute to a one-to-many collection (i.e. the reverse of the „typical“ association proxy use case)
References: #2054
0.7.0b1¶
Released: Sat Feb 12 2011general¶
New event system, supersedes all extensions, listeners, etc.
References: #1902
Logging enhancements
References: #1926
Setup no longer installs a Nose plugin
References: #1949
The «sqlalchemy.exceptions» alias in sys.modules has been removed. Base SQLA exceptions are available via «from sqlalchemy import exc». The «exceptions» alias for «exc» remains in «sqlalchemy» for now, it’s just not patched into sys.modules.
orm¶
More succinct form of query.join(target, onclause)
References: #1923
Hybrid Attributes, implements/supersedes synonym()
References: #1903
Rewrite of composites
References: #2008
Mutation Event Extension, supersedes «mutable=True»
PickleType and ARRAY mutability turned off by default
References: #1980
Simplified polymorphic_on assignment
References: #1895
Flushing of Orphans that have no parent is allowed
References: #1912
Adjusted flush accounting step to occur before the commit in the case of autocommit=True. This allows autocommit=True to work appropriately with expire_on_commit=True, and also allows post-flush session hooks to operate in the same transactional context as when autocommit=False.
References: #2041
Warnings generated when collection members, scalar referents not part of the flush
References: #1973
Non-Table-derived constructs can be mapped
References: #1876
Tuple label names in Query Improved
References: #1942
Mapped column attributes reference the most specific column first
References: #1892
Mapping to joins with two or more same-named columns requires explicit declaration
References: #1896
Mapper requires that polymorphic_on column be present in the mapped selectable
References: #1875
compile_mappers() renamed configure_mappers(), simplified configuration internals
References: #1966
the aliased() function, if passed a SQL FromClause element (i.e. not a mapped class), will return element.alias() instead of raising an error on AliasedClass.
References: #2018
Session.merge() will check the version id of the incoming state against that of the database, assuming the mapping uses version ids and incoming state has a version_id assigned, and raise StaleDataError if they don’t match.
References: #2027
Session.connection(), Session.execute() accept „bind“, to allow execute/connection operations to participate in the open transaction of an engine explicitly.
References: #1996
Query.join(), Query.outerjoin(), eagerload(), eagerload_all(), others no longer allow lists of attributes as arguments (i.e. option([x, y, z]) form, deprecated since 0.5)
ScopedSession.mapper is removed (deprecated since 0.5).
Horizontal shard query places „shard_id“ in context.attributes where it’s accessible by the «load()» event.
References: #2031
A single contains_eager() call across multiple entities will indicate all collections along that path should load, instead of requiring distinct contains_eager() calls for each endpoint (which was never correctly documented).
References: #2032
The «name» field used in orm.aliased() now renders in the resulting SQL statement.
Session weak_instance_dict=False is deprecated.
References: #1473
An exception is raised in the unusual case that an append or similar event on a collection occurs after the parent object has been dereferenced, which prevents the parent from being marked as «dirty» in the session. Was a warning in 0.6.6.
References: #2046
Query.distinct() now accepts column expressions as *args, interpreted by the PostgreSQL dialect as DISTINCT ON (<expr>).
References: #1069
Additional tuning to «many-to-one» relationship loads during a flush(). A change in version 0.6.6 ([ticket:2002]) required that more «unnecessary» m2o loads during a flush could occur. Extra loading modes have been added so that the SQL emitted in this specific use case is trimmed back, while still retrieving the information the flush needs in order to not miss anything.
References: #2049
the value of «passive» as passed to attributes.get_history() should be one of the constants defined in the attributes package. Sending True or False is deprecated.
Added a name argument to Query.subquery(), to allow a fixed name to be assigned to the alias object. (also in 0.6.7)
References: #2030
A warning is emitted when a joined-table inheriting mapper has no primary keys on the locally mapped table (but has pks on the superclass table). (also in 0.6.7)
References: #2019
Fixed bug where «middle» class in a polymorphic hierarchy would have no „polymorphic_on“ column if it didn’t also specify a „polymorphic_identity“, leading to strange errors upon refresh, wrong class loaded when querying from that target. Also emits the correct WHERE criterion when using single table inheritance. (also in 0.6.7)
References: #2038
Fixed bug where a column with a SQL or server side default that was excluded from a mapping with include_properties or exclude_properties would result in UnmappedColumnError. (also in 0.6.7)
References: #1995
A warning is emitted in the unusual case that an append or similar event on a collection occurs after the parent object has been dereferenced, which prevents the parent from being marked as «dirty» in the session. This will be an exception in 0.7. (also in 0.6.7)
References: #2046
sql¶
Added over() function, method to FunctionElement classes, produces the _Over() construct which in turn generates «window functions», i.e. «<window function> OVER (PARTITION BY <partition by>, ORDER BY <order by>)».
References: #1844
LIMIT/OFFSET clauses now use bind parameters
References: #805
select.distinct() now accepts column expressions as *args, interpreted by the PostgreSQL dialect as DISTINCT ON (<expr>). Note this was already available via passing a list to the distinct keyword argument to select().
References: #1069
select.prefix_with() accepts multiple expressions (i.e. *expr), „prefix“ keyword argument to select() accepts a list or tuple.
Passing a string to the distinct keyword argument of select() for the purpose of emitting special MySQL keywords (DISTINCTROW etc.) is deprecated - use prefix_with() for this.
TypeDecorator works with primary key columns
DDL() constructs now escape percent signs
References: #1897
Table.c / MetaData.tables refined a bit, don’t allow direct mutation
Callables passed to bindparam() don’t get evaluated
References: #1950
types.type_map is now private, types._type_map
References: #1870
Non-public Pool methods underscored
References: #1982
Added NULLS FIRST and NULLS LAST support. It’s implemented as an extension to the asc() and desc() operators, called nullsfirst() and nullslast().
References: #723
The Index() construct can be created inline with a Table definition, using strings as column names, as an alternative to the creation of the index outside of the Table.
execution_options() on Connection accepts «isolation_level» argument, sets transaction isolation level for that connection only until returned to the connection pool, for those backends which support it (SQLite, PostgreSQL)
References: #2001
A TypeDecorator of Integer can be used with a primary key column, and the «autoincrement» feature of various dialects as well as the «sqlite_autoincrement» flag will honor the underlying database type as being Integer-based.
References: #2005
Established consistency when server_default is present on an Integer PK column. SQLA doesn’t pre-fetch these, nor do they come back in cursor.lastrowid (DBAPI). Ensured all backends consistently return None in result.inserted_primary_key for these. Regarding reflection for this case, reflection of an int PK col with a server_default sets the «autoincrement» flag to False, except in the case of a PG SERIAL col where we detected a sequence default.
Result-row processors are applied to pre-executed SQL defaults, as well as cursor.lastrowid, when determining the contents of result.inserted_primary_key.
References: #2006
Bind parameters present in the «columns clause» of a select are now auto-labeled like other «anonymous» clauses, which among other things allows their «type» to be meaningful when the row is fetched, as in result row processors.
TypeDecorator is present in the «sqlalchemy» import space.
Non-DBAPI errors which occur in the scope of an execute() call are now wrapped in sqlalchemy.exc.StatementError, and the text of the SQL statement and repr() of params is included. This makes it easier to identify statement executions which fail before the DBAPI becomes involved.
References: #2015
The concept of associating a «.bind» directly with a ClauseElement has been explicitly moved to Executable, i.e. the mixin that describes ClauseElements which represent engine-executable constructs. This change is an improvement to internal organization and is unlikely to affect any real-world usage.
References: #2048
Column.copy(), as used in table.tometadata(), copies the „doc“ attribute. (also in 0.6.7)
References: #2028
Added some defs to the resultproxy.c extension so that the extension compiles and runs on Python 2.4. (also in 0.6.7)
References: #2023
The compiler extension now supports overriding the default compilation of expression._BindParamClause including that the auto-generated binds within the VALUES/SET clause of an insert()/update() statement will also use the new compilation rules. (also in 0.6.7)
References: #2042
SQLite dialect now uses NullPool for file-based databases
References: #1921
The path given as the location of a sqlite database is now normalized via os.path.abspath(), so that directory changes within the process don’t affect the ultimate location of a relative file path.
References: #2036
postgresql¶
When explicit sequence execution derives the name of the auto-generated sequence of a SERIAL column, which currently only occurs if implicit_returning=False, now accommodates if the table + column name is greater than 63 characters using the same logic PostgreSQL uses. (also in 0.6.7)
References: #1083
Added an additional libpq message to the list of «disconnect» exceptions, «could not receive data from server» (also in 0.6.7)
References: #2044
mysql¶
mssql¶
the String/Unicode types, and their counterparts VARCHAR/ NVARCHAR, emit «max» as the length when no length is specified, so that the default length, normally „1“ as per SQL server documentation, is instead „unbounded“. This also occurs for the VARBINARY type..
This behavior makes these types more closely compatible with PostgreSQL’s VARCHAR type which is similarly unbounded when no length is specified.
References: #1833
firebird¶
Some adjustments so that Interbase is supported as well. FB/Interbase version idents are parsed into a structure such as (8, 1, 1, „interbase“) or (2, 1, 588, „firebird“) so they can be distinguished.
References: #1885
misc¶
Detailed descriptions of each change below are described at: https://docs.sqlalchemy.org/en/latest/changelog/migration_07.html
Added an explicit check for the case that the name „metadata“ is used for a column attribute on a declarative class. (also in 0.6.7)
References: #2050