0.5 Changelog¶
0.5.9¶
no release datesql¶
0.5.8¶
Released: Sat Jan 16 2010sql¶
[sql] ¶
Метод copy() для Column теперь поддерживает неинициализированные, безымянные объекты Column. Это позволяет легко создавать декларативные помощники, размещающие общие колонки в нескольких подклассах.
[sql] ¶
Генераторы по умолчанию, такие как Sequence(), корректно транслируются через операцию copy().
[sql] ¶
Sequence() и другие объекты DefaultGenerator, помимо того, что принимаются позиционно, принимаются в качестве значения для аргументов «по умолчанию» и «при обновлении» ключевого слова Column.
[sql] ¶
Исправлена ошибка арифметики столбцов, которая влияла на соответствие столбцов для клонированных селектов, содержащих отдельно стоящие выражения столбцов. Эта ошибка обычно заметна только при использовании нового поведения ORM, доступного только в 0.6 via, но более корректна и на уровне SQL-выражений.
postgresql¶
[postgresql] ¶
Функция extract(), которая была немного улучшена в 0.5.7, требовала гораздо больше работы для генерации корректного типового примера (типовые примеры, как оказалось, необходимы в PG’шном EXTRACT’е довольно часто). Теперь для генерации типовой выборки используется словарь правил, основанный на документации PG по арифметике даты/времени/интервала. Также он снова принимает конструкции text(), что было нарушено в 0.5.7.
References: #1647
misc¶
0.5.7¶
Released: Sat Dec 26 2009orm¶
[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 в результате исправления.
[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¶
mssql¶
oracle¶
misc¶
[ext] ¶
Колонка может быть добавлена в декларативный суперкласс объединенной таблицы после построения класса (т.е. через присвоение атрибутов на уровне класса), и колонка будет распространяться вниз по подклассам. Это ситуация, обратная той, что была исправлена в 0.5.6.
[ext] ¶
Исправлена небольшая неточность в примере с шардингом. Сравнение эквивалентности столбцов в ORM лучше всего выполнять с помощью col1.shares_lineage(col2).
References: #1491
[ext] ¶
Из ShardedQuery удален неиспользуемый метод load().
References: #1606
0.5.6¶
Released: Sat Sep 12 2009orm¶
[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¶
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 2009general¶
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 2009sql¶
[sql] ¶
Исправлена печать исключений SQL, не основанных на параметрах или не относящихся к стилю executemany().
postgresql¶
[postgresql] ¶
Устранена жестко заданная функция TIMESTAMP, которая при использовании func.TIMESTAMP(value) выдавала «значение TIMESTAMP». На некоторых платформах это приводит к сбоям, поскольку PostgreSQL не позволяет использовать параметры привязки в таком контексте. Жестко закодированный верхний регистр также неуместен, и существует множество других PG-приведений, которые мы должны поддерживать. Поэтому вместо этого используйте текстовые конструкции, например select([«timestamp „12/05/09“»]).
0.5.4p1¶
Released: Mon May 18 2009orm¶
[orm] ¶
Исправлена ошибка атрибутов, появившаяся в 0.5.4, которая возникала при использовании функции merge() с неполным объектом.
0.5.4¶
Released: Sun May 17 2009orm¶
[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¶
mysql¶
sqlite¶
mssql¶
[mssql] ¶
Изменен принцип работы логики точек сохранения, чтобы она не наступала на подпрограммы, не ориентированные на точки сохранения. Поддержка точек сохранения пока носит экспериментальный характер.
[mssql] ¶
Добавлены зарезервированные слова для MSSQL, которые охватывают версию 2008 и все предыдущие версии.
References: #1310
[mssql] ¶
Исправлена проблема, связанная с тем, что информационная схема не работала с базой данных, основанной на двоичной свертке. Очистка информационной схемы, так как теперь она используется только mssql.
References: #1343
0.5.3¶
Released: Tue Mar 24 2009orm¶
[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¶
0.5.2¶
Released: Sat Jan 24 2009orm¶
[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¶
mssql¶
[mssql] ¶
Восстановлена обработка convert_unicode. Результаты передавались без преобразования.
References: #1291
[mssql] ¶
Правда, на этот раз исправлена работа с десятичными дробями…
References: #1282
[mssql] [Ticket:1289] ¶
Модифицирован код отражения таблиц, чтобы при построении таблиц использовались только kwargs.
0.5.1¶
Released: Sat Jan 17 2009orm¶
[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. Оно позволяет настраивать обратные ссылки с помощью явных отношений. Это необходимо при создании двунаправленных связей между иерархией конкретных отображателей и другим классом.
[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¶
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 2009general¶
[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.
[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¶
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] ¶
Билеты.
[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 2008general¶
[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_()
[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 2008orm¶
[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¶
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 2008orm¶
[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¶
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¶
0.5.0rc1¶
Released: Thu Sep 11 2008orm¶
[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 2008orm¶
[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¶
misc¶
[ext] ¶
Атрибуты, связанные с классом, передаваемые в качестве аргументов в параметрах relation() remote_side и foreign_keys, теперь принимаются, что позволяет использовать их в декларативном режиме. Дополнительно исправлена ошибка, связанная с указанием order_by в качестве атрибута, связанного с классом, в сочетании с ускоренной загрузкой.
[ext] ¶
декларативная инициализация Columns скорректирована таким образом, что непереименованные колонки инициализируются так же, как и в не декларативном мэппере. Это позволяет унаследовавшему отображателю настраивать свои одноименные столбцы «id» таким образом, что родительский столбец «id» будет предпочтительнее дочернего столбца, что сократит количество обращений к базе данных при запросе этого значения.
0.5.0beta2¶
Released: Mon Jul 14 2008orm¶
[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¶
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 2008general¶
[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¶
oracle¶
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