0.5 Changelog

0.5.9

no release date

sql

  • [sql]

    Исправлен ошибочный вызов self_group() в пакете expression.

    References: #1661

0.5.8

Released: Sat Jan 16 2010

sql

  • [sql]

    Метод copy() для Column теперь поддерживает неинициализированные, безымянные объекты Column. Это позволяет легко создавать декларативные помощники, размещающие общие колонки в нескольких подклассах.

  • [sql]

    Генераторы по умолчанию, такие как Sequence(), корректно транслируются через операцию copy().

  • [sql]

    Sequence() и другие объекты DefaultGenerator, помимо того, что принимаются позиционно, принимаются в качестве значения для аргументов «по умолчанию» и «при обновлении» ключевого слова Column.

  • [sql]

    Исправлена ошибка арифметики столбцов, которая влияла на соответствие столбцов для клонированных селектов, содержащих отдельно стоящие выражения столбцов. Эта ошибка обычно заметна только при использовании нового поведения ORM, доступного только в 0.6 via, но более корректна и на уровне SQL-выражений.

    References: #1568, #1617

postgresql

  • [postgresql]

    Функция extract(), которая была немного улучшена в 0.5.7, требовала гораздо больше работы для генерации корректного типового примера (типовые примеры, как оказалось, необходимы в PG’шном EXTRACT’е довольно часто). Теперь для генерации типовой выборки используется словарь правил, основанный на документации PG по арифметике даты/времени/интервала. Также он снова принимает конструкции text(), что было нарушено в 0.5.7.

    References: #1647

misc

  • [firebird]

    Распознавать больше ошибок как разъединения.

    References: #1646

0.5.7

Released: Sat Dec 26 2009

orm

  • [orm]

    Функция contains_eager() теперь работает с автоматически сгенерированным подзапросом, который получается, если сказать «query(Parent).join(Parent.somejoinedsubclass)», т.е. когда Parent присоединяется к подклассу, наследующему объединенные таблицы. Ранее функция contains_eager() ошибочно добавляла таблицу подкласса в запрос отдельно, создавая картезианское произведение. Пример приведен в описании тикета.

    References: #1543

  • [orm]

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

    References: #1553

  • [orm]

    Теперь функция Session.execute() определяет местоположение привязок, специфичных для таблиц и мапперов, на основе переданного выражения, которое представляет собой конструкцию insert()/update()/delete().

    References: #1054

  • [orm]

    Функция Session.merge() теперь корректно перезаписывает атрибут many-to-one или uselist=False в None, если в данном объединяемом объекте этот атрибут также None.

  • [orm]

    Исправлен ненужный select, возникавший при объединении переходных объектов, содержащих нулевой идентификатор первичного ключа.

    References: #1618

  • [orm]

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

    References: #1585

  • [orm]

    Исправлен вызов функции get_committed_value() для CompositeProperty.

    References: #1504

  • [orm]

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

    References: #1602

  • [orm]

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

    References: #1480, #1616

  • [orm]

    Поведение «use get» для отношений «многие-к-одному», т.е. ленивая загрузка будет возвращаться к возможно кэшированному значению query.get(), теперь работает в условиях объединения, когда два сравниваемых типа не являются в точности одним и тем же классом, но имеют одинаковое «родство» - например, Integer и SmallInteger. Также позволяет комбинациям отраженных и неотраженных типов работать с отражением типов в стиле 0.5, например, PGText/Text (обратите внимание, что в 0.6 типы отражаются как их общие версии).

    References: #1556

  • [orm]

    Исправлена ошибка в query.update() при передаче Cls.attribute в качестве ключей в дикте значений и использовании synchronize_session=“expire“ („fetch“ в 0.6).

    References: #1436

sql

  • [sql]

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

    References: #1603

  • [sql]

    Исправлен параметр «numeric», который, по-видимому, является параметром по умолчанию, используемым в Informixdb.

  • [sql]

    Повторяющиеся выражения в предложении columns в select вычитаются на основе идентичности каждого элемента предложения, а не фактической строки. Это позволяет корректно отображать позиционные элементы, даже если все они отображаются одинаково, например, параметры привязки в стиле «qmark».

    References: #1574

  • [sql]

    Курсор, связанный с соединениями пула соединений (т.е. _CursorFairy), теперь корректно проксирует __iter__() к базовому курсору.

    References: #1632

  • [sql]

    Типы теперь поддерживают операцию «сравнения родства», т.е. Integer/SmallInteger «совместимы», или Text/String, PickleType/Binary и т.д. Часть.

    References: #1556

  • [sql]

    Исправлена ошибка, не позволяющая клонировать или адаптировать alias() из alias() (часто встречается в операциях ORM).

    References: #1641

postgresql

  • [postgresql]

    Добавлена поддержка отражения типа DOUBLE PRECISION с помощью нового объекта postgres.PGDoublePrecision. Это postgresql.DOUBLE_PRECISION в версии 0.6.

    References: #1085

  • [postgresql]

    Добавлена поддержка отражения синтаксисов INTERVAL YEAR TO MONTH и INTERVAL DAY TO SECOND типа INTERVAL.

    References: #460

  • [postgresql]

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

    References: #1576

  • [postgresql]

    Исправлено поведение extract() для применения правил операторного старшинства к оператору «::» при применении приведения «timestamp» - обеспечивается правильное раскрытие скобок.

    References: #1611

sqlite

  • [sqlite]

    Диалект sqlite корректно генерирует CREATE INDEX для таблицы, находящейся в альтернативной схеме.

    References: #1439

mssql

  • [mssql]

    Изменено имя TrustedConnection на Trusted_Connection при построении аргументов pyodbc connect

    References: #1561

oracle

  • [oracle]

    Диалектная функция «table_names», используемая MetaData .reflect(), опускает «index overflow tables» - системную таблицу, создаваемую Oracle при использовании «index only tables» с переполнением. Эти таблицы недоступны через SQL и не могут быть отражены.

    References: #1637

misc

  • [ext]

    Колонка может быть добавлена в декларативный суперкласс объединенной таблицы после построения класса (т.е. через присвоение атрибутов на уровне класса), и колонка будет распространяться вниз по подклассам. Это ситуация, обратная той, что была исправлена в 0.5.6.

    References: #1523, #1570

  • [ext]

    Исправлена небольшая неточность в примере с шардингом. Сравнение эквивалентности столбцов в ORM лучше всего выполнять с помощью col1.shares_lineage(col2).

    References: #1491

  • [ext]

    Из ShardedQuery удален неиспользуемый метод load().

    References: #1606

0.5.6

Released: Sat Sep 12 2009

orm

  • [orm]

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

    References: #1300

  • [orm]

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

    References: #1507

  • [orm]

    Добавлено утверждение, которое не позволяет функции @validates или другому расширению AttributeExtension загрузить незагруженную коллекцию, что может привести к повреждению внутреннего состояния.

    References: #1526

  • [orm]

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

    References: #1519

  • [orm]

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

    References: #1485

  • [orm]

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

    References: #1477

  • [orm]

    Устранено еще несколько ненужных «ленивых загрузок» из relation(). Когда коллекция мутирует, обратные ссылки «многие-к-одному» на другой стороне не будут загружать «старое» значение, если не установлено значение «single_parent=True». Прямое присваивание many-to-one все равно загружает «старое» значение, чтобы обновить коллекции обратных ссылок на это значение, которое может уже присутствовать в сессии, тем самым сохраняя поведенческий контракт 0.5.

    References: #1483

  • [orm]

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

    References: #1480

  • [orm]

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

    References: #1488

  • [orm]

    UPDATE и DELETE не поддерживают ORDER BY, LIMIT, OFFSET и т.д. в стандартном SQL. Теперь Query.update() и Query.delete() вызывают исключение, если были вызваны какие-либо из limit(), offset(), order_by(), group_by() или distinct().

    References: #1487

  • [orm]

    Добавлено расширение AttributeExtension в sqlalchemy.orm.__all__.

  • [orm]

    Улучшено сообщение об ошибке при вызове функции query() с выражением не на языке SQL /entity.

    References: #1476

  • [orm]

    Использование False или 0 в качестве полиморфного дискриминатора теперь работает как для базового класса, так и для подкласса.

    References: #1440

  • [orm]

    В Query добавлена функция enable_assertions(False), которая отключает обычные утверждения для ожидаемого состояния - используется подклассами Query для проектирования пользовательского состояния. Пример см. на https://www.sqlalchemy.org/trac/wiki/UsageRecipes/PreFilteredQuery.

    References: #1424

  • [orm]

    Исправлена проблема рекурсии, возникавшая в том случае, если метод mapped-объекта __len__() or __nonzero__() приводил к изменению состояния.

    References: #1501

  • [orm]

    Исправлена некорректная передача исключения в Weak/StrongIdentityMap.add()

    References: #1506

  • [orm]

    Исправлено сообщение об ошибке «could not find a FROM clause» в query.join(), которое не выдавалось корректно, если запрос был направлен на чистую конструкцию SQL.

    References: #1522

  • [orm]

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

    References: #1486

sql

  • [sql]

    Исправлена функция column.copy() для копирования значений по умолчанию и при обновлении.

    References: #1373

  • [sql]

    Исправлена ошибка в extract(), появившаяся в 0.5.4, когда строковый аргумент «field» воспринимался как ClauseElement, что приводило к различным ошибкам в более сложных SQL-преобразованиях.

  • [sql]

    Унарные выражения, такие как DISTINCT, распространяют свою обработку типов на наборы результатов, что позволяет выполнять преобразования типа unicode и т.п.

    References: #1420

  • [sql]

    Исправлена ошибка в Table и Column, при которой передача пустого dict для аргумента «info» приводила к возникновению исключения.

    References: #1482

oracle

  • [oracle]

    В 0.6 исправлена ошибка, связанная с тем, что имена псевдонимов Oracle не усекались.

    References: #1309

misc

  • [ext]

    Прокси-коллекции, создаваемые associationproxy, стали pickleable. Однако пользовательский proxy_factory по-прежнему не является pickleable, если в нем не определены __getstate__ и __setstate__.

    References: #1446

  • [ext]

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

    References: #1468

  • [ext]

    Объекты таблиц, объявленные в метаданных, теперь можно использовать в строковых выражениях, передаваемых в primaryjoin/secondaryjoin/ secondary - имя подтягивается из метаданных декларативной базы.

    References: #1527

  • [ext]

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

    References: #1523

  • [test]

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

0.5.5

Released: Mon Jul 13 2009

general

  • [general]

    юнит-тесты были перенесены из unittest в nose. Информацию о том, как запускать тесты, смотрите в README.unittests.

    References: #970

orm

  • [orm]

    Аргумент «foreign_keys» в relation() теперь будет автоматически распространяться на backref точно так же, как это делают primaryjoin и secondaryjoin. Для крайне редких случаев, когда обратный адрес relation() имеет намеренно разные «foreign_keys», обе стороны теперь должны быть настроены явно (если они действительно требуют этой настройки, см. следующее примечание…).

  • [orm]

    …Единственный известный (и очень-очень редкий) случай использования различных настроек foreign_keys на стороне прямого и обратного направления - составной внешний ключ, частично указывающий на собственные столбцы, - был усовершенствован таким образом, что аспект отношения fk->itself не будет использоваться для определения направления отношения.

  • [orm]

    Session.mapper теперь является устаревшим.

    Вызовите session.add(), если вы хотите, чтобы отдельно стоящий объект стал частью вашей сессии. В противном случае, DIY-версия Session.mapper теперь документирована по адресу https://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper. Метод останется устаревшим в версии 0.6.

  • [orm]

    Исправлена ошибка, при которой запрос мог соединяться() из отдельных колонок сущности подкласса объединенной таблицы, т.е. query(SubClass.foo, SubClass.bar).join(<anything>). В большинстве случаев будет выдана ошибка «Could not find a FROM clause to join from». В некоторых других случаях результат возвращался в терминах базового класса, а не подкласса, поэтому приложения, полагающиеся на такой ошибочный результат, необходимо скорректировать.

    References: #1431

  • [orm]

    Исправлена ошибка, связанная с функцией contains_eager(), которая в редких случаях применялась к вторичной (т.е. «ленивой») загрузке, создавая картезианские продукты. улучшена работа с query.options() при вторичной загрузке в целом.

    References: #1461

  • [orm]

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

  • [orm]

    Исправлена еще одна ошибка версии 0.5.4, из-за которой мутируемые атрибуты (например, PickleType) не десериализовывались корректно при сериализации всего объекта.

    References: #1426

  • [orm]

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

  • [orm]

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

  • [orm]

    Исправлена ошибка, из-за которой атрибуты, основанные на списках, такие как pickletype и PGArray, не могли быть объединены() должным образом.

  • [orm]

    Исправлена неработающая функция attributes.set_committed_value.

  • [orm]

    Уменьшен формат pickle для InstanceState, что должно еще больше сократить объем памяти, занимаемой маринованными экземплярами. Формат должен быть обратно совместим с форматом 0.5.4 и предыдущих версий.

  • [orm]

    sqlalchemy.orm.join и sqlalchemy.orm.outerjoin теперь добавлены к __all__ в sqlalchemy.orm.*.

    References: #1463

  • [orm]

    Исправлена ошибка, когда при передаче в get() слишком короткого составного значения первичного ключа не срабатывало исключение Query.

    References: #1458

sql

  • [sql]

    Устранена неясная особенность execute() (включая connection, engine, Session), при которой конструкция bindparam() может быть отправлена в качестве ключа в словарь params. Такое использование не документировано и лежит в основе проблемы, когда объект bindparam(), неявно созданный конструкцией text(), может иметь такое же хэш-значение, как и строка, помещенная в словарь params, что может привести к некорректному совпадению при вычислении окончательных параметров связывания. Внутренняя проверка этого условия привела бы к значительным задержкам в критической задаче рендеринга параметров, поэтому данное поведение удалено. Это изменение несовместимо с обратным ходом событий для любых приложений, которые могли использовать эту возможность, однако она никогда не была документирована.

misc

  • [engine/pool]

    Реализована функция recreate() для StaticPool.

0.5.4p2

Released: Tue May 26 2009

sql

  • [sql]

    Исправлена печать исключений SQL, не основанных на параметрах или не относящихся к стилю executemany().

postgresql

  • [postgresql]

    Устранена жестко заданная функция TIMESTAMP, которая при использовании func.TIMESTAMP(value) выдавала «значение TIMESTAMP». На некоторых платформах это приводит к сбоям, поскольку PostgreSQL не позволяет использовать параметры привязки в таком контексте. Жестко закодированный верхний регистр также неуместен, и существует множество других PG-приведений, которые мы должны поддерживать. Поэтому вместо этого используйте текстовые конструкции, например select([«timestamp „12/05/09“»]).

0.5.4p1

Released: Mon May 18 2009

orm

  • [orm]

    Исправлена ошибка атрибутов, появившаяся в 0.5.4, которая возникала при использовании функции merge() с неполным объектом.

0.5.4

Released: Sun May 17 2009

orm

  • [orm]

    Значительно увеличена производительность функции Sessions/flush() при работе с большими графами мапперов, большим количеством объектов:

    • Удалено все* O(N) поведение сканирования в процессе flush(), т.е. операции, которые сканировали всю сессию, включая чрезвычайно дорогую операцию, которая ошибочно предполагала, что значения первичных ключей меняются, когда это было не так.

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

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

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

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

      Это изменение также затрагивает внутренний API атрибутов, но не интерфейс AttributeExtension и не какие-либо публично документированные функции атрибутов.

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

    • Кэширование расточительной операции «сортировки таблицы», которая ранее выполнялась несколько раз за одну попытку, а также удаление значительного количества вызовов метода flush().

    • В mapper._save_obj() были упрощены другие избыточные поведения.

    References: #1398

  • [orm]

    Модифицирован query_cls в DynamicAttributeImpl для принятия полной миксин-версии AppenderQuery, что позволяет использовать подклассы AppenderMixin.

  • [orm]

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

    References: #1300

  • [orm]

    Исправлена ошибка, связанная с тем, что оценщик не мог оценить предложение IS NULL.

  • [orm]

    Исправлена функция «установить коллекцию» для «динамических» отношений для корректного инициирования событий. Ранее коллекция могла быть назначена только на ожидающий родительский экземпляр, в противном случае модифицированные события запускались некорректно. Функция set collection теперь совместима с функцией merge(), исправления.

    References: #1352

  • [orm]

    Разрешена пикировка объектов PropertyOption, построенных с использованием инструментальных дескрипторов; ранее при пикировке объекта, загруженного с использованием дескрипторной опции, например query.options(eagerload(MyClass.foo)), возникали ошибки pickle.

  • [orm]

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

    References: #1357

  • [orm]

    MapperOptions и другие состояния, связанные с query.options(), больше не связываются в процессе загрузки с каждым атрибутом ленивой/отложенной загрузки. Теперь опции ассоциируются с объектом состояния экземпляра только один раз при его заполнении. Это в большинстве случаев устраняет необходимость в объектах-загрузчиках для каждого экземпляра/атрибута, повышая скорость загрузки и снижая затраты памяти для отдельных экземпляров.

    References: #1391

  • [orm]

    Исправлено еще одно место, где autoflush мешал работе session.merge(). Теперь autoflush полностью отключается на время работы merge().

    References: #1360

  • [orm]

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

    References: #1406

  • [orm]

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

  • [orm]

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

  • [orm]

    Исправлена документация для сессии weak_identity_map - значение по умолчанию равно True, что указывает на использование слабой карты ссылок.

  • [orm]

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

    References: #1376

  • [orm]

    Исправлены ошибки Query.update() и Query.delete() при работе с отношениями, загруженными с нетерпением.

    References: #1378

  • [orm]

    Теперь ошибкой является указание обоих столбцов бинарного условия primaryjoin в коллекции foreign_keys или remote_side. Ранее это было просто нелепо, но при этом достигалось недетерминированным образом.

sql

  • [sql]

    Выполнен обратный перенос расширения «compiler» из SQLA 0.6. Это стандартизированный интерфейс, позволяющий создавать собственные подклассы ClauseElement и компиляторы. В частности, он удобен в качестве альтернативы text(), когда требуется создать конструкцию с компиляциями, специфичными для базы данных. Подробности см. в документации по расширению.

  • [sql]

    Сообщения об исключениях усекаются, если список связанных параметров превышает 10, что предотвращает заполнение экранов и лог-файлов огромными многостраничными исключениями для больших операторов executemany().

    References: #1413

  • [sql]

    sqlalchemy.extract() теперь чувствителен к диалектам и может извлекать компоненты временных меток идиоматическим образом из всех поддерживаемых баз данных, включая SQLite.

  • [sql]

    Исправлены __repr__() и другие методы _get_colspec() для ForeignKey, построенных на основе конструкции стиля __clause_element__() (т.е. декларативных колонок).

    References: #1353

schema

  • [schema] [1341] [ticket: 594]

    В класс IdentifierPreparer добавлен метод quote_schema(), чтобы диалекты могли переопределять способ работы со схемами. Это позволяет диалекту MSSQL рассматривать схемы как многокомпонентные идентификаторы, такие как „database.owner“.

extensions

  • [extensions]

    Исправлено добавление отложенных или других свойств столбцов в декларативный класс.

    References: #1379

mysql

  • [mysql]

    При отражении конструкции FOREIGN KEY будет учитываться точечная комбинация schema.tablename, если внешний ключ ссылается на таблицу в удаленной схеме.

    References: #1405

sqlite

  • [sqlite]

    Исправлен тип SLBoolean таким образом, чтобы он правильно воспринимал только 1 как True.

    References: #1402

  • [sqlite]

    Исправлен тип float таким образом, чтобы при отражении он корректно отображался на тип SLFloat.

    References: #1273

mssql

  • [mssql]

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

  • [mssql]

    Добавлены зарезервированные слова для MSSQL, которые охватывают версию 2008 и все предыдущие версии.

    References: #1310

  • [mssql]

    Исправлена проблема, связанная с тем, что информационная схема не работала с базой данных, основанной на двоичной свертке. Очистка информационной схемы, так как теперь она используется только mssql.

    References: #1343

0.5.3

Released: Tue Mar 24 2009

orm

  • [orm]

    Аргумент «objects» для session.flush() является устаревшим. Состояние, представляющее собой связь между родительским и дочерним объектом, не поддерживает статус «flushed» на одной стороне связи и не поддерживает на другой, поэтому поддержка этой операции приводит к недостоверным результатам.

    References: #1315

  • [orm]

    Теперь Query реализует функцию __clause_element__(), которая производит его selectable, что означает, что экземпляр Query может быть принят во многие SQL-выражения, включая col.in_(query), union(query1, query2), select([foo]).select_from(query) и т.д.

  • [orm]

    Query.join() теперь может создавать несколько предложений FROM, если это необходимо. Например, query(A, B).join(A.x).join(B.y) может содержать SELECT A.*, B.* FROM A JOIN X, B JOIN Y. Eager loading также может присоединять свои соединения к этим нескольким предложениям FROM.

    References: #1337

  • [orm]

    Исправлена ошибка в функции dynamic_loader(), из-за которой события добавления/удаления после времени построения не передавались в UOW для последующей обработки в функции flush().

    References: #1347

  • [orm]

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

  • [orm]

    при выполнении функции session.expire() для конкретного атрибута коллекции будут удалены все незавершенные добавления обратных ссылок, так что при следующем обращении будет корректно возвращено только то, что имелось в базе данных. Это в некоторой степени обходной путь, хотя мы рассматриваем возможность полного отказа от функции flush([objects]).

    References: #1315

  • [orm]

    Session.scalar() теперь преобразует необработанные строки SQL в text() так же, как это делает Session.execute(), и принимает те же альтернативные **kw аргументы.

  • [orm]

    Улучшение логики «определения направления» в relation() таким образом, чтобы можно было определить направление в таких сложных ситуациях, как mapper(A.join(B)) -> relation-> mapper(B).

  • [orm]

    При очистке частичных наборов объектов с помощью session.flush([somelist]) отложенные объекты, оставшиеся после выполнения операции, не будут случайно добавлены как постоянные.

    References: #1306

  • [orm]

    В InstrumentationManager добавлен метод «post_configure_attribute», благодаря чему пример «listen_for_events.py» снова работает.

    References: #1314

  • [orm]

    прямая и дополняющая ее обратная ссылки, которые имеют одно и то же направление, т.е. ONETOMANY или MANYTOONE, теперь обнаруживаются, и выдается сообщение об ошибке. Это позволяет в дальнейшем избежать безумных ошибок CircularDependencyErrors.

  • [orm]

    Исправлена ошибка в Query, связанная с одновременным выбором нескольких объектов наследования объединенных таблиц с общими базовыми классами:

    • Ранее адаптация, примененная к «B» на «A JOIN B», ошибочно частично применялась к «A».

    • Сравнения по отношениям (например, A.related==someb) не адаптировались, когда должны были.

    • Другие фильтры, например query(A).join(A.bs).filter(B.foo==“bar“), ошибочно адаптировали «B.foo» так, как будто это «A».

  • [orm]

    Исправлена адаптация предложений EXISTS через any(), has() и т.д. в сочетании с алиасированным объектом слева и of_type() справа.

    References: #1325

  • [orm]

    В sqlalchemy.orm.attributes добавлен вспомогательный метод атрибутов set_committed_value. Учитывая объект, имя атрибута и значение, установит это значение на объект как часть его «зафиксированного» состояния, т.е. состояния, которое считается загруженным из базы данных. Помогает при создании собственных загрузчиков коллекций и т.п.

  • [orm]

    Запрос не будет завершаться с ошибкой weakref при передаче дескриптора, не относящегося к мапперу/классу инструментов, а будет выдавать ошибку «Invalid column expression».

  • [orm]

    Query.group_by() правильно учитывает алиасинг, примененный к предложению FROM, например, при использовании select_from(), при использовании with_polymorphic() или при использовании from_self().

sql

  • [sql]

    Псевдоним() select() будет преобразован в «скалярный подзапрос» при использовании его в однозначно скалярном контексте, т.е. при использовании в операции сравнения. Это относится и к ORM при использовании query.subquery().

  • [sql]

    Исправлено отсутствие атрибута _label у объекта Function, в том числе при использовании в select() с use_labels (например, при использовании в ORM column_property()).

    References: #1302

  • [sql]

    анонимные имена псевдонимов теперь усекаются до максимальной длины, допустимой диалектом. Это более существенно для таких СУБД, как Oracle, с очень маленькими ограничениями на количество символов.

    References: #1309

  • [sql]

    интерфейс __selectable__() был полностью заменен на __clause_element__().

  • [sql]

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

    References: #1299

extensions

  • [extensions]

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

  • [extensions]

    Декларативный поиск «наследует» класс, используя поиск по __bases__, чтобы пропустить миксины, которые являются локальными для подклассов.

  • [extensions]

    Декларативное определение наследования объединенных таблиц первичным условием join даже при явном указании аргумента mapper «наследует».

  • [extensions]

    Declarative будет правильно интерпретировать аргумент «foreign_keys» в функции backref(), если он является строкой.

  • [extensions]

    Declarative будет принимать в качестве свойства столбец, связанный с таблицей, при использовании в сочетании с __table__, если этот столбец уже присутствует в __table__. Столбец будет ремаппирован на заданный ключ так же, как и при добавлении в дикту свойств mapper().

postgresql

  • [postgresql]

    Отражение индекса не приводит к сбою при встрече индекса с несколькими выражениями.

  • [postgresql]

    В sqlalchemy.databases.postgres добавлены типы PGUuid и PGBit.

    References: #1327

  • [postgresql]

    Отражение неизвестных типов PG не приводит к сбою, если эти типы указаны в домене.

    References: #1327

sqlite

  • [sqlite]

    Исправлены методы отражения SQLite таким образом, чтобы определялось отсутствие cursor.description, вызывающее автозакрытие курсора, и чтобы не возникало ошибки no results на последних версиях pysqlite, которые выдают ошибку при вызове fetchone() при отсутствии строк.

mssql

  • [mssql]

    Предварительная поддержка pymssql 1.0.1

  • [mssql]

    Исправлена ошибка в mssql, при которой не соблюдалась максимальная длина идентификатора (max_identifier_length).

0.5.2

Released: Sat Jan 24 2009

orm

  • [orm]

    Доработано предупреждение версии 0.5.1 о каскаде удалений-орфанов, размещенных на отношениях «многие-ко-многим». Сначала плохие новости: предупреждение будет распространяться как на отношения «многие-ко-многим», так и на отношения «многие-один». Это необходимо, поскольку в обоих случаях SQLA не сканирует весь набор потенциальных родителей при определении статуса «сироты» - для персистентного объекта она обнаруживает только событие de-association in-python для определения объекта как «сироты». Далее хорошие новости: для поддержки связи «один к одному» через внешний ключ или ассоциативную таблицу, а также для поддержки связи «один ко многим» через ассоциативную таблицу можно установить новый флаг single_parent=True, который указывает, что объекты, связанные с данным отношением, должны иметь только одного родителя. Если в Python произойдет несколько событий, связанных с родительской ассоциацией, то отношение выдаст ошибку.

  • [orm]

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

    References: #1292

  • [orm]

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

  • [orm]

    Исправлена ошибка, из-за которой самоссылающаяся самозагрузка не позволяла другим самоссылающимся загрузкам, как самоссылающимся, так и нет, корректно присоединяться к родительскому JOIN. Спасибо Alex K за создание отличного тестового примера.

  • [orm]

    session.expire() и связанные с ним методы не будут уничтожать() незагруженные отложенные атрибуты. Это предотвращает их ненужную загрузку при обновлении экземпляра.

  • [orm]

    query.join()/outerjoin() теперь будет корректно присоединять конструкцию aliased() к существующей левой части, даже если был вызван query.from_self() или query.select_from(someselectable).

    References: #1293

sql

  • [sql]

    Дальнейшие исправления «знаков процента и пробелов в колонках/таблицах

    имена».

    References: #1284

mssql

  • [mssql]

    Восстановлена обработка convert_unicode. Результаты передавались без преобразования.

    References: #1291

  • [mssql]

    Правда, на этот раз исправлена работа с десятичными дробями…

    References: #1282

  • [mssql] [Ticket:1289]

    Модифицирован код отражения таблиц, чтобы при построении таблиц использовались только kwargs.

0.5.1

Released: Sat Jan 17 2009

orm

  • [orm]

    Удален внутренний кэш join, который потенциально мог привести к утечке памяти при многократной выдаче query.join() для специальных селектов.

  • [orm]

    Методы сессий «clear()», «save()», «update()», «save_or_update()» были устаревшими и заменены на «expunge_all()» и «add()». «expunge_all()» также был добавлен в ScopedSession.

  • [orm]

    Модернизировано исключение «no mapped table» и добавлено более явное исключение __table__/__tablename__ в декларативный формат.

  • [orm]

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

    References: #1237

  • [orm]

    Добавлено новое ключевое слово relation() back_populates. Оно позволяет настраивать обратные ссылки с помощью явных отношений. Это необходимо при создании двунаправленных связей между иерархией конкретных отображателей и другим классом.

    References: #1237, #781

  • [orm]

    Добавлено тестовое покрытие для объектов relation(), заданных на конкретных картографах.

    References: #1237

  • [orm]

    Query.from_self(), а также query.subquery() отключают отображение нетерпеливых соединений внутри создаваемого подзапроса. Функция «отключения всех нетерпеливых соединений» доступна публично через новый генератив query.enable_eagerloads().

    References: #1276

  • [orm]

    В Query добавлен рудиментарный ряд операций над множествами, получающими в качестве аргументов объекты Query, включая union(), union_all(), intersect(), except_(), intersect_all(), except_all(). Примеры приведены в документации API для Query.union().

  • [orm]

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

  • [orm]

    Добавлен краткий пример документации для двунаправленных отношений, заданных на конкретных картографах.

    References: #1237

  • [orm]

    Теперь отображатели инструментируют атрибуты классов при построении с помощью конечного объекта InstrumentedAttribute, который остается постоянным. Методология _CompileOnAttr/__getattribute__() была удалена. Чистый эффект заключается в том, что атрибуты класса, отображаемые на основе столбцов, теперь могут полностью использоваться на уровне класса без применения операции компиляции отображателя, что значительно упрощает типичные схемы использования в декларативных системах.

    References: #1269

  • [orm]

    ColumnProperty (и внешние помощники, такие как deferred) больше не игнорируют неизвестные аргументы **keyword.

  • [orm]

    Исправлена ошибка, связанная с механизмом «переключения строк» в Unitofwork, т.е. преобразования INSERT/DELETE в UPDATE, в сочетании с наследованием объединенных таблиц и объектом, не содержащим определенных значений для дочерней таблицы, где будет выводиться UPDATE без предложения SET.

  • [orm]

    Использование функции delete-orphan для отношения «многие-ко-многим» неактуально. Это приводит к недостоверным или ошибочным результатам, поскольку SQLA не получает полный список «родителей» для m2m. Чтобы добиться поведения delete-orphan в таблице m2m, используйте явный класс ассоциации, чтобы отдельная строка ассоциации рассматривалась как родительская.

    References: #1281

  • [orm]

    Каскад delete-orphan всегда требует каскада delete. Указание delete-orphan без delete теперь вызывает предупреждение об устаревании.

    References: #1281

sql

  • [sql]

    Улучшена методика работы со знаками процента в именах столбцов from. Добавлены дополнительные тесты. Диалекты MySQL и PostgreSQL по-прежнему не выдают корректных операторов CREATE TABLE для идентификаторов со знаками процента.

    References: #1256

schema

  • [schema]

    Теперь Index принимает в качестве аргументов столбцы, ориентированные на InstrumentedAttributes (т.е. атрибуты сопоставленных классов, основанные на столбцах).

    References: #1214

  • [schema]

    Колонка без имени (как в декларативном варианте) не будет вызывать ошибку NoneType при запросе ее строкового вывода (например, в трассировке стека).

  • [schema]

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

    References: #1278

mysql

  • [mysql]

    Добавлены недостающие ключевые слова из MySQL 4.1, чтобы они правильно экранировались.

mssql

  • [mssql]

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

    References: #1280

  • [mssql]

    Изменена обработка do_begin в mssql для использования курсора, а не соединения, чтобы обеспечить совместимость с DBAPI.

  • [mssql]

    Исправлена поддержка SAVEPOINT в adodbapi путем изменения обработки savepoint_release, которая не поддерживается в mssql.

misc

  • [declarative]

    Теперь можно указывать объекты Column для подклассов, не имеющих собственной таблицы (т.е. использующих наследование одной таблицы). Колонки будут добавлены в базовую таблицу, но отображены только подклассом.

  • [declarative]

    Для объединенных и одиночно наследующих подклассов подкласс отображает только те столбцы, которые уже отображены в суперклассе, и те, которые явно отображены в подклассе. Другие столбцы, присутствующие в Table will be excluded from the mapping by default, which can be disabled by passing a blank exclude_properties collection to the __mapper_args__. Это сделано для того, чтобы классы с одним наследованием, которые определяют свои собственные столбцы, были единственными классами, отображающими эти столбцы. В результате получается более организованное отображение, чем при явном вызове mapper(), если только вы не зададите аргументы exclude_properties явно.

  • [declarative]

    Ошибкой является добавление новых объектов Column в декларативный класс, который указал существующую таблицу с помощью __table__.

0.5.0

Released: Tue Jan 06 2009

general

  • [general]

    Документация переведена на язык Sphinx. В частности, сгенерированная документация по API превратилась в полноценный раздел «API Reference», в котором организована редакционная документация в сочетании со сгенерированными док-строками. Значительно улучшена перекрестная связь между разделами и документами API, реализована возможность поиска с помощью javascript, а также полный индекс всех классов, функций и членов.

  • [general]

    Теперь setup.py импортирует setuptools только опционально. Если его нет, то используется distutils. Новый инсталлятор «pip» рекомендуется использовать вместо easy_install, так как его установка более упрощена.

  • [general]

    в папку с примерами добавлена очень простая иллюстрация интеграции с PostGIS.

orm

  • [orm]

    Query.with_polymorphic() теперь принимает третий аргумент «discriminator», который будет заменять значение mapper.polymorphic_on для данного запроса. Самим картографам больше не требуется устанавливать значение polymorphic_on, даже если картограф имеет идентификатор polymorphic_identity. Если значение не установлено, то по умолчанию отображатель будет загружаться неполиморфно. Вместе эти две возможности позволяют использовать полиморфную загрузку в неполиморфной конкретной системе наследования на основе отдельных запросов, поскольку конкретные системы подвержены многим проблемам при использовании полиморфной загрузки во всех случаях.

  • [orm]

    dynamic_loader принимает параметр query_class= для настройки классов запросов, используемых как для динамической коллекции, так и для запросов, построенных на ее основе.

  • [orm]

    query.order_by() принимает значение None, что приведет к удалению из запроса любого состояния order_by, а также отмене любого упорядочивания, заданного в маппере/реляции. В основном это полезно для переопределения упорядочивания, заданного в динамическом загрузчике (dynamic_loader()).

    References: #1079

  • [orm]

    Исключения, возникающие при компиляции compile_mappers(), теперь сохраняются для обеспечения «липкого поведения» - если вызов hasattr() для предварительно скомпилированного маппированного атрибута вызывает неудачную компиляцию и подавляет исключение, последующая компиляция блокируется, и исключение будет повторено при следующем вызове compile(). Эта проблема часто возникает при использовании декларативного подхода.

  • [orm]

    property.of_type() теперь распознается на однотабличной наследующей цели, когда используется в контексте prop.of_type(…).any()/has(), а также query.join(prop.of_type(…)).

  • [orm]

    query.join() выдает ошибку, если цель соединения не совпадает с атрибутом, основанным на свойстве - хотя вряд ли кто-то так делает, автор SQLAlchemy был виновен именно в таком вольном поведении.

  • [orm]

    Исправлена ошибка, когда при использовании weak_instance_map=False модифицированные события не перехватывались при выполнении flush().

    References: #1272

  • [orm]

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

    References: #1268

  • [orm]

    Пользовательские классы компараторов, используемые совместно с column_property(), relation() и т.д., могут определять новые методы сравнения на компараторе, которые станут доступны через __getattr__() на InstrumentedAttribute. В случае использования функций synonym() или comparable_property() атрибуты разрешаются сначала на пользовательском дескрипторе, а затем на пользовательском компараторе.

  • [orm]

    Добавлен аксессуар ScopedSession.is_active.

    References: #976

  • [orm]

    В качестве ключей в query.update({}) можно передавать сопоставленные атрибуты и объекты столбцов.

    References: #1262

  • [orm]

    Сопоставленные атрибуты, переданные в values() выражения уровня insert() или update(), будут использовать ключи сопоставленных столбцов, а не ключи сопоставленного атрибута.

  • [orm]

    Исправлена проблема некорректной работы Query.delete() и Query.update() с параметрами привязки.

    References: #1242

  • [orm]

    Query.select_from(), from_statement() гарантируют, что заданный аргумент является FromClause или Text/Select/Union соответственно.

  • [orm]

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

    References: #1253

  • [orm]

    Query() немного более устойчив при передаче различных выражений столбцов, таких как строки, клаузелисты, конструкции text() (что может означать, что он просто более вежливо выдает ошибку).

  • [orm]

    first() работает, как и ожидалось, с Query.from_statement().

  • [orm]

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

  • [orm]

    Исправлена ошибка, при которой связь многие-ко-многим() с viewonly=True некорректно ссылалась на связь secondary->remote.

  • [orm]

    Дубликаты элементов в списочной коллекции будут сохраняться при выполнении INSERT в «вторичную» таблицу в отношении «многие-ко-многим». Если на таблицу m2m наложено ограничение уникальности или первичного ключа, то вместо молчаливого удаления дублирующихся записей это приведет к ожидаемому нарушению ограничений. Обратите внимание, что для отношения «один-ко-многим» сохраняется старое поведение, поскольку записи коллекции в этом случае не приводят к INSERT-запросам, и SQLA не контролирует коллекции вручную.

    References: #1232

  • [orm]

    Query.add_column() может принимать объекты FromClause так же, как и session.query().

  • [orm]

    Сравнение отношения «многие-к-одному» с NULL корректно преобразуется в IS NOT NULL на основе not_().

  • [orm]

    Добавлена дополнительная проверка на то, что явные primaryjoin/secondaryjoin являются экземплярами ClauseElement, чтобы в дальнейшем не возникало путаных ошибок.

    References: #1087

  • [orm]

    Улучшена проверка mapper() для классов, не являющихся классами.

    References: #1236

  • [orm]

    Аргумент comparator_factory теперь документирован и поддерживается всеми типами MapperProperty, включая column_property(), relation(), backref() и synonym().

    References: #5051

  • [orm]

    Изменено название PropertyLoader на RelationProperty, чтобы соответствовать всем остальным названиям. PropertyLoader по-прежнему присутствует в качестве синонима.

  • [orm]

    исправлен вызов «double iter()», вызывавший ошибки шины в API шардов, удалена ошибка result.close(), оставшаяся от версии 0.4.

    References: #1099, #1228

  • [orm]

    Сделано так, чтобы каскады Session.merge не вызывали автопромывку. Исправление преждевременной вставки объединенных экземпляров с отсутствующими значениями.

  • [orm]

    Два исправления для предотвращения вывода внеполосных столбцов в сценариях наследования polymorphic_union (что приводит к выводу лишних таблиц в предложении FROM, вызывая появление cartesian products):

    • Улучшена «адаптация столбцов» для ситуаций наследования a->b->c, что позволяет лучше находить столбцы, связанные друг с другом через несколько уровней косвенности, а не выводить неадаптированный столбец.

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

  • [orm]

    Исправлен аргумент shard_id в файле ShardedSession.execute().

    References: #1072

sql

  • [sql]

    Объекты RowProxy можно использовать вместо словарных аргументов, передаваемых в connection.execute() и друзьям.

    References: #935

  • [sql]

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

    References: #1256

  • [sql]

    sqlalchemy.sql.expression.Function теперь является публичным классом. Он может быть подклассифицирован для создания пользовательских SQL-функций в императивном стиле, в том числе с заранее заданным поведением. Пример postgis.py иллюстрирует один из вариантов такого использования.

  • [sql]

    Теперь PickleType по умолчанию предпочитает сравнение ==, если входящий объект (например, dict) реализует __eq__(). Если объект не реализует __eq__() и mutable=True, то выдается предупреждение об устаревании.

  • [sql]

    Исправлена странность импорта в sqlalchemy.sql, чтобы не экспортировать __names__.

    References: #1215

  • [sql]

    Повторное использование одного и того же объекта ForeignKey приводит к ошибке, а не к тихому отказу в дальнейшем.

    References: #1238

  • [sql]

    Добавлена ошибка NotImplementedError для метода params() в конструкциях Insert/Update/Delete. В настоящее время эти элементы не поддерживают данную функциональность, что также будет немного вводить в заблуждение по сравнению с values().

  • [sql]

    Отраженные внешние ключи будут правильно определять местоположение ссылающегося на них столбца, даже если столбцу был присвоен атрибут «key», отличный от отраженного имени. Это достигается с помощью нового флага в ForeignKey/ForeignKeyConstraint под названием «link_to_name», если он равен True, то данное имя является именем ссылающегося столбца, а не его назначенного ключа.

    References: #650

  • [sql]

    select() может принимать ClauseList в качестве столбца так же, как Table или другой selectable, и в качестве элементов столбца будут использоваться внутренние выражения.

    References: #1253

  • [sql]

    флаг «passive» в session.is_modified() корректно передается менеджеру атрибутов.

  • [sql]

    union() и union_all() не будут уничтожать order_by(), который был применен к select()ам внутри них. Если вы объединяете select() с order_by() (предположительно для поддержки LIMIT/OFFSET), вы должны также вызвать self_group() для применения скобок.

mysql

  • [mysql]

    Знаки «%» в конструкциях text() автоматически экранируются в «%%». Из-за обратной несовместимости этого изменения при обнаружении в строке знака „%%“ выдается предупреждение.

  • [mysql]

    Исправлена ошибка в возникновении исключения при отсутствии FK-столбцов во время отражения.

    References: #1241

  • [mysql]

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

sqlite

  • [sqlite]

    Отражение таблицы теперь хранит фактическое значение DefaultClause для столбца.

    References: #1266

  • [sqlite]

    исправления ошибок, изменения в поведении

mssql

  • [mssql]

    Добавлен новый тип MSGenericBinary. Он сопоставляется с типом Binary, что позволяет реализовать специализированное поведение, при котором типы с указанной длиной рассматриваются как бинарные типы фиксированной ширины, а типы без длины - как бинарные типы переменной длины без привязки.

  • [mssql]

    Добавлены новые типы: MSVarBinary и MSImage.

    References: #1249

  • [mssql]

    Добавлено в типы MSReal, MSNText, MSSmallDateTime, MSTime, MSDateTimeOffset и MSDateTime2

  • [mssql]

    Переработаны типы Date/Time. Тип данных smalldatetime больше не обрезается только до даты и теперь будет отображаться на тип MSSmallDateTime.

    References: #1254

  • [mssql]

    Исправлена проблема, связанная с тем, что Numerics принимает значение int.

  • [mssql]

    Сопоставил char_length с функцией LEN().

  • [mssql]

    Если INSERT включает в себя подвыборку, то INSERT преобразуется из конструкции INSERT INTO VALUES в конструкцию INSERT INTO SELECT.

  • [mssql]

    Если столбец является частью primary_key, то он будет NOT NULL, поскольку MSSQL не допускает NULL в столбцах primary_key.

  • [mssql]

    MSBinary теперь возвращает BINARY вместо IMAGE. Это изменение обратно несовместимо с тем, что BINARY является типом данных фиксированной длины, а IMAGE - типом данных переменной длины.

    References: #1249

  • [mssql]

    get_default_schema_name теперь отражается из базы данных на основе схемы пользователя по умолчанию. Это работает только с MSSQL 2005 и более поздними версиями.

    References: #1258

  • [mssql]

    Добавлена поддержка collation за счет использования нового аргумента collation. Он поддерживается для следующих типов: char, nchar, varchar, nvarchar, text, ntext.

    References: #1248

  • [mssql]

    Изменения параметров строки соединения благоприятствуют использованию DSN в качестве спецификации по умолчанию для pyodbc. Подробные инструкции по использованию приведены в документальной строке mssql.py.

  • [mssql]

    Добавлена экспериментальная поддержка точек сохранения. В настоящее время она не полностью работает с сессиями.

  • [mssql]

    Поддержка трех уровней недействительности столбцов: NULL, NOT NULL и конфигурация базы данных по умолчанию. Конфигурация столбцов по умолчанию (nullable=True) теперь будет генерировать NULL в DDL. Ранее никаких спецификаций не выдавалось, и в силу вступало значение базы данных по умолчанию (обычно NULL, но не всегда). Чтобы явно запросить значение базы данных по умолчанию, сконфигурируйте столбцы с nullable=None, и в DDL не будет выдаваться спецификация. Такое поведение несовместимо с обратным ходом событий.

    References: #1243

oracle

  • [oracle]

    Скорректирован формат функции create_xid() для исправления двухфазной фиксации. Теперь у нас есть сообщения о том, что двухфазная фиксация Oracle работает корректно с этим изменением.

  • [oracle]

    Добавлен тип OracleNVarchar, порождающий NVARCHAR2, а также подклассы Unicode, так что convert_unicode=True по умолчанию. NVARCHAR2 отражается в этот тип автоматически, поэтому эти столбцы передают юникод в отраженной таблице без явных флагов convert_unicode=True.

    References: #1233

  • [oracle]

    Исправлена ошибка, из-за которой не принимались out-параметры определенных типов; большое спасибо huddlej at wwu.edu !

    References: #1265

misc

  • [dialect]

    Добавлен новый атрибут description_encoding для диалекта, который используется для кодировки имени колонки при обработке метаданных. Обычно по умолчанию используется значение utf-8.

  • [engine/pool]

    Connection.invalidate() проверяет наличие закрытого статуса, чтобы избежать ошибок атрибутов.

    References: #1246

  • [engine/pool]

    NullPool поддерживает поведение повторного подключения при сбое.

    References: #1094

  • [engine/pool]

    Добавлен мьютекс для начального создания пула при использовании pool.manage(dbapi). Это предотвращает незначительный случай «собачьей кучи», которая в противном случае могла бы возникнуть при запуске с большой нагрузкой.

    References: #799

  • [engine/pool]

    Метод _execute_clauseelement() снова становится приватным. Подкласс Connection теперь не нужен, поскольку появился ConnectionProxy.

  • [documentation]

    Билеты.

    References: #1149, #1200

  • [documentation]

    Добавлено примечание о настройках create_session() по умолчанию.

  • [documentation]

    Добавлен раздел о metadata.reflect().

  • [documentation]

    Обновлен раздел TypeDecorator.

  • [documentation]

    Переписан раздел документации, посвященный стратегии «threadlocal», в связи с недавней путаницей с этой функцией.

  • [documentation]

    Удалены сильно устаревшие док-ты „polymorphic_fetch“ и „select_table“ из наследования, переработана вторая половина статьи «Наследование объединенных таблиц».

  • [documentation]

    Документирован карг comparator_factory, добавлен новый раздел документации «Пользовательские компараторы».

  • [postgres]

    Знаки «%» в конструкциях text() автоматически экранируются в «%%». Из-за обратной несовместимости этого изменения при обнаружении в строке знака „%%“ выдается предупреждение.

    References: #1267

  • [postgres]

    Вызов alias.execute() в сочетании с server_side_cursors не приведет к возникновению ошибки AttributeError.

  • [postgres]

    В PostgreSQL добавлена поддержка отражения индексов с использованием замечательного патча, которым мы долго пренебрегали, представленного Кеном Кулманом (Ken Kuhlman).

    References: #714

  • [associationproxy]

    Свойства ассоциативного прокси становятся доступными на уровне класса, например, MyClass.aproxy. Ранее это значение равнялось None.

  • [declarative]

    Полный список аргументов, принимаемых функцией backref() в виде строки, включает „primaryjoin“, „secondaryjoin“, „secondary“, „foreign_keys“, „remote_side“, „order_by“.

0.5.0rc4

Released: Fri Nov 14 2008

general

  • [general]

    глобальное изменение «propigate»->»propagate».

orm

  • [orm]

    Функция Query.count() была усовершенствована, чтобы делать «правильные» действия в более широком спектре случаев. Теперь он может подсчитывать запросы, состоящие из нескольких элементов, а также запросы, основанные на столбцах. Обратите внимание, что это означает, что если вы скажете query(A, B).count() без какого-либо критерия объединения, то будет подсчитано картезианское произведение A*B. Любой запрос к сущностям, основанным на столбцах, автоматически выдает «SELECT count(1) FROM (SELECT…)», так что возвращается реальный счетчик строк, то есть запрос типа query(func.count(A.name)).count() вернет значение один, поскольку этот запрос вернет одну строку.

  • [orm]

    Проведено много работ по настройке производительности. По приблизительным оценкам, по сравнению с 0.5.0rc3 производительность различных операций ORM выше на 10%, а по сравнению с 0.4.8 - на 25-30%.

  • [orm]

    исправления ошибок и изменения в поведении

  • [orm]

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

  • [orm]

    Query.get() возвращает более информативное сообщение об ошибке при выполнении запроса к нескольким сущностям.

    References: #1220

  • [orm]

    Восстановлена ошибка NotImplementedError на Cls.relation.in_()

    References: #1140, #1221

  • [orm]

    Исправлено предупреждение PendingDeprecationWarning, связанное с параметром order_by в relation().

    References: #1226

sql

  • [sql]

    Удален атрибут „properties“ объекта Connection, следует использовать Connection.info.

  • [sql]

    Восстановлена выборка «active rowcount» перед автозакрытием курсора ResultProxy. Это было удалено в версии 0.5rc3.

  • [sql]

    Перестроен метод load_dialect_impl() в TypeDecorator таким образом, что он будет действовать, даже если пользовательский TypeDecorator использует в качестве своего impl другой TypeDecorator.

mssql

  • [mssql]

    Многочисленные исправления для устранения проблем с ограничениями и смещениями.

  • [mssql]

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

  • [mssql]

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

    References: #1216

  • [mssql]

    Исправлены проблемы с отражением при работе со схемами, особенно когда эти схемы являются схемами по умолчанию.

    References: #1217

  • [mssql]

    Исправлена проблема с приведением элемента нулевой длины к varchar. Теперь он корректно корректирует CAST.

misc

  • [access]

    Добавлена поддержка типа Currency.

  • [access]

    Функции не вернули свой результат.

    References: #1017

  • [access]

    Исправлена проблема с объединениями. Access поддерживает только LEFT OUTER или INNER, а не только JOIN сам по себе.

    References: #1017

  • [ext]

    Теперь можно использовать пользовательское «inherit_condition» в __mapper_args__ при использовании декларативного подхода.

  • [ext]

    исправлено некорректное распространение строковых значений «remote_side», «order_by» и других при использовании в функции backref().

0.5.0rc3

Released: Fri Nov 07 2008

orm

  • [orm]

    В SessionExtension добавлены два новых хука: after_bulk_delete() и after_bulk_update(). after_bulk_delete() вызывается после выполнения операции массового удаления() запроса. after_bulk_update() вызывается после выполнения операции массового обновления() запроса.

  • [orm]

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

  • [orm]

    Удалены не совсем удачные случаи сравнения коллекции с итерируемыми. Для проверки принадлежности к коллекции используйте contains().

  • [orm]

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

    References: #1171

  • [orm]

    Исправлена ошибка, связанная с тем, что условия primaryjoin/secondaryjoin, построенные из атрибутов, связанных с классом (как это часто бывает при использовании декларативных), впоследствии некорректно псевдонимировались Query, особенно при использовании различных компараторов на основе EXISTS.

  • [orm]

    Исправлена ошибка, когда при использовании нескольких query.join() с дескриптором, связанным алиасом, терялся левый алиас.

  • [orm]

    Улучшено управление памятью карты идентификации weakref, теперь она не требует мьютексов, воскрешает собранный из мусора экземпляр на ленивой основе для InstanceState с ожидающими изменениями.

  • [orm]

    Объект InstanceState теперь удаляет циклические ссылки на себя при удалении, чтобы не допустить циклической сборки мусора.

  • [orm]

    relation() не будет скрывать несвязанные ошибки ForeignKey внутри сообщения «please specify primaryjoin» при определении условия присоединения.

  • [orm]

    Исправлена ошибка в Query, связанная с использованием функции order_by() в сочетании с несколькими псевдонимами одного класса (будут добавлены тесты)

    References: #1218

  • [orm]

    При использовании Query.join() с явным предложением для предложения ON это предложение будет алиенизировано в терминах левой части соединения, что позволит корректно работать сценариям типа query(Source).from_self().join((Dest, Source.id==Dest.source_id)).

  • [orm]

    Функция polymorphic_union() учитывает «ключ» каждого столбца, если они отличаются от имени столбца.

  • [orm]

    Исправлена поддержка «пассивных удалений» для отношения многие-к-одному() с каскадом «удаление».

    References: #1183

  • [orm]

    Исправлена ошибка в композитных типах, из-за которой композитный тип с первичным ключом не мог быть изменен.

    References: #1213

  • [orm]

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

    References: #1202

sql

  • [sql]

    Оптимизация и снижение сложности компилятора SQL. Количество вызовов для компиляции типичной конструкции select() на 20% меньше по сравнению с 0.5.0rc2.

  • [sql]

    Диалекты теперь могут генерировать имена меток с регулируемой длиной. Передавая аргумент «label_length=<значение>» в create_engine(), можно настроить максимальное количество символов в динамически генерируемых метках колонок, т.е. «somecolumn AS somelabel». Любое значение меньше 6 приведет к тому, что метка будет иметь минимальный размер, состоящий из символа подчеркивания и числового счетчика. По умолчанию компилятор использует значение dialect.max_identifier_length.

    References: #1211

  • [sql]

    Упрощена проверка ResultProxy на «автозакрытие без результатов», которая основывается только на наличии cursor.description. Убрано все предположение на основе regexp об операторах, возвращающих строки.

    References: #1212

  • [sql]

    Прямое выполнение конструкции union() правильно настроит обработку результирующей строки.

    References: #1194

  • [sql]

    Внутреннее понятие колонки «OID» или «ROWID» было удалено. Он практически не используется ни в одном диалекте, а возможность его использования с cursor.lastrowid в psycopg2 практически исчезла, так как появился INSERT..RETURNING.

  • [sql]

    Удален метод «default_order_by()» для всех объектов FromClause.

  • [sql]

    Исправлен метод table.tometadata(), чтобы переданный аргумент схемы распространялся на конструкции ForeignKey.

  • [sql]

    Немного изменено поведение оператора IN при сравнении с пустыми коллекциями. Теперь он приводит к сравнению неравенства с самим собой. Более переносимо, но нарушает работу с хранимыми процедурами, которые не являются чистыми функциями.

mysql

  • [mysql]

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

  • [mysql]

    Больше не ожидается, что include_columns в отражении таблицы будет в нижнем регистре.

oracle

  • [oracle]

    Написал docstring для диалекта Oracle. Видимо, ярлык Ohloh «мало комментариев к исходному коду» начинает строчить :).

  • [oracle]

    Убран флаг оптимизации FIRST_ROWS() при использовании LIMIT/OFFSET, повторное включение возможно при использовании флага optimize_limits=True create_engine().

    References: #536

  • [oracle]

    исправления ошибок и изменения в поведении

  • [oracle]

    Установка параметра auto_convert_lobs в значение False в create_engine() также предписывает типу OracleBinary возвращать LOB-объект cx_oracle без изменений.

misc

  • [ext]

    Добавлено новое расширение sqlalchemy.ext.serializer. Предоставляет «классы» сериализаторов/десериализаторов, которые зеркально отражают Pickle/Unpickle, а также dumps() и loads(). Этот сериализатор реализует «внешний объектный» pickler, который хранит ключевые контекстно-зависимые объекты, включая движки, сессии, метаданные, таблицы/колонки и мапперы, вне потока pickle, и впоследствии может восстановить pickle с помощью любого движка/провайдера метаданных/сессий. Это используется не для пикелирования экземпляров регулярных объектов, которые можно пикелировать без специальной логики, а для пикелирования объектов выражений и полных объектов Query, чтобы в момент распикирования можно было восстановить все зависимости от маппера/движка/сессии.

  • [ext]

    Исправлена ошибка, не позволяющая использовать в функции column_mapped_collection() декларативно-связанные объекты «колонки».

    References: #1174

  • [misc]

    Функция util.flatten_iterator() не интерпретирует строки с методами __iter__() как итераторы, как, например, в pypy.

    References: #1077

0.5.0rc2

Released: Sun Oct 12 2008

orm

  • [orm]

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

  • [orm]

    »Непакетный» режим в mapper(), позволяющий вызывать методы расширения mapper при обновлении/вставке каждого экземпляра, теперь учитывает порядок вставки заданных объектов.

  • [orm]

    Исправлена ошибка, связанная с RLock в маппере, которая могла привести к тупиковой ситуации при вызове reentrant mapper compile(), возникающей при использовании декларативных конструкций внутри объектов ForeignKey.

  • [orm]

    ScopedSession.query_property теперь принимает фабрику query_cls, переопределяя настроенный query_cls сессии.

  • [orm]

    Исправлена ошибка с общим состоянием, препятствовавшая способности ScopedSession.mapper применять реализацию __init__ по умолчанию к подклассам объектов.

  • [orm]

    Исправлена работа с фрагментами в Query (т.е. query[x:y]) для фрагментов нулевой длины и фрагментов с None на обоих концах.

    References: #1177

  • [orm]

    Добавлен пример, иллюстрирующий «вложенные множества» Селко в качестве отображения SQLA.

  • [orm]

    contains_eager() с аргументом alias работает даже в том случае, если псевдоним встроен в SELECT, как при передаче в Query через query.select_from().

  • [orm]

    Использование contains_eager() теперь совместимо с запросом, который также содержит обычную eager-загрузку и limit/offset, так как столбцы добавляются в подзапрос, создаваемый запросом.

    References: #1180

  • [orm]

    session.execute() выполнит переданный ему объект Sequence (регресс с 0.4).

  • [orm]

    Из функций object_mapper() и class_mapper() удален аргумент с ключевым словом «raiseerror». Эти функции во всех случаях выдают ошибку, если данный класс/экземпляр не сопоставлен.

  • [orm]

    Исправлена ошибка, из-за которой сессия session.transaction.commit() при autocommit=False не начинала новую транзакцию.

  • [orm]

    Некоторые изменения в поведении слабых ссылок в Session.identity_map для уменьшения побочных эффектов асинхронного GC.

  • [orm]

    Внесена поправка в учет новых «чистых» объектов после очистки Session для лучшей защиты от работы с объектами в момент их асинхронного gc’ed.

    References: #1182

sql

  • [sql]

    column.in_(someselect) теперь можно использовать как выражение в столбцах, не пропуская подзапрос в предложение FROM

    References: #1074

mysql

  • [mysql]

    Временные таблицы стали отражаемыми.

sqlite

  • [sqlite]

    Пересмотрена обработка привязки/результатов SQLite к дате/времени для использования регулярных выражений и форматных строк, а не strptime/strftime, для общей поддержки дат до 1900 года, дат с микросекундами.

    References: #968

  • [sqlite]

    В диалекте sqlite отключена логика convert_unicode в String (и Unicode, UnicodeText и т.д.), чтобы соответствовать новому требованию pysqlite 2.5.0, согласно которому принимаются только юникодные объекты Python; https://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html

oracle

  • [oracle]

    Oracle будет распознавать строковые операторы, содержащие комментарии перед SELECT, как операторы SELECT.

    References: #1187

0.5.0rc1

Released: Thu Sep 11 2008

orm

  • [orm]

    Query теперь имеет методы delete() и update(values). Это позволяет выполнять массовые удаления/обновления с помощью объекта Query.

  • [orm]

    Объект RowTuple, возвращаемый Query(*cols), теперь имеет ключевые имена, которые предпочитают имена сопоставленных атрибутов ключам столбцов, а ключи столбцов - именам столбцов, т.е. Query(Class.foo, Class.bar) будет иметь имена «foo» и «bar», даже если они не являются именами базовых объектов Column. Прямые объекты Column, такие как Query(table.c.col), вернут атрибут «ключ» Column.

  • [orm]

    В Query добавлены методы scalar() и value(), каждый из которых возвращает одно скалярное значение. scalar() не принимает аргументов и примерно эквивалентен first()[0], value() принимает выражение из одного столбца и примерно эквивалентен values(expr).next()[0].

  • [orm]

    Улучшено определение условия FROM при размещении SQL-выражений в списке сущностей query(). В частности, скалярные подзапросы не должны «сливать» свои внутренние объекты FROM во вложенный запрос.

  • [orm]

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

  • [orm]

    Расширение AttributeExtension было доработано таким образом, что событие срабатывает до того, как произойдет мутация. Кроме того, методы append() и set() теперь должны возвращать заданное значение, которое используется в качестве значения, применяемого в операции мутации. Это позволяет создавать проверяющие AttributeListeners, которые срабатывают до начала действия и могут изменить заданное значение на другое до его использования.

  • [orm]

    column_property(), composite_property() и relation() теперь принимают одно или список расширений AttributeExtensions, используя аргумент ключевого слова «extension».

  • [orm]

    query.order_by().get() молча удаляет «ORDER BY» из запроса, выданного GET, но не вызывает исключения.

  • [orm]

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

  • [orm]

    class.someprop.in_() вызывает ошибку NotImplementedError, ожидая реализации «in_» для отношения

    References: #1140

  • [orm]

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

    References: #1127

  • [orm]

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

  • [orm]

    Хук before_flush() в SessionExtension выполняется до того, как список new/dirty/deleted будет вычислен в последний раз, что позволяет процедурам внутри before_flush() дополнительно изменять состояние сессии перед выполнением операции flush.

    References: #1128

  • [orm]

    Аргумент «extension» в Session и других командах теперь может опционально быть списком, что позволяет поддерживать события, отправляемые нескольким экземплярам SessionExtension. Session помещает SessionExtensions в Session.extensions.

  • [orm]

    Реентерабельные вызовы flush() приводят к ошибке. Это также служит элементарной, но не надежной проверкой от одновременных вызовов Session.flush().

  • [orm]

    Улучшено поведение query.join() при присоединении к подклассам наследования объединенных таблиц с использованием явных критериев присоединения (т.е. не на отношении).

  • [orm]

    @orm.attributes.reconstitute и MapperExtension.reconstitute были переименованы в @orm.reconstructor и MapperExtension.reconstruct_instance

  • [orm]

    Исправлен крючок @reconstructor для подклассов, наследующих от базового класса.

    References: #1129

  • [orm]

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

    References: #1132

  • [orm]

    Кортеж из 3 итераций, возвращаемый функцией attributes.get_history(), теперь может представлять собой смесь списков и кортежей. (Ранее члены всегда были списками).

  • [orm]

    Исправлена ошибка, при которой изменение атрибута первичного ключа в сущности, предыдущее значение которой было истекшим, приводило к ошибке при flush().

    References: #1151

  • [orm]

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

  • [orm]

    Session.delete() добавляет данный объект в сессию, если он еще не присутствует в ней. Это была регрессионная ошибка из версии 0.4.

    References: #1150

  • [orm]

    Флаг echo_uow для Session устарел, а протоколирование единиц работы теперь ведется только на уровне приложения, а не на уровне каждой сессии.

  • [orm]

    Удален конфликтующий оператор contains() из InstrumentedAttribute, который не принимал кваарг escape.

    References: #1153

sql

  • [sql]

    Временно свернута работа над усовершенствованием «ORDER BY». Эта функция приостановлена в ожидании дальнейшей разработки.

    References: #1068

  • [sql]

    Конструкция exists() не будет «экспортировать» содержащийся в ней список элементов в предложение FROM, что позволяет более эффективно использовать их в предложении columns в SELECT.

  • [sql]

    and_() и or_() теперь генерируют элемент ColumnElement, что позволяет использовать булевы выражения в качестве столбцов результатов, т.е. select([and_(1, 0)]).

    References: #798

  • [sql]

    Параметрам привязки теперь присвоен подкласс ColumnElement, что позволяет выбирать их с помощью orm.query (они уже имели большинство семантик ColumnElement).

  • [sql]

    В конструкцию exists() добавлен метод select_from(), который становится все более совместимым с обычным select().

  • [sql]

    Добавлены func.min(), func.max(), func.sum() как «общие функции», что, по сути, позволяет автоматически определять их возвращаемый тип. Это помогает при работе с датами на SQLite, десятичными типами и т.д.

    References: #1160

  • [sql]

    добавлен decimal.Decimal в качестве «автоопределяемого» типа; параметры привязки и общие функции будут устанавливать свой тип в Numeric, если используется Decimal.

schema

  • [schema]

    В MetaData добавлен аксессор «sorted_tables», который возвращает объекты Table, отсортированные в порядке зависимости, в виде списка. Это устаревает метод MetaData.table_iterator(). Ключевой аргумент «reverse=False» также удален из util.sort_tables(); для инвертирования результатов используйте функцию Python „reversed“.

    References: #1033

  • [schema]

    Аргумент „length“ для всех типов Numeric был переименован в „scale“. „length“ является устаревшим и по-прежнему принимается с предупреждением.

  • [schema]

    Устранена совместимость с 0.3 для типов, определяемых пользователем (convert_result_value, convert_bind_param).

mysql

  • [mysql]

    Аргумент „length“ для MSInteger, MSBigInteger, MSTinyInteger, MSSmallInteger и MSYear был переименован в „display_width“.

  • [mysql]

    Добавлен тип MSMediumInteger.

    References: #1146

  • [mysql]

    функция func.utc_timestamp() компилируется в UTC_TIMESTAMP, без скобок, которые, видимо, мешают при использовании в сочетании с executemany().

oracle

  • [oracle]

    limit/offset больше не использует ROW NUMBER OVER для ограничения строк, а вместо этого использует подзапросы в сочетании со специальным комментарием оптимизации Oracle. Позволяет LIMIT/OFFSET работать в сочетании с DISTINCT.

    References: #536

  • [oracle]

    has_sequence() теперь учитывает текущий аргумент «schema»

    References: #1155

  • [oracle]

    добавление BFILE в имена отражаемых типов

    References: #1121

misc

  • [declarative]

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

    References: #1161

  • [declarative]

    Исправлен выброс исключения, возникавший при использовании строкового условия primaryjoin в сочетании с backref.

0.5.0beta3

Released: Mon Aug 04 2008

orm

  • [orm]

    Функция «entity_name» в мапперах SQLAlchemy была удалена. Обоснование см. на сайте https://tinyurl.com/6nm2ne.

  • [orm]

    флаг «autoexpire» для Session, sessionmaker() и scoped_session() был переименован в «expire_on_commit». Это не влияет на поведение функции rollback() при истечении срока действия.

  • [orm]

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

  • [orm]

    в Session добавлен поддерживающий наследие флаг «_enable_transaction_accounting», который при значении False отключает весь учет объектов на уровне транзакций, включая expire on rollback, expire on commit, ведение списка new/deleted и autoflush on begin.

  • [orm]

    Параметр „cascade“ в relation() принимает значение None, что эквивалентно отсутствию каскадов.

  • [orm]

    Критическое исправление динамических отношений позволяет правильно очищать историю «модифицированных» отношений после выполнения функции flush().

  • [orm]

    Определенные пользователем @свойства класса обнаруживаются и оставляются на месте при инициализации картографа. Это означает, что одноименный столбец, связанный с таблицей, не будет отображен, если на пути стоит @свойство (и столбец не переименован в другое имя), а также не будет применен инструментальный атрибут из унаследованного класса. Те же правила действуют и для имен, исключенных с помощью коллекций include_properties/exclude_properties.

  • [orm]

    Добавлен новый хук SessionExtension под названием after_attach(). Он вызывается в точке присоединения объектов через add(), add_all(), delete() и merge().

  • [orm]

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

    References: #1111

  • [orm]

    Исправлена серия потенциальных ситуаций гонки в Session, когда асинхронный GC мог удалять из сессии немодифицированные элементы, на которые больше нет ссылок, если они присутствовали в списке обрабатываемых элементов, как правило, во время работы session.expunge_all() и зависимых методов.

  • [orm]

    Некоторые улучшения в механизме _CompileOnAttr, которые должны снизить вероятность появления предупреждений «Атрибут x не был заменен при компиляции». (это, как правило, относится к хакерам SQLA, например, разработчикам Elixir).

  • [orm]

    Исправлена ошибка, при которой FlushError «unsaved, pending instance», возникающая для сироты, не учитывала отображения суперклассов при формировании списка отношений, ответственных за ошибку.

sql

  • [sql]

    func.count() без аргументов отображается как COUNT(*), что эквивалентно func.count(text(„*“)).

  • [sql]

    простые имена меток в выражениях ORDER BY отображаются сами по себе, а не как переформулировка соответствующего выражения. В настоящее время эта возможность включена только для SQLite, MySQL и PostgreSQL. Она может быть включена для других диалектов, если будет показано, что каждый из них поддерживает такое поведение.

    References: #1068

mysql

  • [mysql]

    Котировка значений MSEnum для использования в CREATE TABLE теперь необязательна и будет приводиться по требованию. (Для использования в существующих таблицах цитирование всегда было необязательным).

    References: #1110

misc

  • [ext]

    Атрибуты, связанные с классом, передаваемые в качестве аргументов в параметрах relation() remote_side и foreign_keys, теперь принимаются, что позволяет использовать их в декларативном режиме. Дополнительно исправлена ошибка, связанная с указанием order_by в качестве атрибута, связанного с классом, в сочетании с ускоренной загрузкой.

  • [ext]

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

0.5.0beta2

Released: Mon Jul 14 2008

orm

  • [orm]

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

    References: #870

  • [orm]

    session.refresh() выдает информативное сообщение об ошибке, если в списке атрибутов нет ни одного атрибута, основанного на колонках.

  • [orm]

    query() выдает информационное сообщение об ошибке, если не указаны столбцы или отображения.

  • [orm]

    Ленивые загрузчики теперь запускают autoflush перед началом работы. Это позволяет корректно работать функции expire() коллекции или скалярного отношения в контексте autoflush.

  • [orm]

    Атрибуты column_property(), представляющие SQL-выражения или столбцы, отсутствующие в сопоставленных таблицах (например, столбцы из представлений), после INSERT или UPDATE, если они не были локально изменены, автоматически теряют свою актуальность, так что при обращении к ним они обновляются самыми последними данными.

    References: #887

  • [orm]

    Исправлены явные самореферентные соединения между двумя отображениями наследования объединенных таблиц при использовании query.join(cls, aliased=True).

    References: #1082

  • [orm]

    Исправлено использование query.join() в сочетании с предложением «только столбцы» и предложением SQL-выражения ON в соединении.

  • [orm]

    Флаг «allow_column_override» из функции mapper() был удален. Этот флаг практически всегда понимается неправильно. Его специфическая функциональность доступна через аргументы маппера include_properties/exclude_properties.

  • [orm]

    Исправлен метод __str__() в Query.

    References: #1066

  • [orm]

    Session.bind используется по умолчанию, даже если определены привязки к конкретным таблицам/мапперам.

sql

  • [sql]

    Добавлен новый оператор match(), выполняющий полнотекстовый поиск. Поддерживаются бэкенды PostgreSQL, SQLite, MySQL, MS-SQL и Oracle.

schema

  • [schema]

    Добавлена опция prefixes в Table, которая принимает список строк, вставляемых после CREATE в операторе CREATE TABLE.

    References: #1075

  • [schema]

    Типы Unicode, UnicodeText теперь устанавливают «assert_unicode» и «convert_unicode» по умолчанию, но допускают переопределение **kwargs для этих значений.

extensions

  • [extensions]

    Declarative поддерживает переменную класса __table_args__, которая представляет собой словарь или кортеж вида (arg1, arg2, …, {kwarg1:value, …}), содержащий позиционные + kw аргументы для передачи конструктору Table.

    References: #1096

sqlite

  • [sqlite]

    Модифицировано представление «микросекунд» в SQLite для соответствия выводу str(somedatetime), т.е. микросекунды представляются в виде дробных секунд в строковом формате. Это делает тип даты SQLA SQLite совместимым с датами, которые были сохранены непосредственно с помощью Pysqlite (который просто вызывает str()). Обратите внимание, что это несовместимо с существующими значениями микросекунд в файле базы данных SQLite, сгенерированном SQLA 0.4.

    Чтобы вернуть прежнее поведение глобально:

    from sqlalchemy.databases.sqlite import DateTimeMixin DateTimeMixin.__legacy_microseconds__ = True

    Чтобы получить поведение для отдельных типов DateTime:

    t = sqlite.SLDateTime() t.__legacy_microseconds__ = True

    Затем используйте «t» в качестве типа на колонке.

    References: #1090

  • [sqlite]

    Типы SQLite Date, DateTime и Time сейчас принимают только объекты Python datetime, а не строки. Если вы хотите самостоятельно форматировать даты как строки в SQLite, используйте тип String. Если вы хотите, чтобы они все равно возвращали объекты времени, несмотря на то, что принимают строки, сделайте TypeDecorator вокруг String - SQLA не поощряет такой шаблон.

0.5.0beta1

Released: Thu Jun 12 2008

general

  • [general]

    глобальное изменение «propigate»->»propagate».

orm

  • [orm]

    Функция polymorphic_union() учитывает «ключ» каждого столбца, если они отличаются от имени столбца.

  • [orm]

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

    References: #1199

  • [orm]

    Исправлена ошибка, связанная с RLock, в маппере, которая могла привести к тупику при вызове reentrant mapper compile(), что происходило при использовании декларативных конструкций внутри объектов ForeignKey. Перенесено из 0.5.

  • [orm]

    Исправлена ошибка в композитных типах, из-за которой композитный тип с первичным ключом не мог быть изменен.

    References: #1213

  • [orm]

    Добавлен аксессуар ScopedSession.is_active.

    References: #976

  • [orm]

    В качестве аргумента relation() order_by может быть использован связанный с классом аксессор.

    References: #939

  • [orm]

    Исправлен аргумент shard_id в файле ShardedSession.execute().

    References: #1072

sql

  • [sql]

    Connection.invalidate() проверяет наличие закрытого статуса, чтобы избежать ошибок атрибутов.

    References: #1246

  • [sql]

    NullPool поддерживает поведение повторного подключения при сбое.

    References: #1094

  • [sql]

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

    References: #1299

  • [sql]

    Исправлены методы отражения SQLite таким образом, чтобы определялось отсутствие cursor.description, вызывающее автозакрытие курсора, и чтобы не возникало ошибки no results на последних версиях pysqlite, которые выдают ошибку при вызове fetchone() при отсутствии строк.

mysql

  • [mysql]

    Исправлена ошибка в возникновении исключения при отсутствии FK-столбцов во время отражения.

    References: #1241

oracle

  • [oracle]

    Исправлена ошибка, из-за которой не принимались out-параметры определенных типов; большое спасибо huddlej at wwu.edu !

    References: #1265

misc

  • [no_tags]

    Триггер/декоратор «__init__», добавленный mapper’ом, теперь пытается в точности повторять сигнатуру аргументов оригинального __init__. Передача „_sa_session“ больше не является неявной - вы должны разрешить этот ключевой аргумент в своем конструкторе.

  • [no_tags]

    ClassState переименован в ClassManager.

  • [no_tags]

    Классы могут предоставлять свой собственный InstrumentationManager, указывая свойство __sa_instrumentation_manager__.

  • [no_tags]

    Пользовательская инструментация может использовать любой механизм для связывания ClassManager с классом и InstanceState с экземпляром. Атрибуты этих объектов по-прежнему являются механизмом ассоциации по умолчанию, используемым штатной инструментацией SQLAlchemy.

  • [no_tags]

    Перемещены значения entity_name, _sa_session_id и _instance_key из объекта экземпляра в состояние экземпляра. Эти значения по-прежнему доступны старым, уже устаревшим способом - с помощью дескрипторов, прикрепленных к классу. При обращении к ним будет выдано предупреждение об устаревании.

  • [no_tags]

    Псевдоним _prepare_instrumentation для prepare_instrumentation был удален.

  • [no_tags]

    sqlalchemy.exceptions был переименован в sqlalchemy.exc. Модуль может быть импортирован под любым из этих имен.

  • [no_tags]

    Исключения, связанные с ORM, теперь определяются в sqlalchemy.orm.exc. Псевдонимы совместимости ConcurrentModificationError, FlushError и UnmappedColumnError устанавливаются в sqlalchemy.exc во время импорта sqlalchemy.orm.

  • [no_tags]

    sqlalchemy.logging был переименован в sqlalchemy.log.

  • [no_tags]

    Переходный псевдоним sqlalchemy.log.SADeprecationWarning для определения предупреждения в sqlalchemy.exc был удален.

  • [no_tags]

    exc.AssertionError был удален и заменен на встроенный в Python AssertionError.

  • [no_tags]

    Изменено поведение расширений MapperExtensions, привязанных к нескольким, имя_существа=первичным отображателям для одного класса. Первый mapper(), определенный для класса, является единственным mapper, имеющим право на получение событий MapperExtension „instrument_class“, „init_instance“ и „init_failed“. Это обратная несовместимость; ранее эти события получали расширения последнего определенного отображателя.

  • [firebird]

    Добавлена поддержка возврата значений при вставках (только для версии 2.0+), обновлениях и удалениях (только для версии 2.1+).

  • [postgres]

    В Postgres добавлена поддержка отражения индексов с использованием замечательного патча, которым мы долго пренебрегали, представленного Кеном Кулманом (Ken Kuhlman).

    References: #714

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