0.5 Changelog¶
0.5.9¶
no release datesql¶
Исправлен ошибочный вызов self_group() в пакете expression.
References: #1661
0.5.8¶
Released: Sat Jan 16 2010sql¶
Метод copy() для Column теперь поддерживает неинициализированные, безымянные объекты Column. Это позволяет легко создавать декларативные помощники, размещающие общие колонки в нескольких подклассах.
Генераторы по умолчанию, такие как Sequence(), корректно транслируются через операцию copy().
Sequence() и другие объекты DefaultGenerator, помимо того, что принимаются позиционно, принимаются в качестве значения для аргументов «по умолчанию» и «при обновлении» ключевого слова Column.
Исправлена ошибка арифметики столбцов, которая влияла на соответствие столбцов для клонированных селектов, содержащих отдельно стоящие выражения столбцов. Эта ошибка обычно заметна только при использовании нового поведения ORM, доступного только в 0.6 via, но более корректна и на уровне SQL-выражений.
postgresql¶
Функция extract(), которая была немного улучшена в 0.5.7, требовала гораздо больше работы для генерации корректного типового примера (типовые примеры, как оказалось, необходимы в PG’шном EXTRACT’е довольно часто). Теперь для генерации типовой выборки используется словарь правил, основанный на документации PG по арифметике даты/времени/интервала. Также он снова принимает конструкции text(), что было нарушено в 0.5.7.
References: #1647
misc¶
Распознавать больше ошибок как разъединения.
References: #1646
0.5.7¶
Released: Sat Dec 26 2009orm¶
Функция contains_eager() теперь работает с автоматически сгенерированным подзапросом, который получается, если сказать «query(Parent).join(Parent.somejoinedsubclass)», т.е. когда Parent присоединяется к подклассу, наследующему объединенные таблицы. Ранее функция contains_eager() ошибочно добавляла таблицу подкласса в запрос отдельно, создавая картезианское произведение. Пример приведен в описании тикета.
References: #1543
query.options() теперь распространяет на загруженные объекты для потенциальных последующих подзагрузок только те опции, для которых такое поведение является релевантным, не допуская попадания различных несериализуемых опций, например, генерируемых contains_eager(), в состояние отдельных экземпляров.
References: #1553
Теперь функция Session.execute() определяет местоположение привязок, специфичных для таблиц и мапперов, на основе переданного выражения, которое представляет собой конструкцию insert()/update()/delete().
References: #1054
Функция Session.merge() теперь корректно перезаписывает атрибут many-to-one или uselist=False в None, если в данном объединяемом объекте этот атрибут также None.
Исправлен ненужный select, возникавший при объединении переходных объектов, содержащих нулевой идентификатор первичного ключа.
References: #1618
Мутируемая коллекция, передаваемая в атрибут «extension» функций relation(), column_property() и т.д., не будет мутироваться или разделяться между несколькими вызовами инструментария, что предотвращает вставку в список дублирующихся расширений, например, популяризаторов обратных ссылок.
References: #1585
Исправлен вызов функции get_committed_value() для CompositeProperty.
References: #1504
Исправлена ошибка, приводящая к аварийному завершению работы Query в случае вызова join() без четкой «левой» стороны, когда в списке столбцов появлялась сущность, не имеющая отображения.
References: #1602
Исправлена ошибка, из-за которой составные колонки не загружались должным образом при настройке на подкласс объединенных таблиц, появившаяся в версии 0.5.6 в результате исправления.
Поведение «use get» для отношений «многие-к-одному», т.е. ленивая загрузка будет возвращаться к возможно кэшированному значению query.get(), теперь работает в условиях объединения, когда два сравниваемых типа не являются в точности одним и тем же классом, но имеют одинаковое «родство» - например, Integer и SmallInteger. Также позволяет комбинациям отраженных и неотраженных типов работать с отражением типов в стиле 0.5, например, PGText/Text (обратите внимание, что в 0.6 типы отражаются как их общие версии).
References: #1556
Исправлена ошибка в query.update() при передаче Cls.attribute в качестве ключей в дикте значений и использовании synchronize_session=“expire“ („fetch“ в 0.6).
References: #1436
sql¶
Исправлена ошибка в двухфазной транзакции, при которой метод commit() не устанавливал полное состояние, позволяющее успешно выполнить последующий вызов close().
References: #1603
Исправлен параметр «numeric», который, по-видимому, является параметром по умолчанию, используемым в Informixdb.
Повторяющиеся выражения в предложении columns в select вычитаются на основе идентичности каждого элемента предложения, а не фактической строки. Это позволяет корректно отображать позиционные элементы, даже если все они отображаются одинаково, например, параметры привязки в стиле «qmark».
References: #1574
Курсор, связанный с соединениями пула соединений (т.е. _CursorFairy), теперь корректно проксирует __iter__() к базовому курсору.
References: #1632
Типы теперь поддерживают операцию «сравнения родства», т.е. Integer/SmallInteger «совместимы», или Text/String, PickleType/Binary и т.д. Часть.
References: #1556
Исправлена ошибка, не позволяющая клонировать или адаптировать alias() из alias() (часто встречается в операциях ORM).
References: #1641
postgresql¶
Добавлена поддержка отражения типа DOUBLE PRECISION с помощью нового объекта postgres.PGDoublePrecision. Это postgresql.DOUBLE_PRECISION в версии 0.6.
References: #1085
Добавлена поддержка отражения синтаксисов INTERVAL YEAR TO MONTH и INTERVAL DAY TO SECOND типа INTERVAL.
References: #460
Исправлен запрос «has_sequence», чтобы учитывать текущую схему или явно заданную схему последовательности.
References: #1576
Исправлено поведение extract() для применения правил операторного старшинства к оператору «::» при применении приведения «timestamp» - обеспечивается правильное раскрытие скобок.
References: #1611
sqlite¶
Диалект sqlite корректно генерирует CREATE INDEX для таблицы, находящейся в альтернативной схеме.
References: #1439
mssql¶
Изменено имя TrustedConnection на Trusted_Connection при построении аргументов pyodbc connect
References: #1561
oracle¶
Диалектная функция «table_names», используемая MetaData .reflect(), опускает «index overflow tables» - системную таблицу, создаваемую Oracle при использовании «index only tables» с переполнением. Эти таблицы недоступны через SQL и не могут быть отражены.
References: #1637
misc¶
Колонка может быть добавлена в декларативный суперкласс объединенной таблицы после построения класса (т.е. через присвоение атрибутов на уровне класса), и колонка будет распространяться вниз по подклассам. Это ситуация, обратная той, что была исправлена в 0.5.6.
Исправлена небольшая неточность в примере с шардингом. Сравнение эквивалентности столбцов в ORM лучше всего выполнять с помощью col1.shares_lineage(col2).
References: #1491
Из ShardedQuery удален неиспользуемый метод load().
References: #1606
0.5.6¶
Released: Sat Sep 12 2009orm¶
Исправлена ошибка, при которой дискриминатор наследования в составном первичном ключе не срабатывал при обновлении. Продолжение.
References: #1300
Исправлена ошибка, из-за которой одна из сторон двунаправленной ссылки «многие-ко-многим» не могла объявить себя «только для просмотра».
References: #1507
Добавлено утверждение, которое не позволяет функции @validates или другому расширению AttributeExtension загрузить незагруженную коллекцию, что может привести к повреждению внутреннего состояния.
References: #1526
Исправлена ошибка, из-за которой две сущности не могли взаимно заменять значения первичных ключей друг друга в рамках одной операции flush() при определенном порядке операций.
References: #1519
Исправлена неясная проблема, из-за которой подкласс объединенной таблицы с самореферентной eager load на базовый класс заполнял таблицу «подкласс» связанного объекта данными из таблицы «подкласс» родительского объекта.
References: #1485
Теперь отношения() имеют большую возможность быть «переопределенными», т.е. подкласс, явно указавший отношение(), превосходящее отношение родительского класса, будет соблюден при прошивке. В настоящее время это сделано для поддержки отношений «многие-ко-многим» в конкретном наследовании. За пределами этого случая использования - на ваше усмотрение.
References: #1477
Устранено еще несколько ненужных «ленивых загрузок» из relation(). Когда коллекция мутирует, обратные ссылки «многие-к-одному» на другой стороне не будут загружать «старое» значение, если не установлено значение «single_parent=True». Прямое присваивание many-to-one все равно загружает «старое» значение, чтобы обновить коллекции обратных ссылок на это значение, которое может уже присутствовать в сессии, тем самым сохраняя поведенческий контракт 0.5.
References: #1483
Исправлена ошибка, при которой загрузка/обновление атрибутов наследования объединенных таблиц, основанных на column_property() или аналогичных, не выполнялась.
References: #1480
Улучшена поддержка объектов MapperProperty, переопределяющих свойства унаследованного маппера при неконкретном наследовании - расширения атрибутов не будут случайно сталкиваться друг с другом.
References: #1488
UPDATE и DELETE не поддерживают ORDER BY, LIMIT, OFFSET и т.д. в стандартном SQL. Теперь Query.update() и Query.delete() вызывают исключение, если были вызваны какие-либо из limit(), offset(), order_by(), group_by() или distinct().
References: #1487
Добавлено расширение AttributeExtension в sqlalchemy.orm.__all__.
Улучшено сообщение об ошибке при вызове функции query() с выражением не на языке SQL /entity.
References: #1476
Использование False или 0 в качестве полиморфного дискриминатора теперь работает как для базового класса, так и для подкласса.
References: #1440
В Query добавлена функция enable_assertions(False), которая отключает обычные утверждения для ожидаемого состояния - используется подклассами Query для проектирования пользовательского состояния. Пример см. на https://www.sqlalchemy.org/trac/wiki/UsageRecipes/PreFilteredQuery.
References: #1424
Исправлена проблема рекурсии, возникавшая в том случае, если метод mapped-объекта __len__() or __nonzero__() приводил к изменению состояния.
References: #1501
Исправлена некорректная передача исключения в Weak/StrongIdentityMap.add()
References: #1506
Исправлено сообщение об ошибке «could not find a FROM clause» в query.join(), которое не выдавалось корректно, если запрос был направлен на чистую конструкцию SQL.
References: #1522
Исправлена несколько гипотетическая проблема, в результате которой для мэппера, использующего старую функцию polymorphic_union, вычислялся неправильный первичный ключ - но это уже старье.
References: #1486
sql¶
Исправлена функция column.copy() для копирования значений по умолчанию и при обновлении.
References: #1373
Исправлена ошибка в extract(), появившаяся в 0.5.4, когда строковый аргумент «field» воспринимался как ClauseElement, что приводило к различным ошибкам в более сложных SQL-преобразованиях.
Унарные выражения, такие как DISTINCT, распространяют свою обработку типов на наборы результатов, что позволяет выполнять преобразования типа unicode и т.п.
References: #1420
Исправлена ошибка в Table и Column, при которой передача пустого dict для аргумента «info» приводила к возникновению исключения.
References: #1482
oracle¶
В 0.6 исправлена ошибка, связанная с тем, что имена псевдонимов Oracle не усекались.
References: #1309
misc¶
Прокси-коллекции, создаваемые associationproxy, стали pickleable. Однако пользовательский proxy_factory по-прежнему не является pickleable, если в нем не определены __getstate__ и __setstate__.
References: #1446
Declarative будет выдавать информативное исключение, если __table_args__ передается в виде кортежа без аргумента dict. Улучшена документация.
References: #1468
Объекты таблиц, объявленные в метаданных, теперь можно использовать в строковых выражениях, передаваемых в primaryjoin/secondaryjoin/ secondary - имя подтягивается из метаданных декларативной базы.
References: #1527
Столбец может быть добавлен в подкласс объединенной таблицы уже после создания класса (т.е. через присвоение атрибутов на уровне класса). Столбец добавляется в базовую таблицу, как обычно, но теперь картограф перестраивает свое «присоединение» для включения нового столбца, а не выдает ошибку «нет такого столбца, используйте column_property() вместо этого».
References: #1523
Добавлены примеры в набор тестов, чтобы они регулярно выполнялись, а также вычищены несколько предупреждений об устаревании.
0.5.5¶
Released: Mon Jul 13 2009general¶
юнит-тесты были перенесены из unittest в nose. Информацию о том, как запускать тесты, смотрите в README.unittests.
References: #970
orm¶
Аргумент «foreign_keys» в relation() теперь будет автоматически распространяться на backref точно так же, как это делают primaryjoin и secondaryjoin. Для крайне редких случаев, когда обратный адрес relation() имеет намеренно разные «foreign_keys», обе стороны теперь должны быть настроены явно (если они действительно требуют этой настройки, см. следующее примечание…).
…Единственный известный (и очень-очень редкий) случай использования различных настроек foreign_keys на стороне прямого и обратного направления - составной внешний ключ, частично указывающий на собственные столбцы, - был усовершенствован таким образом, что аспект отношения fk->itself не будет использоваться для определения направления отношения.
Session.mapper теперь является устаревшим.
Вызовите session.add(), если вы хотите, чтобы отдельно стоящий объект стал частью вашей сессии. В противном случае, DIY-версия Session.mapper теперь документирована по адресу https://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper. Метод останется устаревшим в версии 0.6.
Исправлена ошибка, при которой запрос мог соединяться() из отдельных колонок сущности подкласса объединенной таблицы, т.е. query(SubClass.foo, SubClass.bar).join(<anything>). В большинстве случаев будет выдана ошибка «Could not find a FROM clause to join from». В некоторых других случаях результат возвращался в терминах базового класса, а не подкласса, поэтому приложения, полагающиеся на такой ошибочный результат, необходимо скорректировать.
References: #1431
Исправлена ошибка, связанная с функцией contains_eager(), которая в редких случаях применялась к вторичной (т.е. «ленивой») загрузке, создавая картезианские продукты. улучшена работа с query.options() при вторичной загрузке в целом.
References: #1461
Исправлена ошибка, появившаяся в версии 0.5.4, из-за которой композитные типы не работали при очистке столбцов, удерживающих значения по умолчанию.
Исправлена еще одна ошибка версии 0.5.4, из-за которой мутируемые атрибуты (например, PickleType) не десериализовывались корректно при сериализации всего объекта.
References: #1426
Исправлена ошибка, при которой функция session.is_modified() вызывала исключение, если использовались какие-либо синонимы.
Исправлена потенциальная утечка памяти, при которой ранее забранные объекты, помещенные обратно в сессию, не могли быть полностью собраны в мусор, если сессия не была закрыта явным образом.
Исправлена ошибка, из-за которой атрибуты, основанные на списках, такие как pickletype и PGArray, не могли быть объединены() должным образом.
Исправлена неработающая функция attributes.set_committed_value.
Уменьшен формат pickle для InstanceState, что должно еще больше сократить объем памяти, занимаемой маринованными экземплярами. Формат должен быть обратно совместим с форматом 0.5.4 и предыдущих версий.
sqlalchemy.orm.join и sqlalchemy.orm.outerjoin теперь добавлены к __all__ в sqlalchemy.orm.*.
References: #1463
Исправлена ошибка, когда при передаче в get() слишком короткого составного значения первичного ключа не срабатывало исключение Query.
References: #1458
sql¶
Устранена неясная особенность execute() (включая connection, engine, Session), при которой конструкция bindparam() может быть отправлена в качестве ключа в словарь params. Такое использование не документировано и лежит в основе проблемы, когда объект bindparam(), неявно созданный конструкцией text(), может иметь такое же хэш-значение, как и строка, помещенная в словарь params, что может привести к некорректному совпадению при вычислении окончательных параметров связывания. Внутренняя проверка этого условия привела бы к значительным задержкам в критической задаче рендеринга параметров, поэтому данное поведение удалено. Это изменение несовместимо с обратным ходом событий для любых приложений, которые могли использовать эту возможность, однако она никогда не была документирована.
misc¶
Реализована функция recreate() для StaticPool.
0.5.4p2¶
Released: Tue May 26 2009sql¶
Исправлена печать исключений SQL, не основанных на параметрах или не относящихся к стилю executemany().
postgresql¶
Устранена жестко заданная функция TIMESTAMP, которая при использовании func.TIMESTAMP(value) выдавала «значение TIMESTAMP». На некоторых платформах это приводит к сбоям, поскольку PostgreSQL не позволяет использовать параметры привязки в таком контексте. Жестко закодированный верхний регистр также неуместен, и существует множество других PG-приведений, которые мы должны поддерживать. Поэтому вместо этого используйте текстовые конструкции, например select([«timestamp „12/05/09“»]).
0.5.4p1¶
Released: Mon May 18 2009orm¶
Исправлена ошибка атрибутов, появившаяся в 0.5.4, которая возникала при использовании функции merge() с неполным объектом.
0.5.4¶
Released: Sun May 17 2009orm¶
Значительно увеличена производительность функции Sessions/flush() при работе с большими графами мапперов, большим количеством объектов:
Удалено все* O(N) поведение сканирования в процессе flush(), т.е. операции, которые сканировали всю сессию, включая чрезвычайно дорогую операцию, которая ошибочно предполагала, что значения первичных ключей меняются, когда это было не так.
Остается один крайний случай, который может вызвать полное сканирование, если существующий атрибут первичного ключа будет изменен на новое значение.
Поведение сессии в отношении «слабых ссылок» теперь является полным - никакие сильные ссылки на отображаемый объект или связанные с ним элементы/коллекции в его __диктате__ не делаются. Обратные ссылки и другие циклы в объектах больше не влияют на способность сессии терять все ссылки на немодифицированные объекты. Объекты с ожидающими изменениями по-прежнему поддерживаются в сильном состоянии до момента их сброса.
Реализация также повышает производительность за счет того, что процесс «воскрешения» собранных в мусор элементов происходит только для отображений, которые отображают «изменяемые» атрибуты (т.е. PickleType, составные attrs). Это снимает накладные расходы с процесса gc и упрощает внутреннее поведение.
Если изменение «мутабельного» атрибута является единственным изменением в объекте, который затем разыменовывается, то при выдаче UPDATE картограф не будет иметь доступа к состоянию других атрибутов. Для некоторых расширений MapperExtensions это может выглядеть по-разному.
Это изменение также затрагивает внутренний API атрибутов, но не интерфейс AttributeExtension и не какие-либо публично документированные функции атрибутов.
Блок работы больше не генерирует граф «зависимых» процессоров для всего графа отображений при выполнении flush(), а создает такие процессоры только для тех отображений, которые представляют объекты с ожидающими изменениями. Это позволяет сэкономить огромное количество вызовов методов в контексте большого взаимосвязанного графа картографов.
Кэширование расточительной операции «сортировки таблицы», которая ранее выполнялась несколько раз за одну попытку, а также удаление значительного количества вызовов метода flush().
В mapper._save_obj() были упрощены другие избыточные поведения.
References: #1398
Модифицирован query_cls в DynamicAttributeImpl для принятия полной миксин-версии AppenderQuery, что позволяет использовать подклассы AppenderMixin.
Столбец «полиморфный дискриминатор» может быть частью первичного ключа, и он будет заполнен правильным значением дискриминатора.
References: #1300
Исправлена ошибка, связанная с тем, что оценщик не мог оценить предложение IS NULL.
Исправлена функция «установить коллекцию» для «динамических» отношений для корректного инициирования событий. Ранее коллекция могла быть назначена только на ожидающий родительский экземпляр, в противном случае модифицированные события запускались некорректно. Функция set collection теперь совместима с функцией merge(), исправления.
References: #1352
Разрешена пикировка объектов PropertyOption, построенных с использованием инструментальных дескрипторов; ранее при пикировке объекта, загруженного с использованием дескрипторной опции, например query.options(eagerload(MyClass.foo)), возникали ошибки pickle.
Ленивый загрузчик не будет использовать get(), если SQL-клаузула «ленивой загрузки» совпадает с клаузулой, используемой get(), но содержит некоторые жестко закодированные параметры. Ранее ленивая стратегия терпела неудачу при использовании get(). В идеале get() должен использоваться и с жестко закодированными параметрами, но это требует дальнейшей разработки.
References: #1357
MapperOptions и другие состояния, связанные с query.options(), больше не связываются в процессе загрузки с каждым атрибутом ленивой/отложенной загрузки. Теперь опции ассоциируются с объектом состояния экземпляра только один раз при его заполнении. Это в большинстве случаев устраняет необходимость в объектах-загрузчиках для каждого экземпляра/атрибута, повышая скорость загрузки и снижая затраты памяти для отдельных экземпляров.
References: #1391
Исправлено еще одно место, где autoflush мешал работе session.merge(). Теперь autoflush полностью отключается на время работы merge().
References: #1360
Исправлена ошибка, из-за которой логика зависимости «мутабельный первичный ключ» не могла корректно работать с отношением один-к-одному().
References: #1406
Исправлена ошибка в relation(), появившаяся в 0.5.3, из-за которой самореферентное отношение от базового класса к подклассу объединенной таблицы не конфигурировалось корректно.
Исправлена проблема компиляции неясных отображений при использовании наследуемых отображений, которая приводила к появлению неинициализированных атрибутов.
Исправлена документация для сессии weak_identity_map - значение по умолчанию равно True, что указывает на использование слабой карты ссылок.
Исправлена проблема с единицей работы, при которой атрибут внешнего ключа элемента, содержащегося в коллекции, принадлежащей удаляемому объекту, не устанавливался в значение None, если связь() была самореферентной.
References: #1376
Исправлены ошибки Query.update() и Query.delete() при работе с отношениями, загруженными с нетерпением.
References: #1378
Теперь ошибкой является указание обоих столбцов бинарного условия primaryjoin в коллекции foreign_keys или remote_side. Ранее это было просто нелепо, но при этом достигалось недетерминированным образом.
sql¶
Выполнен обратный перенос расширения «compiler» из SQLA 0.6. Это стандартизированный интерфейс, позволяющий создавать собственные подклассы ClauseElement и компиляторы. В частности, он удобен в качестве альтернативы text(), когда требуется создать конструкцию с компиляциями, специфичными для базы данных. Подробности см. в документации по расширению.
Сообщения об исключениях усекаются, если список связанных параметров превышает 10, что предотвращает заполнение экранов и лог-файлов огромными многостраничными исключениями для больших операторов executemany().
References: #1413
sqlalchemy.extract()
теперь чувствителен к диалектам и может извлекать компоненты временных меток идиоматическим образом из всех поддерживаемых баз данных, включая SQLite.Исправлены __repr__() и другие методы _get_colspec() для ForeignKey, построенных на основе конструкции стиля __clause_element__() (т.е. декларативных колонок).
References: #1353
schema¶
В класс IdentifierPreparer добавлен метод quote_schema(), чтобы диалекты могли переопределять способ работы со схемами. Это позволяет диалекту MSSQL рассматривать схемы как многокомпонентные идентификаторы, такие как „database.owner“.
extensions¶
Исправлено добавление отложенных или других свойств столбцов в декларативный класс.
References: #1379
mysql¶
При отражении конструкции FOREIGN KEY будет учитываться точечная комбинация schema.tablename, если внешний ключ ссылается на таблицу в удаленной схеме.
References: #1405
sqlite¶
mssql¶
Изменен принцип работы логики точек сохранения, чтобы она не наступала на подпрограммы, не ориентированные на точки сохранения. Поддержка точек сохранения пока носит экспериментальный характер.
Добавлены зарезервированные слова для MSSQL, которые охватывают версию 2008 и все предыдущие версии.
References: #1310
Исправлена проблема, связанная с тем, что информационная схема не работала с базой данных, основанной на двоичной свертке. Очистка информационной схемы, так как теперь она используется только mssql.
References: #1343
0.5.3¶
Released: Tue Mar 24 2009orm¶
Аргумент «objects» для session.flush() является устаревшим. Состояние, представляющее собой связь между родительским и дочерним объектом, не поддерживает статус «flushed» на одной стороне связи и не поддерживает на другой, поэтому поддержка этой операции приводит к недостоверным результатам.
References: #1315
Теперь Query реализует функцию __clause_element__(), которая производит его selectable, что означает, что экземпляр Query может быть принят во многие SQL-выражения, включая col.in_(query), union(query1, query2), select([foo]).select_from(query) и т.д.
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
Исправлена ошибка в функции dynamic_loader(), из-за которой события добавления/удаления после времени построения не передавались в UOW для последующей обработки в функции flush().
References: #1347
Исправлена ошибка, при которой не выполнялась проверка column_prefix перед тем, как не сопоставлять атрибут, у которого уже присутствует имя на уровне класса.
при выполнении функции session.expire() для конкретного атрибута коллекции будут удалены все незавершенные добавления обратных ссылок, так что при следующем обращении будет корректно возвращено только то, что имелось в базе данных. Это в некоторой степени обходной путь, хотя мы рассматриваем возможность полного отказа от функции flush([objects]).
References: #1315
Session.scalar() теперь преобразует необработанные строки SQL в text() так же, как это делает Session.execute(), и принимает те же альтернативные **kw аргументы.
Улучшение логики «определения направления» в relation() таким образом, чтобы можно было определить направление в таких сложных ситуациях, как mapper(A.join(B)) -> relation-> mapper(B).
При очистке частичных наборов объектов с помощью session.flush([somelist]) отложенные объекты, оставшиеся после выполнения операции, не будут случайно добавлены как постоянные.
References: #1306
В InstrumentationManager добавлен метод «post_configure_attribute», благодаря чему пример «listen_for_events.py» снова работает.
References: #1314
прямая и дополняющая ее обратная ссылки, которые имеют одно и то же направление, т.е. ONETOMANY или MANYTOONE, теперь обнаруживаются, и выдается сообщение об ошибке. Это позволяет в дальнейшем избежать безумных ошибок CircularDependencyErrors.
Исправлена ошибка в Query, связанная с одновременным выбором нескольких объектов наследования объединенных таблиц с общими базовыми классами:
Ранее адаптация, примененная к «B» на «A JOIN B», ошибочно частично применялась к «A».
Сравнения по отношениям (например, A.related==someb) не адаптировались, когда должны были.
Другие фильтры, например query(A).join(A.bs).filter(B.foo==“bar“), ошибочно адаптировали «B.foo» так, как будто это «A».
Исправлена адаптация предложений EXISTS через any(), has() и т.д. в сочетании с алиасированным объектом слева и of_type() справа.
References: #1325
В sqlalchemy.orm.attributes добавлен вспомогательный метод атрибутов
set_committed_value
. Учитывая объект, имя атрибута и значение, установит это значение на объект как часть его «зафиксированного» состояния, т.е. состояния, которое считается загруженным из базы данных. Помогает при создании собственных загрузчиков коллекций и т.п.Запрос не будет завершаться с ошибкой weakref при передаче дескриптора, не относящегося к мапперу/классу инструментов, а будет выдавать ошибку «Invalid column expression».
Query.group_by() правильно учитывает алиасинг, примененный к предложению FROM, например, при использовании select_from(), при использовании with_polymorphic() или при использовании from_self().
sql¶
Псевдоним() select() будет преобразован в «скалярный подзапрос» при использовании его в однозначно скалярном контексте, т.е. при использовании в операции сравнения. Это относится и к ORM при использовании query.subquery().
Исправлено отсутствие атрибута _label у объекта Function, в том числе при использовании в select() с use_labels (например, при использовании в ORM column_property()).
References: #1302
анонимные имена псевдонимов теперь усекаются до максимальной длины, допустимой диалектом. Это более существенно для таких СУБД, как Oracle, с очень маленькими ограничениями на количество символов.
References: #1309
интерфейс __selectable__() был полностью заменен на __clause_element__().
Кэш для каждого диалекта, используемый TypeEngine для кэширования специфических для диалекта типов, теперь представляет собой WeakKeyDictionary. Это позволяет избежать вечных ссылок на объекты диалекта в приложениях, создающих произвольно большое количество движков или диалектов. При этом наблюдается небольшое снижение производительности, которое будет устранено в версии 0.6.
References: #1299
extensions¶
Исправлена проблема рекурсивной выборки в сериализаторе, вызванная EXISTS или другой встроенной конструкцией FROM.
Декларативный поиск «наследует» класс, используя поиск по __bases__, чтобы пропустить миксины, которые являются локальными для подклассов.
Декларативное определение наследования объединенных таблиц первичным условием join даже при явном указании аргумента mapper «наследует».
Declarative будет правильно интерпретировать аргумент «foreign_keys» в функции backref(), если он является строкой.
Declarative будет принимать в качестве свойства столбец, связанный с таблицей, при использовании в сочетании с __table__, если этот столбец уже присутствует в __table__. Столбец будет ремаппирован на заданный ключ так же, как и при добавлении в дикту свойств mapper().
postgresql¶
sqlite¶
Исправлены методы отражения SQLite таким образом, чтобы определялось отсутствие cursor.description, вызывающее автозакрытие курсора, и чтобы не возникало ошибки no results на последних версиях pysqlite, которые выдают ошибку при вызове fetchone() при отсутствии строк.
mssql¶
Предварительная поддержка pymssql 1.0.1
Исправлена ошибка в mssql, при которой не соблюдалась максимальная длина идентификатора (max_identifier_length).
0.5.2¶
Released: Sat Jan 24 2009orm¶
Доработано предупреждение версии 0.5.1 о каскаде удалений-орфанов, размещенных на отношениях «многие-ко-многим». Сначала плохие новости: предупреждение будет распространяться как на отношения «многие-ко-многим», так и на отношения «многие-один». Это необходимо, поскольку в обоих случаях SQLA не сканирует весь набор потенциальных родителей при определении статуса «сироты» - для персистентного объекта она обнаруживает только событие de-association in-python для определения объекта как «сироты». Далее хорошие новости: для поддержки связи «один к одному» через внешний ключ или ассоциативную таблицу, а также для поддержки связи «один ко многим» через ассоциативную таблицу можно установить новый флаг single_parent=True, который указывает, что объекты, связанные с данным отношением, должны иметь только одного родителя. Если в Python произойдет несколько событий, связанных с родительской ассоциацией, то отношение выдаст ошибку.
Внесено изменение в инструментарий атрибутов из 0.5.1, чтобы полностью установить инструментарий для подклассов, в которых маппер был создан после того, как суперкласс уже был полностью инструментаризован.
References: #1292
Исправлена ошибка в каскаде delete-orphan, при которой два отношения «один к одному» от двух разных родительских классов к одному целевому классу приводили к преждевременному удалению экземпляра.
Исправлена ошибка, из-за которой самоссылающаяся самозагрузка не позволяла другим самоссылающимся загрузкам, как самоссылающимся, так и нет, корректно присоединяться к родительскому JOIN. Спасибо Alex K за создание отличного тестового примера.
session.expire() и связанные с ним методы не будут уничтожать() незагруженные отложенные атрибуты. Это предотвращает их ненужную загрузку при обновлении экземпляра.
query.join()/outerjoin() теперь будет корректно присоединять конструкцию aliased() к существующей левой части, даже если был вызван query.from_self() или query.select_from(someselectable).
References: #1293
sql¶
- Дальнейшие исправления «знаков процента и пробелов в колонках/таблицах
имена».
References: #1284
mssql¶
0.5.1¶
Released: Sat Jan 17 2009orm¶
Удален внутренний кэш join, который потенциально мог привести к утечке памяти при многократной выдаче query.join() для специальных селектов.
Методы сессий «clear()», «save()», «update()», «save_or_update()» были устаревшими и заменены на «expunge_all()» и «add()». «expunge_all()» также был добавлен в ScopedSession.
Модернизировано исключение «no mapped table» и добавлено более явное исключение __table__/__tablename__ в декларативный формат.
Наследующие конкретные отображения теперь инструментируют атрибуты, унаследованные от суперкласса, но не определенные для самого конкретного отображения, атрибутом InstrumentedAttribute, при обращении к которому выдается описательная ошибка.
References: #1237
Добавлено новое ключевое слово relation() back_populates. Оно позволяет настраивать обратные ссылки с помощью явных отношений. Это необходимо при создании двунаправленных связей между иерархией конкретных отображателей и другим классом.
Добавлено тестовое покрытие для объектов relation(), заданных на конкретных картографах.
References: #1237
Query.from_self(), а также query.subquery() отключают отображение нетерпеливых соединений внутри создаваемого подзапроса. Функция «отключения всех нетерпеливых соединений» доступна публично через новый генератив query.enable_eagerloads().
References: #1276
В Query добавлен рудиментарный ряд операций над множествами, получающими в качестве аргументов объекты Query, включая union(), union_all(), intersect(), except_(), intersect_all(), except_all(). Примеры приведены в документации API для Query.union().
Исправлена ошибка, из-за которой Query.join() и eagerloads не присоединялись к запросу, выбранному из объединения или алиасированного объединения.
Добавлен краткий пример документации для двунаправленных отношений, заданных на конкретных картографах.
References: #1237
Теперь отображатели инструментируют атрибуты классов при построении с помощью конечного объекта InstrumentedAttribute, который остается постоянным. Методология _CompileOnAttr/__getattribute__() была удалена. Чистый эффект заключается в том, что атрибуты класса, отображаемые на основе столбцов, теперь могут полностью использоваться на уровне класса без применения операции компиляции отображателя, что значительно упрощает типичные схемы использования в декларативных системах.
References: #1269
ColumnProperty (и внешние помощники, такие как
deferred
) больше не игнорируют неизвестные аргументы **keyword.Исправлена ошибка, связанная с механизмом «переключения строк» в Unitofwork, т.е. преобразования INSERT/DELETE в UPDATE, в сочетании с наследованием объединенных таблиц и объектом, не содержащим определенных значений для дочерней таблицы, где будет выводиться UPDATE без предложения SET.
Использование функции delete-orphan для отношения «многие-ко-многим» неактуально. Это приводит к недостоверным или ошибочным результатам, поскольку SQLA не получает полный список «родителей» для m2m. Чтобы добиться поведения delete-orphan в таблице m2m, используйте явный класс ассоциации, чтобы отдельная строка ассоциации рассматривалась как родительская.
References: #1281
Каскад delete-orphan всегда требует каскада delete. Указание delete-orphan без delete теперь вызывает предупреждение об устаревании.
References: #1281
sql¶
Улучшена методика работы со знаками процента в именах столбцов from. Добавлены дополнительные тесты. Диалекты MySQL и PostgreSQL по-прежнему не выдают корректных операторов CREATE TABLE для идентификаторов со знаками процента.
References: #1256
schema¶
Теперь Index принимает в качестве аргументов столбцы, ориентированные на InstrumentedAttributes (т.е. атрибуты сопоставленных классов, основанные на столбцах).
References: #1214
Колонка без имени (как в декларативном варианте) не будет вызывать ошибку NoneType при запросе ее строкового вывода (например, в трассировке стека).
Исправлена ошибка при переопределении столбца с ключом ForeignKey в отраженной таблице, когда производные столбцы (т.е. «виртуальные» столбцы select и т.д.) непреднамеренно вызывали логику очистки на уровне схемы, предназначенную только для исходного столбца.
References: #1278
mysql¶
Добавлены недостающие ключевые слова из MySQL 4.1, чтобы они правильно экранировались.
mssql¶
Исправлена работа с большими десятичными значениями и добавлены более надежные тесты. Удалена работа со строками в плавающих значениях.
References: #1280
Изменена обработка do_begin в mssql для использования курсора, а не соединения, чтобы обеспечить совместимость с DBAPI.
Исправлена поддержка SAVEPOINT в adodbapi путем изменения обработки savepoint_release, которая не поддерживается в mssql.
misc¶
Теперь можно указывать объекты Column для подклассов, не имеющих собственной таблицы (т.е. использующих наследование одной таблицы). Колонки будут добавлены в базовую таблицу, но отображены только подклассом.
Для объединенных и одиночно наследующих подклассов подкласс отображает только те столбцы, которые уже отображены в суперклассе, и те, которые явно отображены в подклассе. Другие столбцы, присутствующие в 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 явно.
Ошибкой является добавление новых объектов Column в декларативный класс, который указал существующую таблицу с помощью __table__.
0.5.0¶
Released: Tue Jan 06 2009general¶
Документация переведена на язык Sphinx. В частности, сгенерированная документация по API превратилась в полноценный раздел «API Reference», в котором организована редакционная документация в сочетании со сгенерированными док-строками. Значительно улучшена перекрестная связь между разделами и документами API, реализована возможность поиска с помощью javascript, а также полный индекс всех классов, функций и членов.
Теперь setup.py импортирует setuptools только опционально. Если его нет, то используется distutils. Новый инсталлятор «pip» рекомендуется использовать вместо easy_install, так как его установка более упрощена.
в папку с примерами добавлена очень простая иллюстрация интеграции с PostGIS.
orm¶
Query.with_polymorphic() теперь принимает третий аргумент «discriminator», который будет заменять значение mapper.polymorphic_on для данного запроса. Самим картографам больше не требуется устанавливать значение polymorphic_on, даже если картограф имеет идентификатор polymorphic_identity. Если значение не установлено, то по умолчанию отображатель будет загружаться неполиморфно. Вместе эти две возможности позволяют использовать полиморфную загрузку в неполиморфной конкретной системе наследования на основе отдельных запросов, поскольку конкретные системы подвержены многим проблемам при использовании полиморфной загрузки во всех случаях.
dynamic_loader принимает параметр query_class= для настройки классов запросов, используемых как для динамической коллекции, так и для запросов, построенных на ее основе.
query.order_by() принимает значение None, что приведет к удалению из запроса любого состояния order_by, а также отмене любого упорядочивания, заданного в маппере/реляции. В основном это полезно для переопределения упорядочивания, заданного в динамическом загрузчике (dynamic_loader()).
References: #1079
Исключения, возникающие при компиляции compile_mappers(), теперь сохраняются для обеспечения «липкого поведения» - если вызов hasattr() для предварительно скомпилированного маппированного атрибута вызывает неудачную компиляцию и подавляет исключение, последующая компиляция блокируется, и исключение будет повторено при следующем вызове compile(). Эта проблема часто возникает при использовании декларативного подхода.
property.of_type() теперь распознается на однотабличной наследующей цели, когда используется в контексте prop.of_type(…).any()/has(), а также query.join(prop.of_type(…)).
query.join() выдает ошибку, если цель соединения не совпадает с атрибутом, основанным на свойстве - хотя вряд ли кто-то так делает, автор SQLAlchemy был виновен именно в таком вольном поведении.
Исправлена ошибка, когда при использовании weak_instance_map=False модифицированные события не перехватывались при выполнении flush().
References: #1272
Исправлены некоторые глубокие проблемы с «соответствием столбцов», которые могли повлиять на запрос, выполняемый к селектору, содержащему несколько версий одной и той же таблицы, а также на объединения и подобные им, содержащие одни и те же столбцы таблицы в разных позициях столбцов на разных уровнях.
References: #1268
Пользовательские классы компараторов, используемые совместно с column_property(), relation() и т.д., могут определять новые методы сравнения на компараторе, которые станут доступны через __getattr__() на InstrumentedAttribute. В случае использования функций synonym() или comparable_property() атрибуты разрешаются сначала на пользовательском дескрипторе, а затем на пользовательском компараторе.
Добавлен аксессуар ScopedSession.is_active.
References: #976
В качестве ключей в query.update({}) можно передавать сопоставленные атрибуты и объекты столбцов.
References: #1262
Сопоставленные атрибуты, переданные в values() выражения уровня insert() или update(), будут использовать ключи сопоставленных столбцов, а не ключи сопоставленного атрибута.
Исправлена проблема некорректной работы Query.delete() и Query.update() с параметрами привязки.
References: #1242
Query.select_from(), from_statement() гарантируют, что заданный аргумент является FromClause или Text/Select/Union соответственно.
В Query() можно передать «составной» атрибут в качестве выражения столбца, и он будет расширен. В некоторой степени связано с.
References: #1253
Query() немного более устойчив при передаче различных выражений столбцов, таких как строки, клаузелисты, конструкции text() (что может означать, что он просто более вежливо выдает ошибку).
first() работает, как и ожидалось, с Query.from_statement().
Исправлена ошибка, появившаяся в 0.5rc4, связанная с тем, что для свойств, которые были добавлены в маппер после компиляции с помощью add_property() или эквивалентной функции, не работала eager loading.
Исправлена ошибка, при которой связь многие-ко-многим() с viewonly=True некорректно ссылалась на связь secondary->remote.
Дубликаты элементов в списочной коллекции будут сохраняться при выполнении INSERT в «вторичную» таблицу в отношении «многие-ко-многим». Если на таблицу m2m наложено ограничение уникальности или первичного ключа, то вместо молчаливого удаления дублирующихся записей это приведет к ожидаемому нарушению ограничений. Обратите внимание, что для отношения «один-ко-многим» сохраняется старое поведение, поскольку записи коллекции в этом случае не приводят к INSERT-запросам, и SQLA не контролирует коллекции вручную.
References: #1232
Query.add_column() может принимать объекты FromClause так же, как и session.query().
Сравнение отношения «многие-к-одному» с NULL корректно преобразуется в IS NOT NULL на основе not_().
Добавлена дополнительная проверка на то, что явные primaryjoin/secondaryjoin являются экземплярами ClauseElement, чтобы в дальнейшем не возникало путаных ошибок.
References: #1087
Улучшена проверка mapper() для классов, не являющихся классами.
References: #1236
Аргумент comparator_factory теперь документирован и поддерживается всеми типами MapperProperty, включая column_property(), relation(), backref() и synonym().
References: #5051
Изменено название PropertyLoader на RelationProperty, чтобы соответствовать всем остальным названиям. PropertyLoader по-прежнему присутствует в качестве синонима.
исправлен вызов «double iter()», вызывавший ошибки шины в API шардов, удалена ошибка result.close(), оставшаяся от версии 0.4.
Сделано так, чтобы каскады Session.merge не вызывали автопромывку. Исправление преждевременной вставки объединенных экземпляров с отсутствующими значениями.
Два исправления для предотвращения вывода внеполосных столбцов в сценариях наследования polymorphic_union (что приводит к выводу лишних таблиц в предложении FROM, вызывая появление cartesian products):
Улучшена «адаптация столбцов» для ситуаций наследования a->b->c, что позволяет лучше находить столбцы, связанные друг с другом через несколько уровней косвенности, а не выводить неадаптированный столбец.
столбец «полиморфный дискриминатор» отображается только для реального отображателя, к которому выполняется запрос. Колонка не будет «подтягиваться» из картографа подклассов или суперклассов, так как в ней нет необходимости.
Исправлен аргумент shard_id в файле ShardedSession.execute().
References: #1072
sql¶
Объекты RowProxy можно использовать вместо словарных аргументов, передаваемых в connection.execute() и друзьям.
References: #935
Столбцы снова могут содержать в своих названиях знаки процента.
References: #1256
sqlalchemy.sql.expression.Function теперь является публичным классом. Он может быть подклассифицирован для создания пользовательских SQL-функций в императивном стиле, в том числе с заранее заданным поведением. Пример postgis.py иллюстрирует один из вариантов такого использования.
Теперь PickleType по умолчанию предпочитает сравнение ==, если входящий объект (например, dict) реализует __eq__(). Если объект не реализует __eq__() и mutable=True, то выдается предупреждение об устаревании.
Исправлена странность импорта в sqlalchemy.sql, чтобы не экспортировать __names__.
References: #1215
Повторное использование одного и того же объекта ForeignKey приводит к ошибке, а не к тихому отказу в дальнейшем.
References: #1238
Добавлена ошибка NotImplementedError для метода params() в конструкциях Insert/Update/Delete. В настоящее время эти элементы не поддерживают данную функциональность, что также будет немного вводить в заблуждение по сравнению с values().
Отраженные внешние ключи будут правильно определять местоположение ссылающегося на них столбца, даже если столбцу был присвоен атрибут «key», отличный от отраженного имени. Это достигается с помощью нового флага в ForeignKey/ForeignKeyConstraint под названием «link_to_name», если он равен True, то данное имя является именем ссылающегося столбца, а не его назначенного ключа.
References: #650
select() может принимать ClauseList в качестве столбца так же, как Table или другой selectable, и в качестве элементов столбца будут использоваться внутренние выражения.
References: #1253
флаг «passive» в session.is_modified() корректно передается менеджеру атрибутов.
union() и union_all() не будут уничтожать order_by(), который был применен к select()ам внутри них. Если вы объединяете select() с order_by() (предположительно для поддержки LIMIT/OFFSET), вы должны также вызвать self_group() для применения скобок.
mysql¶
Знаки «%» в конструкциях text() автоматически экранируются в «%%». Из-за обратной несовместимости этого изменения при обнаружении в строке знака „%%“ выдается предупреждение.
Исправлена ошибка в возникновении исключения при отсутствии FK-столбцов во время отражения.
References: #1241
Исправлена ошибка, связанная с отражением таблицы удаленной схемы с внешним ключом, ссылающимся на другую таблицу в этой схеме.
sqlite¶
Отражение таблицы теперь хранит фактическое значение DefaultClause для столбца.
References: #1266
исправления ошибок, изменения в поведении
mssql¶
Добавлен новый тип MSGenericBinary. Он сопоставляется с типом Binary, что позволяет реализовать специализированное поведение, при котором типы с указанной длиной рассматриваются как бинарные типы фиксированной ширины, а типы без длины - как бинарные типы переменной длины без привязки.
Добавлены новые типы: MSVarBinary и MSImage.
References: #1249
Добавлено в типы MSReal, MSNText, MSSmallDateTime, MSTime, MSDateTimeOffset и MSDateTime2
Переработаны типы Date/Time. Тип данных
smalldatetime
больше не обрезается только до даты и теперь будет отображаться на тип MSSmallDateTime.References: #1254
Исправлена проблема, связанная с тем, что Numerics принимает значение int.
Сопоставил
char_length
с функциейLEN()
.Если
INSERT
включает в себя подвыборку, тоINSERT
преобразуется из конструкцииINSERT INTO VALUES
в конструкциюINSERT INTO SELECT
.Если столбец является частью
primary_key
, то он будетNOT NULL
, поскольку MSSQL не допускаетNULL
в столбцах primary_key.MSBinary
теперь возвращаетBINARY
вместоIMAGE
. Это изменение обратно несовместимо с тем, чтоBINARY
является типом данных фиксированной длины, аIMAGE
- типом данных переменной длины.References: #1249
get_default_schema_name
теперь отражается из базы данных на основе схемы пользователя по умолчанию. Это работает только с MSSQL 2005 и более поздними версиями.References: #1258
Добавлена поддержка collation за счет использования нового аргумента collation. Он поддерживается для следующих типов: char, nchar, varchar, nvarchar, text, ntext.
References: #1248
Изменения параметров строки соединения благоприятствуют использованию DSN в качестве спецификации по умолчанию для pyodbc. Подробные инструкции по использованию приведены в документальной строке mssql.py.
Добавлена экспериментальная поддержка точек сохранения. В настоящее время она не полностью работает с сессиями.
Поддержка трех уровней недействительности столбцов: NULL, NOT NULL и конфигурация базы данных по умолчанию. Конфигурация столбцов по умолчанию (nullable=True) теперь будет генерировать NULL в DDL. Ранее никаких спецификаций не выдавалось, и в силу вступало значение базы данных по умолчанию (обычно NULL, но не всегда). Чтобы явно запросить значение базы данных по умолчанию, сконфигурируйте столбцы с nullable=None, и в DDL не будет выдаваться спецификация. Такое поведение несовместимо с обратным ходом событий.
References: #1243
oracle¶
Скорректирован формат функции create_xid() для исправления двухфазной фиксации. Теперь у нас есть сообщения о том, что двухфазная фиксация Oracle работает корректно с этим изменением.
Добавлен тип OracleNVarchar, порождающий NVARCHAR2, а также подклассы Unicode, так что convert_unicode=True по умолчанию. NVARCHAR2 отражается в этот тип автоматически, поэтому эти столбцы передают юникод в отраженной таблице без явных флагов convert_unicode=True.
References: #1233
Исправлена ошибка, из-за которой не принимались out-параметры определенных типов; большое спасибо huddlej at wwu.edu !
References: #1265
misc¶
Добавлен новый атрибут description_encoding для диалекта, который используется для кодировки имени колонки при обработке метаданных. Обычно по умолчанию используется значение utf-8.
Connection.invalidate() проверяет наличие закрытого статуса, чтобы избежать ошибок атрибутов.
References: #1246
NullPool поддерживает поведение повторного подключения при сбое.
References: #1094
Добавлен мьютекс для начального создания пула при использовании pool.manage(dbapi). Это предотвращает незначительный случай «собачьей кучи», которая в противном случае могла бы возникнуть при запуске с большой нагрузкой.
References: #799
Метод _execute_clauseelement() снова становится приватным. Подкласс Connection теперь не нужен, поскольку появился ConnectionProxy.
Билеты.
Добавлено примечание о настройках create_session() по умолчанию.
Добавлен раздел о metadata.reflect().
Обновлен раздел TypeDecorator.
Переписан раздел документации, посвященный стратегии «threadlocal», в связи с недавней путаницей с этой функцией.
Удалены сильно устаревшие док-ты „polymorphic_fetch“ и „select_table“ из наследования, переработана вторая половина статьи «Наследование объединенных таблиц».
Документирован карг comparator_factory, добавлен новый раздел документации «Пользовательские компараторы».
Знаки «%» в конструкциях text() автоматически экранируются в «%%». Из-за обратной несовместимости этого изменения при обнаружении в строке знака „%%“ выдается предупреждение.
References: #1267
Вызов alias.execute() в сочетании с server_side_cursors не приведет к возникновению ошибки AttributeError.
В PostgreSQL добавлена поддержка отражения индексов с использованием замечательного патча, которым мы долго пренебрегали, представленного Кеном Кулманом (Ken Kuhlman).
References: #714
Свойства ассоциативного прокси становятся доступными на уровне класса, например, MyClass.aproxy. Ранее это значение равнялось None.
Полный список аргументов, принимаемых функцией backref() в виде строки, включает „primaryjoin“, „secondaryjoin“, „secondary“, „foreign_keys“, „remote_side“, „order_by“.
0.5.0rc4¶
Released: Fri Nov 14 2008general¶
глобальное изменение «propigate»->»propagate».
orm¶
Функция Query.count() была усовершенствована, чтобы делать «правильные» действия в более широком спектре случаев. Теперь он может подсчитывать запросы, состоящие из нескольких элементов, а также запросы, основанные на столбцах. Обратите внимание, что это означает, что если вы скажете query(A, B).count() без какого-либо критерия объединения, то будет подсчитано картезианское произведение A*B. Любой запрос к сущностям, основанным на столбцах, автоматически выдает «SELECT count(1) FROM (SELECT…)», так что возвращается реальный счетчик строк, то есть запрос типа query(func.count(A.name)).count() вернет значение один, поскольку этот запрос вернет одну строку.
Проведено много работ по настройке производительности. По приблизительным оценкам, по сравнению с 0.5.0rc3 производительность различных операций ORM выше на 10%, а по сравнению с 0.4.8 - на 25-30%.
исправления ошибок и изменения в поведении
Внесены коррективы в улучшенную сборку мусора для InstanceState, чтобы лучше защититься от ошибок, связанных с потерей состояния.
Query.get() возвращает более информативное сообщение об ошибке при выполнении запроса к нескольким сущностям.
References: #1220
Восстановлена ошибка NotImplementedError на Cls.relation.in_()
Исправлено предупреждение PendingDeprecationWarning, связанное с параметром order_by в relation().
References: #1226
sql¶
Удален атрибут „properties“ объекта Connection, следует использовать Connection.info.
Восстановлена выборка «active rowcount» перед автозакрытием курсора ResultProxy. Это было удалено в версии 0.5rc3.
Перестроен метод load_dialect_impl() в TypeDecorator таким образом, что он будет действовать, даже если пользовательский TypeDecorator использует в качестве своего impl другой TypeDecorator.
mssql¶
Многочисленные исправления для устранения проблем с ограничениями и смещениями.
Исправление ситуации, когда подзапросы в составе бинарного выражения необходимо перевести для использования синтаксиса IN и NOT IN.
Исправлена проблема с нотацией E, из-за которой невозможно было вставить десятичные значения меньше 1E-6.
References: #1216
Исправлены проблемы с отражением при работе со схемами, особенно когда эти схемы являются схемами по умолчанию.
References: #1217
Исправлена проблема с приведением элемента нулевой длины к varchar. Теперь он корректно корректирует CAST.
misc¶
Добавлена поддержка типа Currency.
Функции не вернули свой результат.
References: #1017
Исправлена проблема с объединениями. Access поддерживает только LEFT OUTER или INNER, а не только JOIN сам по себе.
References: #1017
Теперь можно использовать пользовательское «inherit_condition» в __mapper_args__ при использовании декларативного подхода.
исправлено некорректное распространение строковых значений «remote_side», «order_by» и других при использовании в функции backref().
0.5.0rc3¶
Released: Fri Nov 07 2008orm¶
В SessionExtension добавлены два новых хука: after_bulk_delete() и after_bulk_update(). after_bulk_delete() вызывается после выполнения операции массового удаления() запроса. after_bulk_update() вызывается после выполнения операции массового обновления() запроса.
Сравнение «не равно» простого отношения «многие-к-одному» к экземпляру не будет попадать в предложение EXISTS, а вместо этого будет сравнивать столбцы внешних ключей.
Удалены не совсем удачные случаи сравнения коллекции с итерируемыми. Для проверки принадлежности к коллекции используйте contains().
Улучшено поведение объектов aliased(), теперь они более точно адаптируют генерируемые выражения, что особенно помогает при самореферентных сравнениях.
References: #1171
Исправлена ошибка, связанная с тем, что условия primaryjoin/secondaryjoin, построенные из атрибутов, связанных с классом (как это часто бывает при использовании декларативных), впоследствии некорректно псевдонимировались Query, особенно при использовании различных компараторов на основе EXISTS.
Исправлена ошибка, когда при использовании нескольких query.join() с дескриптором, связанным алиасом, терялся левый алиас.
Улучшено управление памятью карты идентификации weakref, теперь она не требует мьютексов, воскрешает собранный из мусора экземпляр на ленивой основе для InstanceState с ожидающими изменениями.
Объект InstanceState теперь удаляет циклические ссылки на себя при удалении, чтобы не допустить циклической сборки мусора.
relation() не будет скрывать несвязанные ошибки ForeignKey внутри сообщения «please specify primaryjoin» при определении условия присоединения.
Исправлена ошибка в Query, связанная с использованием функции order_by() в сочетании с несколькими псевдонимами одного класса (будут добавлены тесты)
References: #1218
При использовании Query.join() с явным предложением для предложения ON это предложение будет алиенизировано в терминах левой части соединения, что позволит корректно работать сценариям типа query(Source).from_self().join((Dest, Source.id==Dest.source_id)).
Функция polymorphic_union() учитывает «ключ» каждого столбца, если они отличаются от имени столбца.
Исправлена поддержка «пассивных удалений» для отношения многие-к-одному() с каскадом «удаление».
References: #1183
Исправлена ошибка в композитных типах, из-за которой композитный тип с первичным ключом не мог быть изменен.
References: #1213
Добавлена большая детализация доступа к внутренним атрибутам, так что операции cascade и flush не инициализируют выгруженные атрибуты и коллекции, оставляя их нетронутыми для последующей ленивой загрузки. События Backref по-прежнему инициализируют атрибуты и коллекции для ожидающих экземпляров.
References: #1202
sql¶
Оптимизация и снижение сложности компилятора SQL. Количество вызовов для компиляции типичной конструкции select() на 20% меньше по сравнению с 0.5.0rc2.
Диалекты теперь могут генерировать имена меток с регулируемой длиной. Передавая аргумент «label_length=<значение>» в create_engine(), можно настроить максимальное количество символов в динамически генерируемых метках колонок, т.е. «somecolumn AS somelabel». Любое значение меньше 6 приведет к тому, что метка будет иметь минимальный размер, состоящий из символа подчеркивания и числового счетчика. По умолчанию компилятор использует значение dialect.max_identifier_length.
References: #1211
Упрощена проверка ResultProxy на «автозакрытие без результатов», которая основывается только на наличии cursor.description. Убрано все предположение на основе regexp об операторах, возвращающих строки.
References: #1212
Прямое выполнение конструкции union() правильно настроит обработку результирующей строки.
References: #1194
Внутреннее понятие колонки «OID» или «ROWID» было удалено. Он практически не используется ни в одном диалекте, а возможность его использования с cursor.lastrowid в psycopg2 практически исчезла, так как появился INSERT..RETURNING.
Удален метод «default_order_by()» для всех объектов FromClause.
Исправлен метод table.tometadata(), чтобы переданный аргумент схемы распространялся на конструкции ForeignKey.
Немного изменено поведение оператора IN при сравнении с пустыми коллекциями. Теперь он приводит к сравнению неравенства с самим собой. Более переносимо, но нарушает работу с хранимыми процедурами, которые не являются чистыми функциями.
mysql¶
Исправлено отражение внешнего ключа в случае, когда явная схема таблицы = совпадает со схемой (базой данных), к которой подключено соединение.
Больше не ожидается, что include_columns в отражении таблицы будет в нижнем регистре.
oracle¶
Написал docstring для диалекта Oracle. Видимо, ярлык Ohloh «мало комментариев к исходному коду» начинает строчить :).
Убран флаг оптимизации FIRST_ROWS() при использовании LIMIT/OFFSET, повторное включение возможно при использовании флага optimize_limits=True create_engine().
References: #536
исправления ошибок и изменения в поведении
Установка параметра auto_convert_lobs в значение False в create_engine() также предписывает типу OracleBinary возвращать LOB-объект cx_oracle без изменений.
misc¶
Добавлено новое расширение sqlalchemy.ext.serializer. Предоставляет «классы» сериализаторов/десериализаторов, которые зеркально отражают Pickle/Unpickle, а также dumps() и loads(). Этот сериализатор реализует «внешний объектный» pickler, который хранит ключевые контекстно-зависимые объекты, включая движки, сессии, метаданные, таблицы/колонки и мапперы, вне потока pickle, и впоследствии может восстановить pickle с помощью любого движка/провайдера метаданных/сессий. Это используется не для пикелирования экземпляров регулярных объектов, которые можно пикелировать без специальной логики, а для пикелирования объектов выражений и полных объектов Query, чтобы в момент распикирования можно было восстановить все зависимости от маппера/движка/сессии.
Исправлена ошибка, не позволяющая использовать в функции column_mapped_collection() декларативно-связанные объекты «колонки».
References: #1174
Функция util.flatten_iterator() не интерпретирует строки с методами __iter__() как итераторы, как, например, в pypy.
References: #1077
0.5.0rc2¶
Released: Sun Oct 12 2008orm¶
Исправлена ошибка, связанная с тем, что отношения чтения/записи(), содержащие литеральные или другие нестолбцовые выражения в условии primaryjoin, приравнивались к столбцу внешнего ключа.
»Непакетный» режим в mapper(), позволяющий вызывать методы расширения mapper при обновлении/вставке каждого экземпляра, теперь учитывает порядок вставки заданных объектов.
Исправлена ошибка, связанная с RLock в маппере, которая могла привести к тупиковой ситуации при вызове reentrant mapper compile(), возникающей при использовании декларативных конструкций внутри объектов ForeignKey.
ScopedSession.query_property теперь принимает фабрику query_cls, переопределяя настроенный query_cls сессии.
Исправлена ошибка с общим состоянием, препятствовавшая способности ScopedSession.mapper применять реализацию __init__ по умолчанию к подклассам объектов.
Исправлена работа с фрагментами в Query (т.е. query[x:y]) для фрагментов нулевой длины и фрагментов с None на обоих концах.
References: #1177
Добавлен пример, иллюстрирующий «вложенные множества» Селко в качестве отображения SQLA.
contains_eager() с аргументом alias работает даже в том случае, если псевдоним встроен в SELECT, как при передаче в Query через query.select_from().
Использование contains_eager() теперь совместимо с запросом, который также содержит обычную eager-загрузку и limit/offset, так как столбцы добавляются в подзапрос, создаваемый запросом.
References: #1180
session.execute() выполнит переданный ему объект Sequence (регресс с 0.4).
Из функций object_mapper() и class_mapper() удален аргумент с ключевым словом «raiseerror». Эти функции во всех случаях выдают ошибку, если данный класс/экземпляр не сопоставлен.
Исправлена ошибка, из-за которой сессия session.transaction.commit() при autocommit=False не начинала новую транзакцию.
Некоторые изменения в поведении слабых ссылок в Session.identity_map для уменьшения побочных эффектов асинхронного GC.
Внесена поправка в учет новых «чистых» объектов после очистки Session для лучшей защиты от работы с объектами в момент их асинхронного gc’ed.
References: #1182
sql¶
column.in_(someselect) теперь можно использовать как выражение в столбцах, не пропуская подзапрос в предложение FROM
References: #1074
mysql¶
Временные таблицы стали отражаемыми.
sqlite¶
Пересмотрена обработка привязки/результатов SQLite к дате/времени для использования регулярных выражений и форматных строк, а не strptime/strftime, для общей поддержки дат до 1900 года, дат с микросекундами.
References: #968
В диалекте sqlite отключена логика convert_unicode в String (и Unicode, UnicodeText и т.д.), чтобы соответствовать новому требованию pysqlite 2.5.0, согласно которому принимаются только юникодные объекты Python; https://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html
oracle¶
Oracle будет распознавать строковые операторы, содержащие комментарии перед SELECT, как операторы SELECT.
References: #1187
0.5.0rc1¶
Released: Thu Sep 11 2008orm¶
Query теперь имеет методы delete() и update(values). Это позволяет выполнять массовые удаления/обновления с помощью объекта Query.
Объект RowTuple, возвращаемый Query(*cols), теперь имеет ключевые имена, которые предпочитают имена сопоставленных атрибутов ключам столбцов, а ключи столбцов - именам столбцов, т.е. Query(Class.foo, Class.bar) будет иметь имена «foo» и «bar», даже если они не являются именами базовых объектов Column. Прямые объекты Column, такие как Query(table.c.col), вернут атрибут «ключ» Column.
В Query добавлены методы scalar() и value(), каждый из которых возвращает одно скалярное значение. scalar() не принимает аргументов и примерно эквивалентен first()[0], value() принимает выражение из одного столбца и примерно эквивалентен values(expr).next()[0].
Улучшено определение условия FROM при размещении SQL-выражений в списке сущностей query(). В частности, скалярные подзапросы не должны «сливать» свои внутренние объекты FROM во вложенный запрос.
Объединения по relation() от сопоставленного класса к сопоставленному подклассу, где сопоставленный подкласс настроен на наследование одной таблицы, будут включать предложение IN, которое ограничивает подтипы объединенного класса теми, которые запрашиваются в предложении ON объединения. Это относится как к соединениям с нетерпеливой загрузкой, так и к query.join(). Обратите внимание, что в некоторых сценариях предложение IN будет присутствовать и в предложении WHERE запроса, поскольку такая дискриминация имеет несколько точек срабатывания.
Расширение AttributeExtension было доработано таким образом, что событие срабатывает до того, как произойдет мутация. Кроме того, методы append() и set() теперь должны возвращать заданное значение, которое используется в качестве значения, применяемого в операции мутации. Это позволяет создавать проверяющие AttributeListeners, которые срабатывают до начала действия и могут изменить заданное значение на другое до его использования.
column_property(), composite_property() и relation() теперь принимают одно или список расширений AttributeExtensions, используя аргумент ключевого слова «extension».
query.order_by().get() молча удаляет «ORDER BY» из запроса, выданного GET, но не вызывает исключения.
Добавлено расширение Validator AttributeExtension, а также декоратор @validates, который используется аналогично @reconstructor и помечает метод как проверяющий один или несколько отображаемых атрибутов.
class.someprop.in_() вызывает ошибку NotImplementedError, ожидая реализации «in_» для отношения
References: #1140
Исправлено обновление первичного ключа для коллекций «многие-ко-многим», когда коллекция еще не была загружена
References: #1127
Исправлена ошибка, из-за которой при отложенной загрузке столбцов с группой в сочетании с не связанным с ней синонимом() возникала ошибка AttributeError.
Хук before_flush() в SessionExtension выполняется до того, как список new/dirty/deleted будет вычислен в последний раз, что позволяет процедурам внутри before_flush() дополнительно изменять состояние сессии перед выполнением операции flush.
References: #1128
Аргумент «extension» в Session и других командах теперь может опционально быть списком, что позволяет поддерживать события, отправляемые нескольким экземплярам SessionExtension. Session помещает SessionExtensions в Session.extensions.
Реентерабельные вызовы flush() приводят к ошибке. Это также служит элементарной, но не надежной проверкой от одновременных вызовов Session.flush().
Улучшено поведение query.join() при присоединении к подклассам наследования объединенных таблиц с использованием явных критериев присоединения (т.е. не на отношении).
@orm.attributes.reconstitute и MapperExtension.reconstitute были переименованы в @orm.reconstructor и MapperExtension.reconstruct_instance
Исправлен крючок @reconstructor для подклассов, наследующих от базового класса.
References: #1129
Тип свойства composite() теперь поддерживает метод __set_composite_values__() для класса composite, который необходим, если класс представляет состояние, используя имена атрибутов, отличные от ключевых имен столбцов; значения, сгенерированные по умолчанию, теперь корректно заполняются при промывке. Кроме того, композиты с атрибутами, установленными в None, корректно сравниваются.
References: #1132
Кортеж из 3 итераций, возвращаемый функцией attributes.get_history(), теперь может представлять собой смесь списков и кортежей. (Ранее члены всегда были списками).
Исправлена ошибка, при которой изменение атрибута первичного ключа в сущности, предыдущее значение которой было истекшим, приводило к ошибке при flush().
References: #1151
Исправлена ошибка пользовательского инструментария, при которой функция get_instance_dict() не вызывалась для вновь созданных экземпляров, не загруженных ORM.
Session.delete() добавляет данный объект в сессию, если он еще не присутствует в ней. Это была регрессионная ошибка из версии 0.4.
References: #1150
Флаг echo_uow для Session устарел, а протоколирование единиц работы теперь ведется только на уровне приложения, а не на уровне каждой сессии.
Удален конфликтующий оператор contains() из InstrumentedAttribute, который не принимал кваарг escape.
References: #1153
sql¶
Временно свернута работа над усовершенствованием «ORDER BY». Эта функция приостановлена в ожидании дальнейшей разработки.
References: #1068
Конструкция exists() не будет «экспортировать» содержащийся в ней список элементов в предложение FROM, что позволяет более эффективно использовать их в предложении columns в SELECT.
and_() и or_() теперь генерируют элемент ColumnElement, что позволяет использовать булевы выражения в качестве столбцов результатов, т.е. select([and_(1, 0)]).
References: #798
Параметрам привязки теперь присвоен подкласс ColumnElement, что позволяет выбирать их с помощью orm.query (они уже имели большинство семантик ColumnElement).
В конструкцию exists() добавлен метод select_from(), который становится все более совместимым с обычным select().
Добавлены func.min(), func.max(), func.sum() как «общие функции», что, по сути, позволяет автоматически определять их возвращаемый тип. Это помогает при работе с датами на SQLite, десятичными типами и т.д.
References: #1160
добавлен decimal.Decimal в качестве «автоопределяемого» типа; параметры привязки и общие функции будут устанавливать свой тип в Numeric, если используется Decimal.
schema¶
В MetaData добавлен аксессор «sorted_tables», который возвращает объекты Table, отсортированные в порядке зависимости, в виде списка. Это устаревает метод MetaData.table_iterator(). Ключевой аргумент «reverse=False» также удален из util.sort_tables(); для инвертирования результатов используйте функцию Python „reversed“.
References: #1033
Аргумент „length“ для всех типов Numeric был переименован в „scale“. „length“ является устаревшим и по-прежнему принимается с предупреждением.
Устранена совместимость с 0.3 для типов, определяемых пользователем (convert_result_value, convert_bind_param).
mysql¶
Аргумент „length“ для MSInteger, MSBigInteger, MSTinyInteger, MSSmallInteger и MSYear был переименован в „display_width“.
Добавлен тип MSMediumInteger.
References: #1146
функция func.utc_timestamp() компилируется в UTC_TIMESTAMP, без скобок, которые, видимо, мешают при использовании в сочетании с executemany().
oracle¶
limit/offset больше не использует ROW NUMBER OVER для ограничения строк, а вместо этого использует подзапросы в сочетании со специальным комментарием оптимизации Oracle. Позволяет LIMIT/OFFSET работать в сочетании с DISTINCT.
References: #536
has_sequence() теперь учитывает текущий аргумент «schema»
References: #1155
добавление BFILE в имена отражаемых типов
References: #1121
misc¶
Исправлена ошибка, из-за которой mapper не мог инициализироваться, если составной первичный ключ ссылался на другую таблицу, которая еще не была определена.
References: #1161
Исправлен выброс исключения, возникавший при использовании строкового условия primaryjoin в сочетании с backref.
0.5.0beta3¶
Released: Mon Aug 04 2008orm¶
Функция «entity_name» в мапперах SQLAlchemy была удалена. Обоснование см. на сайте https://tinyurl.com/6nm2ne.
флаг «autoexpire» для Session, sessionmaker() и scoped_session() был переименован в «expire_on_commit». Это не влияет на поведение функции rollback() при истечении срока действия.
исправлена ошибка бесконечного цикла, которая могла возникать при отложенной загрузке унаследованных атрибутов в маппере.
в Session добавлен поддерживающий наследие флаг «_enable_transaction_accounting», который при значении False отключает весь учет объектов на уровне транзакций, включая expire on rollback, expire on commit, ведение списка new/deleted и autoflush on begin.
Параметр „cascade“ в relation() принимает значение None, что эквивалентно отсутствию каскадов.
Критическое исправление динамических отношений позволяет правильно очищать историю «модифицированных» отношений после выполнения функции flush().
Определенные пользователем @свойства класса обнаруживаются и оставляются на месте при инициализации картографа. Это означает, что одноименный столбец, связанный с таблицей, не будет отображен, если на пути стоит @свойство (и столбец не переименован в другое имя), а также не будет применен инструментальный атрибут из унаследованного класса. Те же правила действуют и для имен, исключенных с помощью коллекций include_properties/exclude_properties.
Добавлен новый хук SessionExtension под названием after_attach(). Он вызывается в точке присоединения объектов через add(), add_all(), delete() и merge().
Картограф, наследующий от другого, при наследовании столбцов наследуемого картографа будет использовать любые переназначенные имена свойств, указанные в наследующем картографе. Ранее, если в «Base» свойство «base_id» было переназначено на имя «id», то «SubBase(Base)» все равно получал атрибут с именем «base_id». Это можно было бы обойти, явно указывая столбец и в каждом подмаппере, но это довольно непрактично, а также невозможно при использовании декларативного подхода.
References: #1111
Исправлена серия потенциальных ситуаций гонки в Session, когда асинхронный GC мог удалять из сессии немодифицированные элементы, на которые больше нет ссылок, если они присутствовали в списке обрабатываемых элементов, как правило, во время работы session.expunge_all() и зависимых методов.
Некоторые улучшения в механизме _CompileOnAttr, которые должны снизить вероятность появления предупреждений «Атрибут x не был заменен при компиляции». (это, как правило, относится к хакерам SQLA, например, разработчикам Elixir).
Исправлена ошибка, при которой FlushError «unsaved, pending instance», возникающая для сироты, не учитывала отображения суперклассов при формировании списка отношений, ответственных за ошибку.
sql¶
func.count() без аргументов отображается как COUNT(*), что эквивалентно func.count(text(„*“)).
простые имена меток в выражениях ORDER BY отображаются сами по себе, а не как переформулировка соответствующего выражения. В настоящее время эта возможность включена только для SQLite, MySQL и PostgreSQL. Она может быть включена для других диалектов, если будет показано, что каждый из них поддерживает такое поведение.
References: #1068
mysql¶
Котировка значений MSEnum для использования в CREATE TABLE теперь необязательна и будет приводиться по требованию. (Для использования в существующих таблицах цитирование всегда было необязательным).
References: #1110
misc¶
Атрибуты, связанные с классом, передаваемые в качестве аргументов в параметрах relation() remote_side и foreign_keys, теперь принимаются, что позволяет использовать их в декларативном режиме. Дополнительно исправлена ошибка, связанная с указанием order_by в качестве атрибута, связанного с классом, в сочетании с ускоренной загрузкой.
декларативная инициализация Columns скорректирована таким образом, что непереименованные колонки инициализируются так же, как и в не декларативном мэппере. Это позволяет унаследовавшему отображателю настраивать свои одноименные столбцы «id» таким образом, что родительский столбец «id» будет предпочтительнее дочернего столбца, что сократит количество обращений к базе данных при запросе этого значения.
0.5.0beta2¶
Released: Mon Jul 14 2008orm¶
Помимо атрибутов с истекшим сроком действия, отложенные атрибуты также загружаются, если их данные присутствуют в наборе результатов.
References: #870
session.refresh() выдает информативное сообщение об ошибке, если в списке атрибутов нет ни одного атрибута, основанного на колонках.
query() выдает информационное сообщение об ошибке, если не указаны столбцы или отображения.
Ленивые загрузчики теперь запускают autoflush перед началом работы. Это позволяет корректно работать функции expire() коллекции или скалярного отношения в контексте autoflush.
Атрибуты column_property(), представляющие SQL-выражения или столбцы, отсутствующие в сопоставленных таблицах (например, столбцы из представлений), после INSERT или UPDATE, если они не были локально изменены, автоматически теряют свою актуальность, так что при обращении к ним они обновляются самыми последними данными.
References: #887
Исправлены явные самореферентные соединения между двумя отображениями наследования объединенных таблиц при использовании query.join(cls, aliased=True).
References: #1082
Исправлено использование query.join() в сочетании с предложением «только столбцы» и предложением SQL-выражения ON в соединении.
Флаг «allow_column_override» из функции mapper() был удален. Этот флаг практически всегда понимается неправильно. Его специфическая функциональность доступна через аргументы маппера include_properties/exclude_properties.
Исправлен метод __str__() в Query.
References: #1066
Session.bind используется по умолчанию, даже если определены привязки к конкретным таблицам/мапперам.
sql¶
Добавлен новый оператор match(), выполняющий полнотекстовый поиск. Поддерживаются бэкенды PostgreSQL, SQLite, MySQL, MS-SQL и Oracle.
schema¶
Добавлена опция prefixes в Table, которая принимает список строк, вставляемых после CREATE в операторе CREATE TABLE.
References: #1075
Типы Unicode, UnicodeText теперь устанавливают «assert_unicode» и «convert_unicode» по умолчанию, но допускают переопределение **kwargs для этих значений.
extensions¶
Declarative поддерживает переменную класса __table_args__, которая представляет собой словарь или кортеж вида (arg1, arg2, …, {kwarg1:value, …}), содержащий позиционные + kw аргументы для передачи конструктору Table.
References: #1096
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 Date, DateTime и Time сейчас принимают только объекты Python datetime, а не строки. Если вы хотите самостоятельно форматировать даты как строки в SQLite, используйте тип String. Если вы хотите, чтобы они все равно возвращали объекты времени, несмотря на то, что принимают строки, сделайте TypeDecorator вокруг String - SQLA не поощряет такой шаблон.
0.5.0beta1¶
Released: Thu Jun 12 2008general¶
глобальное изменение «propigate»->»propagate».
orm¶
Функция polymorphic_union() учитывает «ключ» каждого столбца, если они отличаются от имени столбца.
Исправлена ошибка, связанная с тем, что только в версии 0.4 составные колонки не работали должным образом с наследуемыми картографами
References: #1199
Исправлена ошибка, связанная с RLock, в маппере, которая могла привести к тупику при вызове reentrant mapper compile(), что происходило при использовании декларативных конструкций внутри объектов ForeignKey. Перенесено из 0.5.
Исправлена ошибка в композитных типах, из-за которой композитный тип с первичным ключом не мог быть изменен.
References: #1213
Добавлен аксессуар ScopedSession.is_active.
References: #976
В качестве аргумента relation() order_by может быть использован связанный с классом аксессор.
References: #939
Исправлен аргумент shard_id в файле ShardedSession.execute().
References: #1072
sql¶
Connection.invalidate() проверяет наличие закрытого статуса, чтобы избежать ошибок атрибутов.
References: #1246
NullPool поддерживает поведение повторного подключения при сбое.
References: #1094
Кэш для каждого диалекта, используемый TypeEngine для кэширования специфических для диалекта типов, теперь представляет собой WeakKeyDictionary. Это позволяет избежать вечных ссылок на объекты диалекта в приложениях, создающих произвольно большое количество движков или диалектов. При этом наблюдается небольшое снижение производительности, которое будет устранено в версии 0.6.
References: #1299
Исправлены методы отражения SQLite таким образом, чтобы определялось отсутствие cursor.description, вызывающее автозакрытие курсора, и чтобы не возникало ошибки no results на последних версиях pysqlite, которые выдают ошибку при вызове fetchone() при отсутствии строк.
mysql¶
Исправлена ошибка в возникновении исключения при отсутствии FK-столбцов во время отражения.
References: #1241
oracle¶
Исправлена ошибка, из-за которой не принимались out-параметры определенных типов; большое спасибо huddlej at wwu.edu !
References: #1265
misc¶
Триггер/декоратор «__init__», добавленный mapper’ом, теперь пытается в точности повторять сигнатуру аргументов оригинального __init__. Передача „_sa_session“ больше не является неявной - вы должны разрешить этот ключевой аргумент в своем конструкторе.
ClassState переименован в ClassManager.
Классы могут предоставлять свой собственный InstrumentationManager, указывая свойство __sa_instrumentation_manager__.
Пользовательская инструментация может использовать любой механизм для связывания ClassManager с классом и InstanceState с экземпляром. Атрибуты этих объектов по-прежнему являются механизмом ассоциации по умолчанию, используемым штатной инструментацией SQLAlchemy.
Перемещены значения entity_name, _sa_session_id и _instance_key из объекта экземпляра в состояние экземпляра. Эти значения по-прежнему доступны старым, уже устаревшим способом - с помощью дескрипторов, прикрепленных к классу. При обращении к ним будет выдано предупреждение об устаревании.
Псевдоним _prepare_instrumentation для prepare_instrumentation был удален.
sqlalchemy.exceptions был переименован в sqlalchemy.exc. Модуль может быть импортирован под любым из этих имен.
Исключения, связанные с ORM, теперь определяются в sqlalchemy.orm.exc. Псевдонимы совместимости ConcurrentModificationError, FlushError и UnmappedColumnError устанавливаются в sqlalchemy.exc во время импорта sqlalchemy.orm.
sqlalchemy.logging был переименован в sqlalchemy.log.
Переходный псевдоним sqlalchemy.log.SADeprecationWarning для определения предупреждения в sqlalchemy.exc был удален.
exc.AssertionError был удален и заменен на встроенный в Python AssertionError.
Изменено поведение расширений MapperExtensions, привязанных к нескольким, имя_существа=первичным отображателям для одного класса. Первый mapper(), определенный для класса, является единственным mapper, имеющим право на получение событий MapperExtension „instrument_class“, „init_instance“ и „init_failed“. Это обратная несовместимость; ранее эти события получали расширения последнего определенного отображателя.
Добавлена поддержка возврата значений при вставках (только для версии 2.0+), обновлениях и удалениях (только для версии 2.1+).
В Postgres добавлена поддержка отражения индексов с использованием замечательного патча, которым мы долго пренебрегали, представленного Кеном Кулманом (Ken Kuhlman).
References: #714