0.7 Changelog

0.7.11

no release date

orm

  • [orm] [bug]

    Исправлена ошибка, при которой инструментарий списка не мог корректно представить фрагмент набора [0:0], что, в частности, могло произойти при использовании insert(0, item) с прокси ассоциации. Из-за некоторой причуды в коллекциях Python эта проблема была гораздо более вероятна в Python 3, а не в 2.

    References: #2807

  • [orm] [bug]

    Исправлена ошибка, когда запрос вида: query(SubClass).options(subqueryload(Baseclass.attrname)), где SubClass является объединенным входом BaseClass, не применял JOIN внутри подзапроса на загрузку атрибутов, создавая картезианское произведение. Наполненные результаты все еще оставались правильными, поскольку дополнительные строки просто игнорировались, поэтому эта проблема может проявляться как снижение производительности в приложениях, которые в остальном работают правильно.

    References: #2699

  • [orm] [bug]

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

    References: #2689

  • [orm] [bug]

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

    References: #2674

  • [orm] [bug]

    Предупреждение выдается, когда MapperProperty присваивается отображателю, который заменяет существующее свойство, если рассматриваемые свойства не являются обычными свойствами на основе столбцов. Замена свойств отношений редко (никогда?) является тем, что задумано, и обычно относится к неправильной конфигурации отображателя. Это также предупреждает, если обратная ссылка настраивается поверх существующей в отношениях наследования (что является ошибкой в 0.8).

    References: #2674

engine

  • [engine] [bug]

    Regexp, используемый функцией make_url(), теперь разбирает адреса ipv6, например, окруженные скобками.

    References: #2851

sql

  • [sql] [bug]

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

    References: #2801

  • [sql] [bug] [cte]

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

    References: #2783

  • [sql] [bug]

    Исправлена ошибка в CheckConstraint DDL, когда флаг «quote» из объекта Column не распространялся.

    References: #2784

postgresql

  • [postgresql] [feature]

    Добавлена поддержка традиционного для PostgreSQL синтаксиса функции SUBSTRING, которая отображается как «SUBSTRING(x FROM y FOR z)» при использовании обычного func.substring(). Предоставлено Gunnlaugur Þór Briem.

    References: #2676

mysql

  • [mysql] [bug]

    Обновления зарезервированных слов MySQL для версий 5.5, 5.6, любезно предоставленные Ханно Шлихтингом.

    References: #2791

tests

  • [tests] [bug]

    Исправлен импорт «logging» в test_execute, который не работал на некоторых платформах linux.

    References: #2669, pull request 41

0.7.10

Released: Thu Feb 7 2013

orm

  • [orm] [bug]

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

    References: #2650

  • [orm] [bug]

    Query.merge_result() теперь может загружать строки из внешнего объединения, где сущность может быть None без возникновения ошибки.

    References: #2640

  • [orm] [bug]

    Тип MutableComposite не позволял использовать метод MutableBase.coerce(), хотя код, казалось, указывал на это, так что теперь это работает, и добавлен краткий пример. Как побочный эффект, механика этого обработчика событий была изменена таким образом, что новые типы MutableComposite больше не добавляют глобальные обработчики событий для каждого типа. Также в 0.8.0b2.

    References: #2624

  • [orm] [bug]

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

    References: #2583

engine

  • [engine] [bug]

    Исправлено MetaData.reflect() для корректного использования заданного Connection, если оно задано, без открытия второго соединения из Engine этого соединения.

    References: #2604

sql

  • [sql] [bug]

    Резервная корректировка __repr__ для TypeDecorator до 0.7, позволяет PickleType производить чистый repr(), чтобы помочь с Alembic.

    References: #2584, #2594

  • [sql] [bug]

    Исправлена ошибка, при которой Table.tometadata() завершалось неудачей, если Column имел как внешний ключ, так и альтернативное имя «.key» для столбца.

    References: #2643

  • [sql] [bug]

    Исправлена ошибка, при которой использование server_onupdate=<FetchedValue|DefaultClause> без передачи флага «for_update=True» применяло объект по умолчанию к server_default, уничтожая все, что там было. Явный аргумент for_update=True не должен быть нужен при таком использовании (тем более, что в документации показан пример без его использования), так что теперь это организовано внутренне с использованием копии данного объекта по умолчанию, если флаг не установлен на то, что соответствует этому аргументу.

    References: #2631

  • [sql] [gae] [mysql]

    Добавлен условный импорт в диалект gaerdbms, который пытается импортировать rdbms_apiproxy против rdbms_googleapi для работы на платформах dev и production. Также теперь учитывается атрибут instance. Любезно предоставлено Шоном Линчем. Также перенесены улучшения, позволяющие использовать имя пользователя/пароль, а также исправлена интерпретация кода ошибки из 0.8.

    References: #2649

mysql

  • [mysql] [feature]

    Добавлен флаг «raise_on_warnings» для диалекта OurSQL.

    References: #2523

  • [mysql] [feature]

    Добавлен флаг «read_timeout» в диалект MySQLdb.

    References: #2554

sqlite

  • [sqlite] [bug]

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

    References: #2568

mssql

  • [mssql] [bug]

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

  • [mssql] [bug]

    Добавлено Py3K условие вокруг ненужного вызова .decode() в информационной схеме mssql, исправляет отражение в Py3k.

    References: #2638

oracle

  • [oracle] [bug]

    Тип Oracle LONG, хотя и является неограниченным текстовым типом, не использует тип cx_Oracle.LOB, когда возвращаются строки результата, поэтому диалект был исправлен, чтобы исключить LONG из фильтрации cx_Oracle.LOB.

    References: #2620

  • [oracle] [bug]

    Исправлено использование .prepare() в сочетании с cx_Oracle таким образом, что возвращаемое значение False приводит к отсутствию вызова connection.commit(), что позволяет избежать ошибок «нет транзакции». Теперь было показано, что двухфазные транзакции рудиментарно работают с SQLAlchemy и cx_oracle, однако на них распространяются оговорки, наблюдаемые в драйвере; подробности можно узнать из документации.

    References: #2611

  • [oracle] [bug]

    изменен список типов cx_oracle, которые исключаются из шага setinputsizes(), теперь он включает только STRING и UNICODE; CLOB и NCLOB удалены. Это сделано для того, чтобы обойти поведение cx_oracle, которое нарушено для вызова executemany(). В 0.8 применяется то же самое изменение, однако оно также настраивается с помощью аргумента exclude_setinputsizes.

    References: #2561

0.7.9

Released: Mon Oct 01 2012

orm

  • [orm] [bug]

    Исправлена ошибка, в основном локальная для нового помощника AbstractConcreteBase, когда атрибут «type» из суперкласса не переопределялся в подклассе, чтобы выдать сообщение об ошибке «reserved for base», вместо этого помещая туда атрибут «do-nothing». Это было несовместимо с использованием ConcreteBase, а также со всем поведением классических конкретных отображений, где столбец «type» из полиморфной базы был бы явно отключен в подклассах, если не переопределен явно.

  • [orm] [bug]

    Предупреждение выдается, когда lazy=“dynamic“ сочетается с uselist=False. Это исключение, устраненное в версии 0.8.

  • [orm] [bug]

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

  • [orm] [bug]

    Исправлена ошибка, при которой передавалась неверная информация о типе, когда ORM связывал столбец «version», при использовании функции «version». Тесты любезно предоставлены Дэниелом Миллером.

    References: #2539

  • [orm] [bug]

    Дополнительная логика была добавлена к «flush», который происходит в Session.commit(), таким образом, что дополнительное состояние, добавленное хуком after_flush() или after_flush_postexec(), также удаляется в последующем flush, до завершения «commit». Последующие вызовы flush() будут продолжаться до тех пор, пока крючки after_flush не перестанут добавлять новое состояние. Также предусмотрен счетчик «переполнения», равный 100, на случай, если сломанный крючок after_flush() будет каждый раз добавлять новое содержимое.

    References: #2566

engine

  • [engine] [feature]

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

    References: #2516

  • [engine] [bug]

    Исправлена ошибка, в результате которой отключение detect + dispose, происходящее, когда в пуле QueuePool есть потоки, ожидающие соединения, оставляло эти потоки в ожидании на время таймаута старого пула (или на неопределенное время, если таймаут был отключен). Теперь исправление уведомляет этих ожидающих в специальном исключительном случае и заставляет их перейти на новый пул.

    References: #2522

  • [engine] [bug]

    Добавлен импорт gaerdbms в mysql/__init__.py, отсутствие которого препятствовало загрузке нового диалекта GAE.

    References: #2529

  • [engine] [bug]

    Исправлена ошибка cextension, при которой «ошибка неоднозначного столбца» не работала должным образом, если заданный индекс был объектом Column, а не строкой. Обратите внимание, что здесь все еще есть некоторые проблемы с нацеливанием на столбцы, которые будут исправлены в 0.8.

    References: #2553

  • [engine] [bug]

    Исправлена функция repr() Enum для включения флагов «name» и «native_enum». Помогает автогенерации Alembic.

sql

  • [sql] [bug]

    Исправлена конструкция DropIndex для поддержки индекса, связанного с таблицей в удаленной схеме.

    References: #2571

  • [sql] [bug]

    Исправлена ошибка в конструкции over(), при которой передача пустого списка для partition_by или order_by, в отличие от None, приводила к некорректной генерации. Предоставлено Gunnlaugur Þór Briem.

    References: #2574

  • [sql] [bug]

    Исправлена ошибка CTE, при которой позиционные связанные параметры, присутствующие в самих CTE, нарушали общее упорядочивание связанных параметров. В первую очередь это касалось SQL Server как платформы с поддержкой позиционных привязок + CTE.

    References: #2521

  • [sql] [bug]

    Исправлены некоторые неинтуитивные ошибки в CTE, которые не позволяли ссылаться на CTE в объединении самого себя без его алиасинга. Теперь CTE отображаются уникально по имени, отображая только самый внешний CTE данного имени - все остальные ссылки отображаются просто как имя. Это касается даже других CTE/SELECT, которые ссылаются на различные версии одного и того же объекта CTE, например, SELECT или UNION ALL этого SELECT. В данном случае мы несколько ослабляем обычную связь между идентичностью объекта и лексической идентичностью. Истинный конфликт имен между двумя несвязанными CTE теперь приводит к ошибке.

  • [sql] [bug]

    Кавычки применяются к именам столбцов внутри предложения WITH RECURSIVE общего табличного выражения в соответствии с правилами кавычек для исходного столбца.

    References: #2512

  • [sql] [bug]

    Исправлена ошибка, появившаяся в 0.7.6, в результате которой список FROM оператора SELECT мог быть неправильным в некоторых сценариях «клон+замена».

    References: #2518

  • [sql] [bug]

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

    References: #2552

  • [sql] [bug]

    Исправлена регрессия с версии 0.6, касающаяся таргетинга строк результата. Должна быть возможность использовать оператор select() со строковыми колонками, то есть select([„id“, „name“]).select_from(„mytable“), и чтобы этот оператор был нацелен на объекты Column с этими именами; это механизм, с помощью которого работает query(MyClass).from_statement(some_statement). В какой-то момент конкретный случай использования select([„id“]), который эквивалентен select([literal_column(„id“)]), перестал работать, поэтому он был восстановлен и, конечно, протестирован.

    References: #2558

  • [sql] [bug]

    Добавили отсутствующие операторы is_(), isnot() в базу ColumnOperators, чтобы эти давно доступные операторы присутствовали в виде методов, как и все остальные операторы.

    References: #2544

postgresql

  • [postgresql] [bug]

    Колонки в отраженном ограничении первичного ключа теперь возвращаются в том порядке, в котором их определяет само ограничение, а не как их упорядочивает таблица. Любезно предоставлено Gunnlaugur Þór Briem…

    References: #2531

  • [postgresql] [bug]

    Добавлено „terminating connection“ в список сообщений, которые мы используем для обнаружения разрыва связи с PG, который, похоже, присутствует в некоторых версиях при перезапуске сервера.

    References: #2570

mysql

  • [mysql] [bug]

    Обновлен интерфейс mysqlconnector для использования обновленных API «client flag» и «charset», любезно предоставленных Дэвидом МакНелисом.

sqlite

  • [sqlite] [feature]

    Добавлена поддержка SQL-функции localtimestamp(), реализованной в SQLite, любезно предоставленная Ричардом Митчеллом.

  • [sqlite] [bug]

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

    References: #2568

  • [sqlite] [bug]

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

    References: #2265

mssql

  • [mssql] [bug]

    Исправлена ошибка компилятора, при которой использование коррелированного подзапроса в ORDER BY приводило к некорректному отображению, если в операторе также использовались LIMIT/OFFSET, из-за неправильного отображения в предложении ROW_NUMBER() OVER. Исправление любезно предоставлено sayap

    References: #2538

  • [mssql] [bug]

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

    References: #2545

  • [mssql] [bug]

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

0.7.8

Released: Sat Jun 16 2012

orm

  • [orm] [feature]

    Аргумент „objects“ в flush() больше не является устаревшим, так как были выявлены некоторые допустимые случаи его использования.

  • [orm] [bug]

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

    References: #2480

  • [orm] [bug]

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

    References: #1892, #2491

  • [orm] [bug]

    Исправлена функция identity_key(), которая не принимала скалярный аргумент для идентификатора. .

    References: #2508

  • [orm] [bug]

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

    References: #2497

engine

  • [engine] [bug]

    Исправлена утечка памяти в C-версии прокси результата, при которой DBAPI, не передающие кортежи на чистом Python для строк результата, не могли корректно уменьшать счетчики ссылок. Наиболее сильно пострадавшим DBAPI является pyodbc.

    References: #2489

  • [engine] [bug]

    Исправлена ошибка, затрагивающая Py3K, при которой позиционные параметры строки, переданные в движок/соединение execute(), не интерпретировались корректно, из-за присутствия __iter__ в строке Py3K…

    References: #2503

sql

  • [sql] [bug]

    добавили BIGINT в types.__all__, BIGINT, BINARY, VARBINARY в пространство имен модуля sqlalchemy, плюс тест, чтобы убедиться, что эта поломка не повторится.

    References: #2499

  • [sql] [bug]

    Исправлена отрисовка общих табличных выражений для корректной работы, когда оператор SELECT содержит UNION или другие составные выражения, любезно предоставленные btbuilder.

    References: #2490

  • [sql] [bug]

    Исправлена ошибка, при которой append_column() не работала корректно на клонированной конструкции select(), любезно предоставлено Gunnlaugur Þór Briem.

    References: #2482

postgresql

  • [postgresql] [bug]

    удален ненужный пункт таблицы при отражении перечислений. Любезно предоставлено Gunnlaugur Þór Briem.

    References: #2510

mysql

  • [mysql] [feature]

    Добавлен новый диалект для Google App Engine. Предоставлено Ричи Форманом.

    References: #2484

oracle

  • [oracle] [bug]

    Добавлен ROWID в oracle.*.

    References: #2483

0.7.7

Released: Sat May 05 2012

orm

  • [orm] [feature]

    Добавлен метод prefix_with() в Query, вызывающий select().prefix_with() для размещения директив MySQL SELECT в операторах. Предоставлено Дианой Кларк

    References: #2443

  • [orm] [feature]

    Добавлен новый флаг в @validates include_removes. При значении True события collection remove и attribute del также будут отправляться в функцию валидации, которая принимает дополнительный аргумент «is_remove» при использовании этого флага.

  • [orm] [bug]

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

    References: #2477

  • [orm] [bug]

    Исправлена ошибка в 0.7.6, в результате которой column_mapped_collection, используемая против столбцов, которые были отображены как joins или другие косвенные selectables, не работала.

    References: #2409

  • [orm] [bug]

    Исправлена ошибка, при которой столбец polymorphic_on, не отображенный на класс, некорректно включался в операцию merge(), вызывая ошибку.

    References: #2449

  • [orm] [bug]

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

    References: #2453

  • [orm] [bug]

    Исправлена ошибка, из-за которой OrderingList не мог быть pickleable. Предоставлено Джеффом Дайрики

    References: #2454

  • [orm] [bug]

    Исправлена ошибка в сравнениях отношений, при которой вызов нереализованных методов типа SomeClass.somerelationship.like() приводил к переполнению рекурсии, вместо NotImplementedError.

sql

  • [sql] [feature]

    Добавлено новое событие подключения dbapi_error(). Вызывается для всех ошибок на уровне DBAPI, передавая исходное исключение DBAPI, прежде чем SQLAlchemy изменит состояние курсора.

  • [sql] [bug]

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

  • [sql] [bug]

    Если conn.begin() не работает при вызове «with engine.begin()», только что полученное соединение закрывается явным образом перед нормальным распространением исключения дальше.

  • [sql] [bug]

    Добавьте BINARY, VARBINARY в types.__all__.

    References: #2474

postgresql

  • [postgresql] [feature]

    Добавлены новые опции 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

  • [postgresql] [bug]

    удален ненужный пункт таблицы при отражении доменов.

    References: #2473

mysql

  • [mysql] [bug]

    Исправлена ошибка, при которой имя столбца в предложении «KEY» для автоинкрементного составного столбца с InnoDB заключалось в двойную кавычку в имени, которое является зарезервированным словом. Предоставлено Джеффом Дайрики.

    References: #2460

  • [mysql] [bug]

    Исправлена ошибка, при которой get_view_names() для схемы «information_schema» не получала представления, помеченные как «SYSTEM VIEW». любезно предоставлено Мэтью Турландом.

  • [mysql] [bug]

    Исправлена ошибка, при которой, если cast() используется для SQL-выражения, тип которого не поддерживается cast() и, следовательно, CAST не отображается диалектом, порядок оценки мог измениться, если приведенное выражение требовало группировки; теперь группировка применяется к таким выражениям.

    References: #2467

sqlite

  • [sqlite] [feature]

    Добавлена опция выполнения SQLite «sqlite_raw_colnames=True», обходит попытки удалить «.» из имен столбцов, возвращаемых SQLite cursor.description.

    References: #2475

  • [sqlite] [bug]

    Когда столбец первичного ключа таблицы заменяется, например, с помощью extend_existing, столбец «auto increment», используемый конструкциями insert(), сбрасывается. Ранее он продолжал ссылаться на предыдущий столбец первичного ключа.

    References: #2525

mssql

  • [mssql] [feature]

    Добавлен промежуточный флаг create_engine supports_unicode_binds для диалекта PyODBC, чтобы указать, передает ли диалект юникодовые литералы Python в PyODBC или нет.

  • [mssql] [bug]

    Исправлен флаг use_scope_identity create_engine() при использовании диалекта pyodbc. Ранее этот флаг игнорировался, если был установлен в False. При установке значения False вы будете получать «SELECT @@identity» после каждого INSERT, чтобы получить последний вставленный ID, для тех таблиц, у которых «implicit_returning» установлен в False.

  • [mssql] [bug]

    Синтаксис UPDATE..FROM в SQL Server требует, чтобы обновленная таблица присутствовала в предложении FROM, если псевдоним этой таблицы также присутствует в предложении FROM. Теперь обновленная таблица всегда присутствует в FROM, если FROM присутствует в первую очередь. Любезно предоставлено sayap.

    References: #2468

0.7.6

Released: Wed Mar 14 2012

orm

  • [orm] [feature]

    Добавлен контекстный менеджер «no_autoflush» в Session, используемый с with: временно отключает автозагрузку.

  • [orm] [feature]

    Добавлен метод cte() в Query, вызывающий поддержку общих табличных выражений из Core (см. ниже).

    References: #1859

  • [orm] [feature]

    Добавлена возможность запроса имен столбцов, связанных с таблицей, при использовании query(sometable).filter_by(colname=value).

    References: #2400

  • [orm] [bug]

    Исправлена ошибка регистрации событий, которая проявлялась в том, что события не регистрировались экземплярами sessionmaker(), созданными после того, как событие было связано с классом Session.

    References: #2424

  • [orm] [bug]

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

    References: #2425

  • [orm] [bug]

    Убрана проверка количества затронутых строк при выполнении мультиудаления для сопоставленных объектов. Если между двумя строками существует ON DELETE CASCADE, мы не можем получить точный подсчет строк от DBAPI; этот конкретный подсчет не поддерживается в большинстве DBAPI в любом случае, MySQLdb является примечательным случаем, где он поддерживается.

    References: #2403

  • [orm] [bug]

    Исправлена ошибка, из-за которой объекты, использующие attribute_mapped_collection или column_mapped_collection, не могли быть пикированы.

    References: #2409

  • [orm] [bug]

    Исправлена ошибка, при которой MappedCollection не получала соответствующего инструментария коллекции, если она использовалась только в пользовательском подклассе, который использовал @collection.internally_instrumented.

    References: #2406

  • [orm] [bug]

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

    References: #2419

  • [orm] [bug]

    Исправлена функция repr() для CascadeOptions, чтобы включить refresh-expire. Также переработал CascadeOptions в <frozenset>.

    References: #2417

  • [orm] [bug]

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

  • [orm] [bug]

    Уменьшили тест, применяемый в flush() для проверки UPDATE на частично NULL PK в одной таблице, чтобы UPDATE происходил только в том случае, если UPDATE действительно должен произойти.

    References: #2390

  • [orm] [bug]

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

    References: #2352

examples

  • [examples] [bug]

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

engine

  • [engine] [feature]

    Добавлена опция выполнения «no_parameters=True» для соединений. Если параметры отсутствуют, оператор будет передан как cursor.execute(statement), тем самым вызывая поведение DBAPIs при отсутствии коллекции параметров; для psycopg2 и mysql-python это означает отсутствие интерпретации знаков % в строке. Это происходит только с этой опцией, а не только если список параметров пуст, так как в противном случае это привело бы к непоследовательному поведению SQL-выражений, которые обычно опускают знаки процентов (и при компиляции не могут заранее знать, будут ли присутствовать параметры в некоторых случаях).

    References: #2407

  • [engine] [feature]

    Добавлен аргумент pool_reset_on_return в create_engine, позволяющий контролировать поведение «возврата соединения». Также добавлены новые аргументы „rollback“, „commit“, None к pool.reset_on_return, чтобы обеспечить больший контроль над активностью возврата соединения.

    References: #2378

  • [engine] [feature]

    Добавлены некоторые достойные менеджеры контекста в Engine, Connection:

    with engine.begin() as conn:
        <work with conn in a transaction>

    и:

    with engine.connect() as conn:
        <work with conn>

    Оба закрывают соединение после завершения, фиксируют или откатывают транзакцию с ошибками на engine.begin().

  • [engine] [bug]

    Добавлен вызов execution_options() для MockConnection (т.е. используемого со стратегией=»mock»), который действует как сквозной для аргументов.

sql

  • [sql] [feature]

    Добавлена поддержка общих табличных выражений (CTE) стандарта SQL, позволяющая использовать объекты SELECT в качестве источника CTE (DML пока не поддерживается). Это вызывается через метод cte() в любой конструкции select().

    References: #1859

  • [sql] [bug]

    Исправлена утечка памяти в ядре, которая возникала при использовании расширений C с определенными типами получения результатов, в частности, при вызове orm query.count().

    References: #2427

  • [sql] [bug]

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

    References: #2398

  • [sql] [bug]

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

    References: #2392

  • [sql] [bug]

    Выдается предупреждение, если в пункте values() конструкции insert() или update() указан непредставленный столбец. Будет переведено в исключение в версии 0.8.

    References: #2413

  • [sql] [bug]

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

    References: #2396

  • [sql] [bug]

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

    References: #2402

  • [sql] [bug]

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

    References: #2380

mysql

  • [mysql] [feature]

    Добавлена поддержка типов ограничений индексов и первичных ключей MySQL (т.е. USING) с помощью нового параметра mysql_using в Index и PrimaryKeyConstraint, любезно предоставленного Дианой Кларк.

    References: #2386

  • [mysql] [feature]

    Добавлена поддержка параметра «isolation_level» для всех диалектов MySQL. Спасибо mu_mind за патч здесь.

    References: #2394

sqlite

  • [sqlite] [bug]

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

    References: #2432

mssql

  • [mssql] [feature]

    Добавлена поддержка подсказок для таблиц MSSQL INSERT, UPDATE и DELETE с помощью нового метода with_hint() в UpdateBase.

    References: #2430

oracle

  • [oracle] [feature]

    Добавлен новый флаг create_engine() coerce_to_decimal=False, отключающий обработку точных чисел, которая может добавить много накладных расходов при преобразовании всех числовых значений в десятичную систему.

    References: #2399

  • [oracle] [bug]

    Добавлена поддержка недостающей компиляции для LONG

    References: #2401

  • [oracle] [bug]

    Добавлено „LEVEL“ в список зарезервированных слов для Oracle.

    References: #2435

0.7.5

Released: Sat Jan 28 2012

orm

  • [orm] [feature]

    Добавлен аргумент «class_registry» в declarative_base(). Позволяет двум или более декларативным базам совместно использовать один и тот же реестр имен классов.

  • [orm] [feature]

    query.filter() принимает несколько критериев, которые объединяются через AND, т.е. query.filter(x==y, z>q, …)

  • [orm] [feature]

    Добавлена новая возможность в опции загрузчика отношений, позволяющая использовать стратегии загрузчика «по умолчанию». Передайте „*“ к любой из joinedload(), lazyload(), subqueryload() или noload(), и это станет стратегией загрузчика, используемой для всех отношений, кроме тех, которые явно указаны в запросе. Спасибо начинающему автору Кенту Бауэру за исчерпывающий и хорошо написанный набор тестов!

    References: #2351

  • [orm] [feature]

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

    References: #2356

  • [orm] [bug]

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

    References: #2389

  • [orm] [bug]

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

    References: #2345

  • [orm] [bug]

    Вызывает исключение, если xyzload_all() используется неуместно с двумя не связанными отношениями.

    References: #2370

  • [orm] [bug]

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

    References: #2367

  • [orm] [bug]

    Исправлена ошибка, из-за которой hybrid_property не работал как аргумент kw в any(), has().

  • [orm] [bug]

    обеспечить pickleability всех исключений ORM для совместимости с мультипроцессингом.

    References: #2371

  • [orm] [bug]

    реализована стандартная ошибка AttributeError «can’t set attribute» / «can’t delete attribute» при использовании setattr/delattr на гибриде, который не определяет fset или fdel.

    References: #2353

  • [orm] [bug]

    Исправлена ошибка, при которой у распикированного объекта не было достаточно настроенного состояния для корректной работы в событии unpickle(), установленном расширением mutable object, если объекту требовался доступ к атрибутам ORM в __eq__() или подобном.

    References: #2362

  • [orm] [bug]

    Исправлена ошибка, при которой каскад «слияния» мог неправильно интерпретировать незагруженный атрибут, если флаг load_on_pending использовался с relationship(). Спасибо Кенту Боуэру за тесты.

    References: #2374

  • [orm]

    Исправлена регрессия из версии 0.6, в результате которой при использовании флага «load_on_pending» relationship(), когда на отложенный объект нужно было выдать не «get()» lazy clause, он не загружался.

examples

  • [examples] [feature]

    Немного упростил пример версионирования, чтобы использовать декларативный миксин, а также слушатель событий, вместо метакласса + SessionExtension.

    References: #2313

  • [examples] [bug]

    Исправлен файл big_collection.py для закрытия сессии перед сбросом таблиц.

    References: #2346

engine

  • [engine] [bug]

    Добавлено __reduce__ к StatementError, DBAPIError, ошибкам колонок, чтобы исключения были pickleable, как при использовании мультипроцессинга. Однако пока не все DBAPI поддерживают это, например, psycopg2.

    References: #2371

  • [engine] [bug]

    Улучшены сообщения об ошибках при передаче нестроки или недопустимой строки в любой из процессоров даты/времени, используемых SQLite, включая версии на C и Python.

    References: #2382

  • [engine] [bug]

    Исправлена ошибка, при которой связанный с таблицей объект Column с именем «<a>_<b>», который соответствовал столбцу, помеченному как «<tablename>_<colname>», мог соответствовать несоответствующим образом при нацеливании в строке набора результатов.

    References: #2377

  • [engine] [bug]

    Исправлена ошибка в стратегии «mock», при которой не вызывался правильный метод посещения DDL, что приводило к дублированию операторов «CREATE/DROP SEQUENCE»

    References: #2384

sql

  • [sql] [feature]

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

    References: #2356

  • [sql] [feature]

    Добавлены конструкции выражений «false()» и «true()» в пространство имен sqlalchemy.sql, хотя пока не являются частью __all__.

  • [sql] [feature]

    Диалект-специфичные компиляторы теперь поднимают CompileError для всех проблем компиляции типов/выражений вместо InvalidRequestError или ArgumentError. DDL для CREATE TABLE будет повторно вызывать CompileError, чтобы включить информацию о таблице/столбце для проблемного столбца.

    References: #2361

  • [sql] [bug]

    Улучшен API для add_column() таким образом, что если тот же столбец добавляется в собственную таблицу, ошибка не возникает и ограничения не удваиваются. Также помогает в некоторых паттернах отражения/декларативных паттернах.

    References: #2356

  • [sql] [bug]

    Исправлена проблема, при которой исключение «required» не возникало для bindparam() с required=True, если утверждение не имело параметров вообще.

    References: #2381

mysql

  • [mysql] [bug]

    исправлен regexp, который отфильтровывает предупреждения для неотраженных директив «PARTITION», спасибо Джорджу Рейли

    References: #2376

sqlite

  • [sqlite] [bug]

    »Имя» FK-ограничения в SQLite отражается как «None», а не «0» или другое целочисленное значение. Похоже, что SQLite не поддерживает именование ограничений в любом случае.

    References: #2364

  • [sqlite] [bug]

    sql.false() и sql.true() компилируются в 0 и 1 соответственно в sqlite

    References: #2368

  • [sqlite] [bug]

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

mssql

  • [mssql] [bug]

    Скорректировал regexp, используемый в типе mssql.TIME, чтобы обеспечить получение только шести цифр для части значения «микросекунды», что ожидается Python’овским datetime.time(). Обратите внимание, что поддержка отправки микросекунд, по крайней мере в pyodbc, пока невозможна.

    References: #2340

  • [mssql] [bug]

    Отменили ограничение «30 символов» для pymssql, основываясь на сообщениях о том, что в настоящее время он работает лучше. pymssql не был хорошо протестирован, и поскольку DBAPI находится в движении, все еще неясно, каков статус этого драйвера и как реализация SQLAlchemy должна адаптироваться.

    References: #2347

oracle

  • [oracle] [bug]

    Добавлена ошибка ORA-03135 в бесконечный список ошибок oracle «соединение потеряно».

    References: #2388

misc

  • [bug] [core]

    Изменен LRUCache, используемый маппером для кэширования операций INSERT/UPDATE/DELETE, чтобы использовать инкрементный счетчик вместо временной метки для отслеживания записей, для большей надежности по сравнению с использованием time.time(), что может привести к сбоям в тестировании на некоторых платформах.

    References: #2379

  • [bug] [core]

    Добавлена булева проверка функции «finalize» в обратном вызове weakref прокси соединения пула перед ее вызовом, чтобы не выдавалось предупреждение о том, что эта функция None, когда приложение завершается и gc удалил функцию из модуля до того, как был вызван обратный вызов weakref.

    References: #2383

  • [bug] [py3k]

    Исправлено неуместное использование флага util.py3k и он переименован в util.py3k_warning, поскольку этот флаг предназначен только для обнаружения ограничений импорта серии флагов -3.

    References: #2348

0.7.4

Released: Fri Dec 09 2011

orm

  • [orm] [feature]

    polymorphic_on теперь принимает множество новых типов значений:

    • самостоятельные выражения, которые не сопоставляются с другими выражениями

    • объекты column_property()

    • строковые имена любого column_property() или имя атрибута сопоставленного Column

    В документации приведен пример с использованием конструкции case(), которая, вероятно, является обычной конструкцией, используемой здесь. и часть

    Автономные выражения в polymorphic_on распространяются на подклассы однотабличного наследования, так что они используются в предложении WHERE /JOIN для ограничения строк этим подклассом, как это обычно и происходит.

    References: #2238, #2345

  • [orm] [feature]

    IdentitySet поддерживает оператор - как то же самое, что и difference(), что удобно при работе с Session.dirty и т.д.

    References: #2301

  • [orm] [feature]

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

  • [orm] [bug]

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

    References: #2315

  • [orm] [bug]

    После того, как несколько лет этого не делалось, добавлена большая детализация в функциональность «является ли X родителем Y», которая используется при определении необходимости «обнуления» FK на «Y», а также при удалении «Y» с помощью каскада delete-orphan. Теперь тест принимает во внимание Python-идентификатор родителя, а также его идентификационный ключ, чтобы проверить, является ли последний известный родитель Y определенно X. Если решение не может быть принято, выдается ошибка StaleDataError. Условия, при которых возникает эта ошибка, довольно редки: требуется, чтобы предыдущий родитель был собран в мусор, и ранее можно было неправомерно обновить/удалить запись, которая с тех пор перешла к новому родителю, хотя могут быть случаи, когда ранее происходил «тихий успех», который теперь будет возникать перед лицом двусмысленности. Истечение срока действия «Y» сбрасывает «родительский» трекер, что означает, что X.remove(Y) может в конечном итоге удалить Y, даже если X устарел, но это такое же поведение, как и раньше; в этом случае рекомендуется также истечь срок действия X.

    References: #2264

  • [orm] [bug]

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

    References: #2310

  • [orm] [bug]

    Добавлена недостающая запятая в символ PASSIVE_RETURN_NEVER_SET

    References: #2304

  • [orm] [bug]

    Cls.column.collate(«some collation») теперь работает. Также в 0.6.9

    References: #1776

  • [orm] [bug]

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

    References: #2309

  • [orm] [bug]

    Исправление также выдает событие «refresh» при загрузке составного значения при доступе, даже если все значения столбцов уже присутствовали, как и положено. Это исправляет расширение «mutable», которое полагается на событие «load» для обеспечения актуальности словаря _parents, исправления. Спасибо Скотту Торборгу за приведенный здесь тестовый пример.

    References: #2308, #2309

  • [orm] [bug]

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

    References: #2312

  • [orm] [bug]

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

    References: #2312

  • [orm] [bug]

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

    References: #2316

  • [orm] [bug]

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

    References: #2297

  • [orm] [bug]

    Вызовы query.join() к подклассу наследования одной таблицы теперь отслеживаются и используются для устранения дополнительного критерия WHERE…. IN, который обычно добавляется при наследовании одной таблицы, поскольку соединение должно его учитывать. Это позволяет OUTER JOIN к подклассу одной таблицы выдавать правильные результаты, и в целом будет создаваться меньше критериев WHERE при работе с соединениями наследования одной таблицы.

    References: #2328

  • [orm] [bug]

    __table_args__ теперь можно передавать как пустой кортеж, так и пустой дикт… Спасибо Фаязу Юсуфу Хану за исправление.

    References: #2339

  • [orm] [bug]

    Обновлено предупреждение при установке delete-orphan без delete, теперь оно не относится к 0.6, так как мы так и не смогли перевести его в исключение. В идеале это лучше сделать исключением, но в любом случае это не критично.

    References: #2325

  • [orm] [bug]

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

examples

  • [examples] [bug]

    Исправлена ошибка в примере history_meta.py, когда флаг «unique» не снимался с подкласса наследования одной таблицы, который генерирует колонки для размещения на базе.

engine

  • [engine] [bug]

    Исправлена ошибка, при которой transaction.rollback() выдавала ошибку при недействительном соединении, если транзакция была двухфазной или транзакцией с точкой сохранения. Для обычных транзакций откат() не приводит к ошибке, если соединение недействительно, поэтому, хотя и не было на 100% ясно, должен ли он приводить к ошибке, по крайней мере, теперь интерфейс согласован.

    References: #2317

sql

  • [sql] [feature]

    Конструкция update() теперь может использовать несколько таблиц в предложении WHERE, что приведет к появлению конструкции «UPDATE..FROM», распознаваемой PostgreSQL и MSSQL. При компиляции на MySQL вместо этого будет генерироваться «UPDATE t1, t2, …». MySQL дополнительно может выполнять рендеринг по нескольким таблицам в предложении SET, если объекты Column используются в качестве ключей в параметре «values» или генеративном методе.

    References: #1944, #2166

  • [sql] [feature]

    Добавлен аксессор к типам под названием «python_type», который возвращает рудиментарный объект типа Python для конкретного экземпляра TypeEngine, если он известен, иначе выдает NotImplementedError.

    References: #77

  • [sql] [bug]

    связанные с этим, внесли некоторые коррективы в изменение относительно списка «from» в select(). Коллекция _froms больше не мемоизируется, так как это упрощает различные случаи использования и устраняет необходимость в «предупреждении», если столбец присоединяется к таблице после того, как он уже использовался в выражении - конструкция select() теперь всегда будет выдавать правильное выражение. Вероятно, в реальном мире это не повлияет на производительность; объекты select() почти всегда создаются ad-hoc, и системы, которые хотят оптимизировать повторное использование select(), будут использовать функцию «compiled_cache». Уменьшена нагрузка, которая могла бы возникнуть при вызове select.bind, но подавляющее большинство пользователей все равно не должны использовать «связанные метаданные» :).

    References: #2261, #2316

  • [sql] [bug]

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

    References: #2261, #2319

schema

  • [schema] [feature]

    Добавлена новая поддержка удаленных «схем»:

  • [schema] [feature]

    Флаг «extend_existing» для Table теперь позволяет процессу отражения вступить в силу для объекта Table, который уже определен; когда autoload=True и extend_existing=True оба установлены, полный набор колонок будет отражен от таблицы, которая затем перезапишет те колонки, которые уже присутствуют, а не произойдет никакой активности. Колонки, присутствующие непосредственно в автозагрузке, будут использоваться как всегда.

    References: #1410

  • [schema] [bug]

    Исправлена ошибка, при которой TypeDecorator возвращал устаревшее значение для _type_affinity при использовании TypeDecorator, который «переключает» типы, например, тип CHAR/UUID.

  • [schema] [bug]

    Исправлена ошибка, при которой опция «order_by=“foreign_key“» в Inspector.get_table_names не выполняла сортировку должным образом, заменена на существующий алгоритм сортировки

  • [schema] [bug]

    »Имя» ограничения CHECK на уровне столбцов, если оно присутствует, теперь отображается в операторе CREATE TABLE с помощью «CONSTRAINT <name> CHECK <expression>».

    References: #2305

  • [schema]

    MetaData() принимает аргументы «schema» и «quote_schema», которые будут применены к одноименным аргументам таблицы или последовательности, оставляя их по умолчанию None.

  • [schema]

    Последовательность принимает аргумент «quote_schema»

  • [schema]

    tometadata() для Table будет использовать «схему» входящих метаданных для новой таблицы, если аргумент schema явно «None»

  • [schema]

    Добавлены конструкции CreateSchema и DropSchema DDL - они принимают только строковое имя схемы и флаг «quote».

  • [schema]

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

  • [schema]

    метод «has_schema» был реализован на dialect, но пока работает только на PostgreSQL. Предоставлено Манлио Перилло.

    References: #1679

postgresql

  • [postgresql] [feature]

    Добавлен аргумент конструктора create_type в pg.ENUM. При значении False в рамках события создания/удаления таблицы не будет выполняться CREATE/DROP или проверка типа; только методы create()/drop)(), вызываемые напрямую, будут делать это. Помогает при работе с «автономными» скриптами Alembic.

  • [postgresql] [bug]

    Диалект PostgreSQL запоминает, что ENUM с определенным именем был обработан во время последовательности create/drop. Это позволяет последовательности create/drop работать без каких-либо вызовов «checkfirst», а также означает, что при включенном «checkfirst» проверять ENUM нужно только один раз.

    References: #2311

mysql

  • [mysql] [bug]

    Корректировки Unicode позволяют последней версии pymysql (пост 0.4) пройти 100% проверку на Python 2.

mssql

  • [mssql] [feature]

    снял ограничение на SAVEPOINT для SQL Server. Все тесты проходят с его использованием, однако неизвестно, есть ли более глубокие проблемы.

    References: #822

  • [mssql] [bug]

    исправлена функция with_hint(), которая была неправильно реализована на MSSQL - обычно используется для подсказки «WITH (NOLOCK)» (которую вы не должны использовать в любом случае! используйте изоляцию моментального снимка вместо этого :)).

    References: #2336

  • [mssql] [bug]

    использовать новое определение версии pyodbc для опции _need_decimal_fix.

    References: #2318

  • [mssql] [bug]

    не приводите «имя таблицы» к виду NVARCHAR на SQL Server 2000. Тем не менее, мы все еще не знаем, какие заклинания нужны, чтобы заставить PyODBC полноценно работать с FreeTDS 0.91.

    References: #2343

  • [mssql] [bug]

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

    References: #2269

misc

  • [feature] [ext]

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

  • [bug] [pyodbc]

    Диалекты на основе pyodbc теперь точно разбирают pyodbc в части наблюдаемых строк pyodbc, включая такие драгоценные камни, как «py3-3.0.1-beta4»

    References: #2318

  • [bug] [ext]

    декоратор @compiles выдает информативное сообщение об ошибке при отсутствии обработчика компиляции «по умолчанию», а не KeyError.

0.7.3

Released: Sun Oct 16 2011

general

  • [general]

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

    References: #2279

orm

  • [orm]

    Усовершенствована функция query.join(), благодаря которой «левая» сторона может быть более гибкой и представлять собой не-ORM selectable, например, подзапрос. Теперь в качестве левой стороны будет использоваться selectable, помещенный в select_from(), что предпочтительнее неявного использования сопоставленной сущности. Если объединение все еще не работает из-за отсутствия внешних ключей, сообщение об ошибке будет содержать эту информацию. Спасибо brianrhude на IRC за тестовый пример.

    References: #2298

  • [orm]

    Добавлено событие сессии after_soft_rollback(). Это событие срабатывает безоговорочно при каждом вызове функции rollback(), независимо от того, произошел ли фактический откат на уровне DBAPI. Это событие специально разработано для того, чтобы позволить операциям с сессией продолжаться после отката, когда Session.is_active равно True.

    References: #2241

  • [orm]

    добавлен булев флаг «adapt_on_names» в конструкцию orm.aliased(). Позволяет конструкции aliased() связывать сущность ORM с selectable, содержащей агрегаты или другие производные формы определенного атрибута, при условии, что имя совпадает с именем колонки, отображенной на сущность.

  • [orm]

    Добавлен новый флаг expire_on_flush=False в column_property(), отмечающий те свойства, которые в противном случае считались бы «readonly», т.е. полученными из SQL-выражений, чтобы сохранить их значение после того, как произошла очистка, включая случаи, когда родительский объект сам участвовал в обновлении.

  • [orm]

    Усовершенствован инструментарий в ORM для поддержки нового стиля аргументов Py3K «требуемые kw аргументы», т.е. fn(a, b, *, c, d), fn(a, b, *args, c, d). Сигнатуры аргументов метода mapped object’s __init__ будут сохранены, включая необходимые kw-правила.

    References: #2237

  • [orm]

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

    References: #2282

  • [orm]

    Исправлено множество связанных с synonym()регрессий из 0.6:

    • создание синонима против синонима теперь работает.

    • Синонимы, созданные против отношения(), могут быть переданы в query.join(), опции переданы в query.options(), переданы по имени в query.with_parent().

  • [orm]

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

    References: #2287

  • [orm]

    Identity map .discard() использует dict.pop(,None) внутри вместо «del», чтобы избежать KeyError/предупреждения при неопределенном разрыве gc

    References: #2267

  • [orm]

    Исправлена регрессия в новой композитной перезаписи, когда опция deferred=True не работала из-за отсутствия импорта

    References: #2253

  • [orm]

    Восстановлен аргумент «comparator_factory» в composite(), удаленный после выхода 0.7.

    References: #2248

  • [orm]

    Исправлена ошибка в query.join(), которая возникала в сложном сценарии с несколькими пересекающимися путями, когда одна и та же таблица могла быть соединена дважды. Большое спасибо Дейву Витеку за отличное исправление.

    References: #2247

  • [orm]

    Запрос будет преобразовывать OFFSET, равный нулю, при нарезке в None, чтобы не вызывать ненужные предложения OFFSET.

  • [orm]

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

  • [orm]

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

    References: #2260

  • [orm]

    Вызов class_mapper() и передача объекта, который не является «типом» (т.е. классом, который потенциально может быть отображен), теперь вызывает информативную ошибку ArgumentError, а не UnmappedClassError.

    References: #2196

  • [orm]

    Новый хук событий, MapperEvents.after_configured(). Вызывается после завершения шага configure(), и мапперы действительно были затронуты. Теоретически это событие вызывается один раз для каждого приложения, если только новые отображения не создаются после того, как существующие уже были использованы.

  • [orm]

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

    References: #2281

  • [orm]

    Новые декларативные функции:

    • Метод __declare_last__() устанавливает слушателя событий для метода класса, который будет вызван, когда мапперы завершат последний шаг «configure».

    • флаг __abstract__. Класс не будет отображаться вообще, если этот флаг присутствует на классе.

    • Новые вспомогательные классы ConcreteBase, AbstractConcreteBase. Позволяют использовать конкретные отображения с помощью декларативных, которые автоматически устанавливают «polymorphic_union», когда вызывается шаг «configure» mapper.

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

    References: #2239

  • [orm]

    Declarative предупредит, если база подкласса использует @declared_attr для обычного столбца - этот атрибут не распространяется на подклассы.

    References: #2283

  • [orm]

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

    References: #2280

  • [orm]

    Поведенческое улучшение: пустые конъюнкции, такие как and_() и or_(), будут сглажены в контексте вложенной конъюнкции, то есть and_(x, or_()) даст „X“, а не „X AND ()“.

    References: #2257

  • [orm]

    Исправлена ошибка, касающаяся расчета списка «from» для элемента select(). Вычисление «from» теперь откладывается, так что если конструкция использует объект Column, который еще не присоединен к таблице, но позже будет присоединен к таблице, она генерирует SQL, используя таблицу в качестве FROM. Это изменение довольно сильно повлияло на механику вычисления списка FROM, а также коллекции «коррелятов», поскольку некоторые схемы «адаптации пунктов» (они очень активно используются в ORM) полагались на тот факт, что коллекция «froms» обычно кэшируется до завершения адаптации. Переработка позволяет сделать так, что коллекция «froms» может быть очищена и сгенерирована заново в любое время.

    References: #2261

  • [orm]

    Исправлена ошибка, при которой метод with_only_columns() в Select не работал, если передавался selectable. Также в 0.6.9.

    References: #2270

examples

  • [examples]

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

    References: #2266

engine

  • [engine]

    Метод recreate() во всех классах пулов использует self.__class__ для получения типа пула, который нужно создать, в случае подклассификации. Обратите внимание, что обычно нет необходимости в подклассификации пулов.

    References: #2254

  • [engine]

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

    References: #2243

  • [engine]

    Добавлен необязательный аргумент «sa_pool_key» в pool.manage(dbapi).connect(), так что сериализация args не требуется.

  • [engine]

    Разрешение точек входа, поддерживаемое функцией create_engine(), теперь поддерживает разрешение отдельных драйверов DBAPI поверх встроенного диалекта или диалекта с разрешением точек входа, используя стандартную нотацию „+“ - перед разрешением в качестве точки входа она преобразуется в „.“.

    References: #2286

  • [engine]

    Добавлено исключение catch + предупреждение для шага «return unicode detection» в connect, позволяет базам данных, которые падают на NVARCHAR, продолжать инициализацию, предполагая, что тип NVARCHAR не реализован.

    References: #2299

schema

  • [schema]

    Изменен Column.copy() для использования _constructor(), который по умолчанию использует self.__class__, для создания нового объекта. Это позволяет легче поддерживать подклассификацию Column.

    References: #2284

  • [schema]

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

    References: #2223

postgresql

  • [postgresql]

    Добавлен аргумент «postgresql_using» в Index(), создающий предложение USING для указания реализации индекса для PG. . Спасибо Райану П. Келли за патч.

    References: #2290

  • [postgresql]

    Добавлен параметр client_encoding в create_engine(), когда используется диалект postgresql+psycopg2; вызывает метод psycopg2 set_client_encoding() со значением при подключении.

    References: #1839

  • [postgresql]

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

    References: #2141, #2291

  • [postgresql]

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

    References: #2256

  • [postgresql]

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

  • [postgresql]

    Сужено предположение, делаемое при отражении таблицы со ссылкой на иностранный ключ со схемой в текущем пути поиска; явная схема будет применена к таблице со ссылкой только в том случае, если она действительно совпадает со схемой ссылающейся таблицы, которая также имеет явную схему. Ранее предполагалось, что «текущая» схема является синонимом полного пути_поиска.

    References: #2249

mysql

  • [mysql]

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

    References: #2225

  • [mysql]

    Добавлен параметр mysql_length в конструкцию Index, определяющий «длину» для индексов.

    References: #2293

sqlite

  • [sqlite]

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

mssql

  • [mssql]

    Изменения для попытки поддержки FreeTDS 0.91 с Pyodbc. Это включает в себя то, что строковые привязки отправляются как объекты Python unicode при обнаружении FreeTDS 0.91, и CAST(? AS NVARCHAR) используется, когда мы обнаруживаем для таблицы. Однако, я бы продолжил характеризовать поведение Pyodbc + FreeTDS 0.91 как довольно дрянное, все еще есть много запросов, таких как используемые в отражении, которые вызывают дамп ядра в Linux, и это вообще не пригодно для использования в OSX, MemoryErrors изобилуют и просто сломанная поддержка unicode.

    References: #2273

  • [mssql]

    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

  • [mssql]

    »0» is accepted as an argument for limit() which will produce «TOP 0».

    References: #2222

oracle

  • [oracle]

    Fixed ReturningResultProxy for zxjdbc dialect.. Regression from 0.6.

    References: #2272

  • [oracle]

    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

  • [types]

    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

  • [ext]

    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

  • [ext]

    Added local_attr, remote_attr, attr accessors to AssociationProxy, providing quick access to the proxied attributes at the class level.

    References: #2236

  • [ext]

    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 2011

orm

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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.

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

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

  • [examples]

    Tweak to examples/versioning to pick the correct foreign key in a multi-level inheritance situation.

  • [examples]

    Fixed the attribute shard example to check for bind param callable correctly in 0.7 style.

engine

  • [engine]

    Context manager provided by Connection.begin() will issue rollback() if the commit() fails, not just if an exception occurs.

  • [engine]

    Use urllib.parse_qsl() in Python 2.6 and above, no deprecation warning about cgi.parse_qsl()

    References: #1682

  • [engine]

    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.

  • [engine]

    StatementException wrapping will display the original exception class in the message.

  • [engine]

    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

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

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

  • [schema]

    Added an informative error message when ForeignKeyConstraint refers to a column name in the parent that is not found. Also in 0.6.9.

  • [schema]

    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

  • [schema]

    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».

  • [schema]

    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

  • [postgresql]

    Added new «postgresql_ops» argument to Index, allows specification of PostgreSQL operator classes for indexed columns. Courtesy Filip Zyzniewski.

    References: #2198

mysql

  • [mysql]

    Fixed OurSQL dialect to use ansi-neutral quote symbol «“» for XA commands instead of „»“. . Also in 0.6.9.

    References: #2186

sqlite

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

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

  • [oracle]

    Added ORA-00028 to disconnect codes, use cx_oracle _Error.code to get at the code,. Also in 0.6.9.

    References: #2200

  • [oracle]

    Added ORA-01033 to disconnect codes, which can be caught during a connection event.

    References: #2201

  • [oracle]

    repaired the oracle.RAW type which did not generate the correct DDL. Also in 0.6.9.

    References: #2220

  • [oracle]

    added CURRENT to reserved word list. Also in 0.6.9.

    References: #2212

  • [oracle]

    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.

  • [oracle]

    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 2011

general

  • [general]

    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

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

  • [orm]

    Repaired new «mutable» extension to propagate events to subclasses correctly; don’t create multiple event listeners for subclasses either.

    References: #2180

  • [orm]

    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

  • [orm]

    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

  • [engine]

    Deprecate schema/SQL-oriented methods on Connection/Engine that were never well known and are redundant: reflecttable(), create(), drop(), text(), engine.func

  • [engine]

    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

  • [sql]

    Fixed bug whereby metadata.reflect(bind) would close a Connection passed as a bind argument. Regression from 0.6.

  • [sql]

    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

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

  • [mysql]

    Unit tests pass 100% on MySQL installed on windows.

  • [mysql]

    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

  • [mysql]

    supports_sane_rowcount will be set to False if using MySQLdb and the DBAPI doesn’t provide the constants.CLIENT module.

sqlite

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

orm

  • [orm]

    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

  • [orm]

    query.count() emits «count(*)» instead of «count(1)».

    References: #2162

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    Fixed a potential KeyError which under some circumstances could occur with the identity map, part of

    References: #2148

  • [orm]

    added Query.with_session() method, switches Query to use a different session.

  • [orm]

    horizontal shard query should use execution options per connection as per

    References: #2131

  • [orm]

    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

  • [orm]

    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

  • [orm]

    polymorphic_union() gets a «cast_nulls» option, disables the usage of CAST when it renders the labeled NULL columns.

    References: #1502

  • [orm]

    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).

  • [orm]

    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

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

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

  • [sql]

    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.

  • [sql]

    Some improvements to error handling inside of the execute procedure to ensure auto-close connections are really closed when very unusual DBAPI errors occur.

  • [sql]

    metadata.reflect() and reflection.Inspector() had some reliance on GC to close connections which were internally procured, fixed this.

  • [sql]

    Added explicit check for when Column .name is assigned as blank string

    References: #2140

  • [sql]

    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

  • [postgresql]

    Fixed the psycopg2_version parsing in the psycopg2 dialect.

  • [postgresql]

    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

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

  • [no_tags]

    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

  • [documentation]

    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

  • [ext]

    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 2011

general

  • [general]

    Changes to the format of CHANGES, this file. The format changes have been applied to the 0.7 releases.

  • [general]

    The «-declarative» changes will now be listed directly under the «-orm» section, as these are closely related.

  • [general]

    The 0.5 series changes have been moved to the file CHANGES_PRE_06 which replaces CHANGES_PRE_05.

  • [general]

    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

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

  • [orm]

    Reworded the exception raised when a flush is attempted of a subclass that is not polymorphic against the supertype.

    References: #2063

  • [orm]

    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.

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

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

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

  • [sql]

    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.

  • [sql]

    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

  • [sql]

    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

  • [sql]

    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.

  • [sql]

    Fixed incorrect usage of «,» in over() clause being placed between the «partition» and «order by» clauses.

    References: #2134

  • [sql]

    Before/after attach events for PrimaryKeyConstraint now function, tests added for before/after events on all constraint types.

    References: #2105

  • [sql]

    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

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

  • [postgresql]

    Psycopg2 for Python 3 is now supported.

  • [postgresql]

    Fixed support for precision numerics when using pg8000.

    References: #2132

sqlite

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

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

    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

  • [types]

    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

  • [types]

    Added @event.listens_for() decorator, given target + event name, applies the decorated function as a listener.

    References: #2106

  • [pool]

    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

  • [pool]

    The «pool.manage» feature doesn’t use pickle anymore to hash the arguments for each pool.

  • [documentation]

    Documented SQLite DATE/TIME/DATETIME types. (also in 0.6.7)

    References: #2029

  • [documentation]

    Fixed mutable extension docs to show the correct type-association methods.

    References: #2118

0.7.0b3

Released: Sun Mar 20 2011

general

  • [general]

    Lots of fixes to unit tests when run under PyPy (courtesy Alex Gaynor).

orm

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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

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

  • [examples]

    The Beaker caching example allows a «query_cls» argument to the query_callable() function. (also in 0.6.7)

    References: #2090

engine

  • [engine]

    Fixed AssertionPool regression bug.

    References: #2097

  • [engine]

    Changed exception raised to ArgumentError when an invalid dialect is specified.

    References: #2060

sql

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

  • [sql]

    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

  • [sql]

    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.

  • [sql]

    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

  • [sql]

    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

  • [sql]

    Added accessors to ResultProxy «returns_rows», «is_insert» (also in 0.6.7)

    References: #2089

postgresql

  • [postgresql]

    Added RESERVED_WORDS for postgresql dialect. (also in 0.6.7)

    References: #2092

  • [postgresql]

    Fixed the BIT type to allow a «length» parameter, «varying» parameter. Reflection also fixed. (also in 0.6.7)

    References: #2073

mssql

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

  • [firebird]

    The «implicit_returning» flag on create_engine() is honored if set to False. (also in 0.6.7)

    References: #2083

misc

  • [declarative]

    Arguments in __mapper_args__ that aren’t «hashable» aren’t mistaken for always-hashable, possibly-column arguments. (also in 0.6.7)

    References: #2091

  • [informix]

    Added RESERVED_WORDS informix dialect. (also in 0.6.7)

    References: #2092

  • [ext]

    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 2011

orm

  • [orm]

    Fixed bug whereby Session.merge() would call the load() event with one too few arguments.

    References: #2053

  • [orm]

    Added logic which prevents the generation of events from a MapperExtension or SessionExtension from generating do-nothing events for all the methods not overridden.

    References: #2052

examples

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

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

  • [sql]

    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

  • [sql]

    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

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

  • [declarative]

    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

  • [declarative]

    Fix error message referencing old @classproperty name to reference @declared_attr (also in 0.6.7)

    References: #2061

  • [declarative]

    the dictionary at the end of the __table_args__ tuple is now optional.

    References: #1468

  • [ext]

    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 2011

general

  • [general]

    New event system, supersedes all extensions, listeners, etc.

    References: #1902

  • [general]

    Logging enhancements

    References: #1926

  • [general]

    Setup no longer installs a Nose plugin

    References: #1949

  • [general]

    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

  • [orm]

    More succinct form of query.join(target, onclause)

    References: #1923

  • [orm]

    Hybrid Attributes, implements/supersedes synonym()

    References: #1903

  • [orm]

    Rewrite of composites

    References: #2008

  • [orm]

    Mutation Event Extension, supersedes «mutable=True»

  • [orm]

    PickleType and ARRAY mutability turned off by default

    References: #1980

  • [orm]

    Simplified polymorphic_on assignment

    References: #1895

  • [orm]

    Flushing of Orphans that have no parent is allowed

    References: #1912

  • [orm]

    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

  • [orm]

    Warnings generated when collection members, scalar referents not part of the flush

    References: #1973

  • [orm]

    Non-Table-derived constructs can be mapped

    References: #1876

  • [orm]

    Tuple label names in Query Improved

    References: #1942

  • [orm]

    Mapped column attributes reference the most specific column first

    References: #1892

  • [orm]

    Mapping to joins with two or more same-named columns requires explicit declaration

    References: #1896

  • [orm]

    Mapper requires that polymorphic_on column be present in the mapped selectable

    References: #1875

  • [orm]

    compile_mappers() renamed configure_mappers(), simplified configuration internals

    References: #1966

  • [orm]

    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

  • [orm]

    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

  • [orm]

    Session.connection(), Session.execute() accept „bind“, to allow execute/connection operations to participate in the open transaction of an engine explicitly.

    References: #1996

  • [orm]

    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)

  • [orm]

    ScopedSession.mapper is removed (deprecated since 0.5).

  • [orm]

    Horizontal shard query places „shard_id“ in context.attributes where it’s accessible by the «load()» event.

    References: #2031

  • [orm]

    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

  • [orm]

    The «name» field used in orm.aliased() now renders in the resulting SQL statement.

  • [orm]

    Session weak_instance_dict=False is deprecated.

    References: #1473

  • [orm]

    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

  • [orm]

    Query.distinct() now accepts column expressions as *args, interpreted by the PostgreSQL dialect as DISTINCT ON (<expr>).

    References: #1069

  • [orm]

    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

  • [orm]

    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.

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

  • [orm]

    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

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

  • [sql]

    LIMIT/OFFSET clauses now use bind parameters

    References: #805

  • [sql]

    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

  • [sql]

    select.prefix_with() accepts multiple expressions (i.e. *expr), „prefix“ keyword argument to select() accepts a list or tuple.

  • [sql]

    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.

  • [sql]

    TypeDecorator works with primary key columns

    References: #2005, #2006

  • [sql]

    DDL() constructs now escape percent signs

    References: #1897

  • [sql]

    Table.c / MetaData.tables refined a bit, don’t allow direct mutation

    References: #1893, #1917

  • [sql]

    Callables passed to bindparam() don’t get evaluated

    References: #1950

  • [sql]

    types.type_map is now private, types._type_map

    References: #1870

  • [sql]

    Non-public Pool methods underscored

    References: #1982

  • [sql]

    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

  • [sql]

    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.

  • [sql]

    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

  • [sql]

    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

  • [sql]

    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.

    References: #2020, #2021

  • [sql]

    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

  • [sql]

    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.

  • [sql]

    TypeDecorator is present in the «sqlalchemy» import space.

  • [sql]

    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

  • [sql]

    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

  • [sql]

    Column.copy(), as used in table.tometadata(), copies the „doc“ attribute. (also in 0.6.7)

    References: #2028

  • [sql]

    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

  • [sql]

    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

  • [sql]

    SQLite dialect now uses NullPool for file-based databases

    References: #1921

  • [sql]

    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

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

  • [postgresql]

    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

  • [mysql]

    New DBAPI support for pymysql, a pure Python port of MySQL-python.

    References: #1991

  • [mysql]

    oursql dialect accepts the same «ssl» arguments in create_engine() as that of MySQLdb. (also in 0.6.7)

    References: #2047

mssql

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

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

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