0.1 Changelog¶
0.1.7¶
Released: Fri May 05 2006некоторые исправления в алгоритме топологической сортировки
В Postgres добавлена поддержка DISTINCT ON (достаточно указать distinct=[col1,col2…])
добавлено __mod__ (оператор %) в sql-выражения
Свойство mapper «order_by», унаследованное от наследующего mapper
Исправление типа столбца, используемого при обновлении/удалении в mapper
с convert_unicode=True, отражение происходило с ошибкой, исправлено
types types types! все равно не работает…. приходится снова использовать TypeDecorator :(
Двоичный тип mysql преобразует вывод массива в буфер, исправление PickleType
Раз и навсегда исправлена утечка памяти в attributes.py
Унитесты квалифицируются на основе баз данных, которые поддерживают каждый из них
Исправлена ошибка, при которой значения столбцов по умолчанию приводили к потере предложения VALUES в объектах вставки
Исправлена ошибка, при которой определение таблицы с именем схемы приводило к принудительному подключению к движку
исправление корректной работы круглых скобок с подзапросами в INSERT/UPDATE
HistoryArraySet получает метод extend()
Исправлена поддержка lazyload для других операторов сравнения, кроме =
Исправление ленивой загрузки, когда два сравнения в условии объединения указывали на один и тот же столбец
добавлен флаг «construct_new» в маппер, который будет использовать __new__ для создания экземпляров вместо __init__ (стандарт в 0.2)
Добавил selectresults.py в SVN, пропустив его в прошлый раз
настройка, позволяющая создавать отношения «многие-ко-многим» от таблицы к самой себе через ассоциативную таблицу
Небольшое исправление функции «translate_row», используемой в полиморфном примере
create_engine использует cgi.parse_qsl для чтения строки запроса (в 0.2 это уже не работает)
изменения в операторе CAST
исправлены имена функций LOCAL_TIME/LOCAL_TIMESTAMP -> LOCALTIME/LOCALTIMESTAMP
исправлен порядок ORDER BY/HAVING при компиляции
0.1.6¶
Released: Wed Apr 12 2006добавлена поддержка MS-SQL, любезно предоставленная Риком Моррисоном, Рунаром Петурссоном
последний SQLSoup от Дж. Эллиса
В ActiveMapper появилась предварительная поддержка наследования (Джефф Уоткинс)
добавлена система «модов», позволяющая подключать модули, изменяющие/дополняющие основную функциональность, с помощью функции «install_mods(*modnames)».
добавлен первый «мод», SelectResults, который модифицирует селекты маппера для возврата генераторов, превращающих диапазоны в запросы LIMIT/OFFSET (Jonas Borgstr?
Вынесены возможности запросов к Mapper в отдельный объект Query, ориентированный на сессию. Это повышает производительность mapper.using(session) и делает возможным другие действия.
рефакторинг objectstore/Session, официальным способом сохранения объектов теперь является метод flush(). Функциональность begin/commit из Session перенесена в LegacySession, которая до выхода версии 0.2 остается поведением по умолчанию.
Система типов привязывается к движку во время компиляции запроса, а не во время построения схемы. Это упрощает как систему типов, так и ProxyEngine.
В mapper добавлен ключевой аргумент „version_id“. Этот ключевой аргумент должен ссылаться на объект Column с типом Integer, желательно non-nullable, который будет использоваться в сопоставленной таблице для отслеживания номеров версий. Этот номер увеличивается при каждой операции сохранения и указывается в условиях UPDATE/DELETE, чтобы он учитывался в возвращаемом количестве строк, что приводит к ошибке ConcurrencyError, если полученное значение не соответствует ожидаемому количеству.
Теперь mapper ассоциируется с классом через объект class, а также необязательный параметр entity_name, который представляет собой строку, по умолчанию равную None. Для класса может быть создано любое количество первичных mappers, квалифицированных по имени сущности. Экземпляры этих классов будут выполнять все свои операции загрузки и сохранения через mapper, квалифицированный по имени сущности, и поддерживать отдельную идентификацию в identity map для эквивалентного объекта.
Пересмотрена система атрибутов. Уточнен код, а также исправлена поддержка корректного полиморфного поведения атрибутов объектов.
добавлен флаг «for_update» для объектов Select
некоторые исправления в обратных ссылках
исправление для типа DateTime в postgres1
страницы документации в основном перешли на синтаксис Markdown
0.1.5¶
Released: Mon Mar 27 2006В SQLEngine добавлена концепция SQLSession. Этот объект отслеживает получение соединения из пула соединений, а также текущую транзакцию. В SQLEngine добавлены методы push_session() и pop_session(), которые проталкивают/запускают новую SQLSession на движок, позволяя работать со вторым соединением, «вложенным» в предыдущее, что позволяет выполнять вложенные транзакции. В дальнейшем будут добавлены и другие трюки, связанные с SQLSession.
добавлен аргумент nest_on в objectstore.Session. Это один SQLEngine или список движков, для которых push_session()/pop_session() будет вызываться каждый раз, когда эта сессия становится активной (через objectstore.push_session() или эквивалентно). Это позволяет использовать преимущества вложенных транзакций в сессиях без явного вызова push_session/pop_session на движке.
разделение objectstore/unitofwork на части, чтобы отделить «сортировку сессий» от «тяжелой работы по фиксации uow»
добавлен метод populate_instance() в MapperExtension. позволяет расширению изменять популяцию атрибутов объектов. этот метод может вызывать метод populate_instance() на другом маппере для передачи популяции атрибутов от одного маппера к другому; для этого также встроена логика перевода строк.
исправлен флаг Oracle8-совместимости «use_ansi», который преобразует JOINы в сравнения с операторами = и (+), проходит основные unittests
исправления в поддержке Oracle LIMIT/OFFSET
Oracle reflection использует представления ALL_** вместо USER_** для получения большего списка объектов для отражения
исправления в отражении внешних ключей Oracle
References: #105
objectstore.commit(obj1, obj2,…) добавляет дополнительный шаг для поиска частных отношений в свойствах и удаления дочерних объектов, хотя это и не глобальная фиксация
Исправлены многие и многие ошибки в мапперах, использующих наследование, усилена концепция того, что отношения на маппере создаются к «локальной» таблице этого маппера, а не к таблицам, которые он наследует. позволяет более сложным композиционным паттернам работать с ленивой/медленной загрузкой.
добавлена поддержка наследования мапперов от других на основе одной и той же таблицы, достаточно указать ту же таблицу, что и у родительского/дочернего маппера.
незначительные улучшения скорости работы системы атрибутов при инстанцировании и заполнении новых объектов.
исправлен бинарный модульный тест MySQL
INSERT может принимать в качестве аргументов VALUES элементы клаузы, а не только литеральные значения
поддержка вызова многотоковых функций, т.е. schema.mypkg.func()
В пакет расширений добавлен модуль SQLSoup Дж. Эллиса
добавлены «полиморфные» примеры, иллюстрирующие методы загрузки нескольких типов объектов из одного маппера, во втором из которых используется новый метод populate_instance(). небольшие улучшения в маппере, конструкция UNION для облегчения работы с примерами
улучшения/исправления в работе session.refresh()/session.expire() (которая ранее могла называться «invalidate»…)
добавлена функция session.expunge(), которая полностью удаляет объект из текущей сессии
добавлена передача *args, **kwargs в engine.transaction(func), что позволяет проще создавать транзакционные функции-декораторы
добавлен интерфейс итератора для ResultProxy: «for row in result:…»
добавлено утверждение tx = session.begin(); tx.rollback(); tx.begin(), т.е. его нельзя использовать после rollback()
в SQLite добавлено преобразование даты в параметре bind, позволяющее работать с pysqlite1
усовершенствования в подзапросах для более интеллектуального построения предложений FROM
References: #116
добавлена функция PickleType в типы.
Исправлены две ошибки с метками столбцов в отношении параметров привязки: ключевые имена параметров привязки теперь генерируются из столбца «label» во всех соответствующих случаях, чтобы воспользоваться правилами избыточной длины имен, и добавлена проверка на своеобразную коллизию со столбцом, названным так же, как «tablename_colname».
капитальный ремонт рабочей документации, других разделов документации.
Исправлена ошибка с атрибутами, когда при фиксации объекта его список ленивой загрузки сдувался, если он не был загружен
добавлен метод unique_connection() в движок, пул соединений для возврата соединения, которое не является частью потоково-локального контекста или какой-либо текущей транзакции
Добавлена функция invalidate() для пула соединений. Она удаляет соединение из пула. Однако все еще требуется доработка движков для автоматического переподключения к устаревшей БД.
Добавлена функция distinct() для элементов столбцов, чтобы можно было выполнять func.count(mycol.distinct())
добавлен флаг «always_refresh» для Mapper, создающий маппер, который будет всегда обновлять атрибуты объектов, получаемых/выбираемых из БД, перезаписывая все сделанные изменения.
0.1.4¶
Released: Mon Mar 13 2006create_engine() теперь использует обобщенные параметры: host/hostname, db/dbname/database, password/passwd и т.д. для всех подключений к движку. это делает URI движка более «универсальными».
добавлена поддержка операторов SELECT, встроенных в предложение column, с использованием флага «scalar=True».
Очередная доработка EagerLoading при использовании в связке с наследованными мэпперами; улучшена корректная работа eager load с aliased-запросами, также отношения, установленные на мэппер с наследованными мэпперами, будут создавать соединения с таблицей, характерной для самого мэппера (т.е. не с таблицами, которые наследуются/находятся дальше по цепочке наследования), это можно отменить, используя пользовательские первичные/вторичные соединения.
В mapper.py добавлен патч J.Ellis, в соответствии с которым selectone() выбрасывает исключение, если запрос возвращает более одной строки объектов, selectfirst() не выбрасывает исключение. также добавлены selectfirst_by (синоним get_by) и selectone_by
Добавлен параметр onupdate для Column, который будет выполнять SQL/python при обновлении. Также добавлен параметр «for_update=True» во все подклассы DefaultGenerator
добавлена поддержка отражения таблиц Oracle, предоставленная Андреем Заричем; еще предстоит решить некоторые проблемы, связанные с составными первичными ключами/выбором словаря
проверен начальный модуль Firebird, ожидающий тестирования.
добавлен объект словаря sql.ClauseParameters в качестве результата для compiled.get_params(), выполняющий позднюю типовую обработку параметров связывания, чтобы исходные значения были более доступны
больше документации по индексам, значениям столбцов по умолчанию, объединению соединений, построению движков
Пересмотр построения системы типов. Используется более простая схема наследования, так что любой из общих типов может быть легко подклассифицирован, без использования TypeDecorator.
В SQLEngine добавлен параметр «convert_unicode=False», который заставляет все типы String выполнять кодирование/декодирование в Unicode (заставляет строки вести себя как Unicodes)
В движок добавлен параметр „encoding=»utf8»“. Указанная кодировка будет использоваться для всех вызовов кодирования/декодирования внутри типов Unicode, а также строк при convert_unicode=True.
Улучшена поддержка отображения на UNION, добавлен пример polymorph.py, иллюстрирующий отображение нескольких классов на UNION
исправление синтаксиса LIMIT/OFFSET в SQLite
исправление синтаксиса Oracle LIMIT
добавлена функция backref(), позволяющая обратным ссылкам иметь аргументы в виде ключевых слов, которые будут передаваться обратным ссылкам.
Последовательности и объекты ColumnDefault могут выполнять execute()/scalar() автономно
SQL-функции (например, func.foo()) могут выполнять execute()/scalar() автономно
исправление функций SQL таким образом, чтобы в стандартных функциях ANSI, т.е. current_timestamp и т.д., не указывались круглые скобки. во всех остальных функциях они указываются.
В SmartProperty добавлены settattr_clean и append_clean, которые устанавливают атрибуты, не вызывая события «dirty» или какой-либо истории. используется как: myclass.prop1.setattr_clean(myobject, „hi“)
Улучшена поддержка умолчаний столбцов при использовании мапперами; мапперы будут извлекать предварительно выполненные умолчания из выполненных параметров привязки оператора (до преобразования), чтобы заполнить ими атрибуты сохраненного объекта; если сработали какие-либо PassiveDefaults, то вместо этого будет выполняться пост-выборка строки из БД, чтобы заполнить объект.
в хранилище объектов добавлен метод „get_session().invalidate(*obj)“, экземпляры будут сами обновляться() при следующем обращении к атрибуту.
Улучшения в вызовах SQL func, включая ключевой аргумент «engine», чтобы они могли быть execute()d или scalar()ed автономно, также добавлен аксессор func для SQLEngine
исправление для пользовательских движков таблиц MySQL4, т.е. TYPE вместо ENGINE
Несколько расширенное протоколирование, включающее временные метки и несколько настраиваемую систему форматирования, вместо полноценной системы протоколирования
улучшения в классе ActiveMapper от группы TG, включая отношения «многие-ко-многим
В mysql добавлена поддержка Double и TinyInt
0.1.3¶
Released: Thu Mar 02 2006Дополненная функция «post_update» добавляет второй оператор обновления перед вставками и после удалений для согласования отношений без создания зависимостей; используется при сохранении двух строк, зависящих друг от друга
Доработана функция mapper.using(session), локализована функциональность сессий для каждого объекта; объекты могут быть объявлены и управляться как локальные для любой пользовательской сессии
Исправление предложения Oracle «row_number over» при работе с несколькими таблицами
mapper.get() не выбирал объекты с несколькими ключами, если таблица маппера представляла собой объединение, например, в отношениях наследования; это исправлено.
Пересмотр пакетов sql/schema таким образом, чтобы пакет sql мог работать самостоятельно, производя селекты, вставки и т.д. без каких-либо зависимостей от движка. построен на новых лексических объектах TableClause/ColumnClause. Объекты Table/Column в Schema являются их «физическими» подклассами. упрощает отношения schema/sql, расширения (например, proxyengine) и значительно повышает общую производительность. удаляет все поведение getattr(), которое было характерно для 0.1.1.
Рефакторинг того, как маппер «синхронизирует» данные между двумя объектами в отдельный модуль, лучше работает со свойствами, прикрепленными к мапперу, который имеет дополнительные отношения наследования с одной из связанных таблиц, также та же методология, которая используется для синхронизации родительских/дочерних объектов, теперь используется маппером для синхронизации между наследуемыми и наследующими мапперами.
Сделана более агрессивной функция objectstore «check for out-of-identitymap», проверка будет выполняться при изменении атрибутов объекта или его удалении
Объект Index полностью реализован, может быть построен как самостоятельно, так и с помощью аргументов «index» и «unique» в Columns.
добавлен флаг «convert_unicode» в SQLEngine, который будет рассматривать все типы String/CHAR как типы Unicode, с трансляцией raw-byte/utf-8 на стороне параметра связывания и набора результатов.
postgres ведет список ANSI-функций, которые не должны содержать круглых скобок, поэтому вызовы функций без аргументов работают последовательно
Таблицы могут быть созданы без указания движка. В этом случае их движком по умолчанию будет скопированный в модуль «движок по умолчанию», который является ProxyEngine. Этот движок может быть подключен с помощью функции «global_connect».
добавлен метод «refresh(*obj)» в objectstore / Session для безусловной перезагрузки атрибутов любого набора объектов из базы данных
0.1.2¶
Released: Fri Feb 24 2006Исправлен рекурсивный вызов в schema, который почему-то выполнялся 994 раза, а затем возвращался нормально. ничего не сломалось, все замедлилось. спасибо jpellerin за находку.
0.1.1¶
Released: Thu Feb 23 2006небольшое исправление в классе Function, чтобы выражения с func.foo() использовали тип объекта Function (т.е. левую часть) в качестве типа булевого выражения, а не другую сторону, которая является более подвижной целью (changeset 1020).
создание самоссылающихся мапперов с обратными ссылками стало немного проще (но все еще не так просто - changeset 1019)
исправления в отображениях «один к одному» (changeset 1015)
psycopg1 исправлена проблема с датой/временем в None (changeset 1005)
две проблемы, связанные с postgres, который не хочет давать вам «lastrowid», поскольку oids устарели:
Умолчания со стороны базы данных postgres, относящиеся к столбцам первичного ключа, должны выполняться явно заранее, хотя это и не является идеей PassiveDefault. Это происходит потому, что последовательности на столбцах отражаются как PassiveDefault, но должны быть явно выполнены на столбце первичного ключа, чтобы мы знали, что мы только что вставили.
Если вы добавили строку с кучей умолчаний на стороне базы данных, а PassiveDefault работает по-старому, т.е. просто выполняется на стороне БД, то возникшее исключение «невозможно получить строку обратно без OID» также не произойдет, пока кто-то (обычно ORM) явно не попросит об этом.
исправлена ошибка в engine.execute_compiled, когда он создавал второй ResultProxy, который просто выбрасывался.
Теперь можно сказать myclass.attr.property, что даст вам PropertyLoader, соответствующий этому атрибуту, т.е. myclass.mapper.props[„attr“].
Теперь можно создавать более сложные цепочки ускоренных загрузок, не прибегая к явным инструкциям типа «use aliases». Код EagerLoader также стал намного проще.
Новый, несколько экспериментальный флаг «use_update», добавленный к отношениям, указывает, что данное отношение должно обрабатываться вторым оператором UPDATE, либо после первичного INSERT, либо перед первичным DELETE. Работает с круговыми зависимостями строк.
добавлен модуль exceptions, все поднимаемые исключения (за исключением некоторых исключений KeyError/AttributeError) происходят из этих классов.
исправление типов дат в MySQL, возвращаемая timedelta преобразуется в datetime.time
Двухфазные операции objectstore.commit (т.е. begin/commit) теперь возвращают транзакционный объект (SessionTrans), чтобы более четко обозначить границы транзакций.
В схему добавлен индексный объект с поддержкой создания/удаления
исправление в postgres, при котором он будет явно предварительно выполнять PassiveDefault для таблицы, если это столбец с первичным ключом, в соответствии с текущей проблемой «мы не можем получить вставленные строки обратно из postgres».
изменение в запросе information_schema, который возвращает defs таблиц postgres, теперь используется явное ключевое слово JOIN, так как один пользователь получил более высокую производительность в 8.1
исправление в engine.process_defaults, чтобы он корректно работал с таблицей, имеющей разные имена столбцов/ключи столбцов (changeset 982)
столбец может быть привязан только к одной таблице - теперь это утверждается
Типы времени postgres происходят от типа Time
исправление в alltests, чтобы он запускал тест типов (теперь он называется testtypes)
исправление объекта Join, чтобы он корректно экспортировал свои внешние ключи (cs 973)
создание отношений с картографами, использующими фиксированное наследование (cs 973)