0.2 Changelog¶
0.2.8¶
Released: Tue Sep 05 2006очистка методов подключения + документация. пользовательские аргументы DBAPI, указанные в строке запроса, аргумент „connect_args“ в „create_engine“, или пользовательская функция создания через функцию „creator“ в „create_engine“.
добавлен аргумент «recycle» для Pool, это «pool_recycle» в create_engine, по умолчанию 3600 секунд; соединения по истечении этого времени будут закрыты и заменены на новые, для работы с базами данных, которые автоматически закрывают устаревшие соединения
References: #274
изменена семантика «invalidate» для пула соединений; при следующем вызове будет дано указание базовой записи соединения переподключиться. «invalidate» также будет автоматически вызываться при возникновении ошибки в базовом вызове connection.cursor(). Это, надеюсь, позволит пулу соединений повторно подключаться к базе данных, которая была остановлена и запущена, без перезапуска подключающегося приложения.
References: #121
Ишь ты ! Туториал доктест был сломан довольно долгое время.
Метод add_property() на маппере делает шаг «компиляции всех мапперов» в случае, если данное свойство ссылается на некомпилируемый маппер (как это было в случае с учебником !)
проверка наличия уже существующей последовательности pg перед созданием
References: #277
Если контекстная сессия установлена через MapperExtension.get_session (как это происходит при использовании плагина sessioncontext и т.д.), то операция ленивой загрузки будет использовать эту сессию по умолчанию, если родительский объект не персистентен с уже установленной сессией.
Ленивая загрузка не сработает для объекта, не имеющего идентификатора базы данных (почему? см. https://www.sqlalchemy.org/trac/wiki/WhyDontForeignKeysLoadData)
В unit-of-work улучшена проверка «осиротевших» объектов, являющихся частью каскада «delete-orphan», для определенных условий, когда родитель недоступен для каскадирования.
Картографы могут определить, является ли один из их объектов «сиротой», на основании взаимодействия с пакетом атрибутов. Эта проверка основана на флаге состояния, который поддерживается для каждого отношения, когда объекты присоединяются и отсоединяются друг от друга.
теперь недействительно объявлять самореферентные отношения с «delete-orphan» (так как вышеупомянутая проверка сделает их невозможными для сохранения)
улучшена проверка на принадлежность объектов к сеансу, когда блок работы пытается их прошить() как часть отношения…
Выполнение операторов поддерживает использование одного и того же объекта BindParam более одного раза в выражении; упрощена работа с позиционными параметрами. Отличная работа Билла Нуна по раскрытию основной идеи.
References: #280
Отражение postgres перешло на использование таблиц pg_schema, что может быть переопределено аргументом use_information_schema=True в create_engine.
добавлен аргумент case_sensitive в MetaData, Table, Column, который автоматически определяется в зависимости от того, имеет ли родительский элемент схемы значение флага не None, а если нет, то является ли имя идентификатора полностью строчным или нет. при значении True кавычки применяются к идентификаторам со смешанными или прописными идентификаторами. Кавычки также автоматически применяются во всех случаях к идентификаторам, которые, как известно, являются зарезервированными словами или содержат другие нестандартные символы. различные диалекты баз данных могут переопределить все это поведение, но в настоящее время все они используют поведение по умолчанию. протестировано на postgres, mysql, sqlite, oracle. требуется дополнительное тестирование на firebird, ms-sql. часть текущей работы с
References: #155
Обновлены модульные тесты для работы без установленного pysqlite; тест пула использует имитацию DBAPI
Урлы поддерживают экранированные символы в паролях
References: #281
добавлены ограничения/смещения для UNION-запросов (хотя в oracle их пока нет)
В типы DateTime и Time добавлен флаг «timezone=True». Пока postgres преобразует его в «TIME[STAMP] (WITH|WITHOUT) TIME ZONE», чтобы контроль над наличием часового пояса был более управляемым (psycopg2 возвращает даты с tzinfo, если они доступны, что может создавать путаницу с датами, которые их не имеют).
Исправление использования query.count() с distinct, **kwargs с SelectResults count()
References: #287
исключение таблицы из метаданных при неудачной автозагрузке;
References: #289
импорт py2.5s sqlite3
References: #293
Исправление юникода для startswith()/endswith()
References: #296
0.2.7¶
Released: Sat Aug 12 2006средства цитирования настроены таким образом, что для отдельных идентификаторов таблиц, схем и столбцов, используемых во всех запросах/созданиях/выгрузках, может быть включено цитирование, характерное для конкретной базы данных. Включается через «quote=True» в таблице или столбце, а также «quote_schema=True» в таблице. Спасибо Аарону Спайку за отличную работу.
assignmapper устанавливал is_primary=True, что приводило к всевозможным казусам и не приводило к ошибке при установке избыточных картографов, исправлено
В Mapper добавлена опция allow_null_pks, позволяющая создавать строки, в которых некоторые столбцы первичного ключа равны null (т.е. при сопоставлении с внешними объединениями и т.д.)
Модификация unitofwork, позволяющая не поддерживать порядок в списке «new» или в списке «objects» UOWTask; вместо этого новые объекты помечаются идентификатором порядка, когда они регистрируются как новые в сессии, а затем INSERT-операторы сортируются в mapper save_obj. Упорядочение INSERT, по сути, перенесено в конец цикла flush. Таким образом, различные сортировки и организации, возникающие в UOWTask (в частности, сортировка круговых задач), не должны заботиться о поддержании порядка (чего они и так не делали).
исправлено отражение внешних ключей для автозагрузки ссылающейся таблицы, если она еще не была загружена
передавать аргументы строки запроса URL в функцию connect()
References: #256
oracle boolean type
References: #257
Пользовательские условия первичного/вторичного соединения в отношении по умолчанию будут распространяться на backref. Указание backref() отменяет это поведение.
улучшена проверка неоднозначных условий присоединения в sql.Join; распространяется на лучшее сообщение об ошибке в PropertyLoader (т.е. relation()/backref()) для случаев, когда условие присоединения не может быть разумно определено.
sqlite корректно создает объекты ForeignKeyConstraint при отражении таблицы.
корректировки пула, связанные с изменениями, внесенными для. счетчик переполнения должен уменьшаться только в том случае, если соединение действительно удалось. добавлен тестовый скрипт для проверки этого.
References: #224
исправлено отражение в mysql значений по умолчанию на PassiveDefault
добавлены отраженные типы „tinyint“, „mediumint“ в MS-SQL.
SingletonThreadPool имеет определенный размер и выполняет очистку, так что остается только заданное количество соединений, локализованных в потоке (необходимо для sqlite-приложений, которые массово избавляются от потоков)
Исправлена небольшая ошибка(и) с ленивыми загрузчиками
Исправлена возможная ошибка в отражении mysql, когда некоторые версии возвращали массив вместо строки для вызова SHOW CREATE TABLE
Исправление ленивой загрузки при отображении на джойны
References: #1770
Все вызовы create()/drop() имеют ключевой аргумент «connectable». «engine» является устаревшим.
Исправлена функция ms-sql connect() для работы с adodbapi
добавлен флаг «nowait» в Select()
Проверка наследования использует issubclass() вместо прямой проверки __mro__, чтобы убедиться, что класс A наследует от B, что позволяет более гибко согласовывать наследование мапперов с наследованием классов
References: #271
SelectResults будет использовать подвыборку при вызове агрегата (т.е. max, min и т.д.) на SelectResults, содержащем предложение ORDER BY
References: #252
Исправления в типах, чтобы легче было использовать типы, специфичные для базы данных; исправления в текстовых типах mysql для работы с этой методологией
References: #269
некоторые исправления в организации типа даты в sqlite
добавление MSTinyInteger в MS-SQL
References: #263
0.2.6¶
Released: Thu Jul 20 2006большая переработка схемы, позволяющая использовать действительно составные ограничения по первичному и внешнему ключу, с помощью новых объектов ForeignKeyConstraint и PrimaryKeyConstraint. Существующие методы создания первичных/иностранных ключей не изменились, но используют эти новые объекты за сценой. Создание и отражение таблиц теперь больше ориентировано на таблицы, а не на столбцы.
References: #76
изменена схема вызова MapperExtension, ранее она работала не очень хорошо
доработки в ActiveMapper, поддержка самореферентных отношений
Небольшая перестановка в хранилище объектов (в activemapper/threadlocal), чтобы на SessionContext ссылались по „.context“, а не подклассифицировали напрямую.
activemapper будет использовать хранилище объектов threadlocal, если мод активирован при импорте activemapper
Небольшое исправление в URL regexp для разрешения имен файлов с „@“ в них
исправления в Session expunge/update/etc… нуждается в дополнительной очистке.
Мапперы select_table по-прежнему не всегда компилировались
исправлен тип данных Boolean
добавлены count()/count_by() в список методов, проксируемых assignmapper; это также добавляет их в activemapper
исключения подключения, обернутые в DBAPIError
ActiveMapper теперь поддерживает автозагрузку определений колонок из базы данных, если во внутреннем классе отображения указать атрибут __autoload__ = True. В настоящее время это не поддерживает отражение каких-либо отношений.
Отложенная загрузка колонок при некоторых обстоятельствах могла испортить статус соединения в flush(), это исправлено
expunge() не работал с каскадом, исправлено.
Исправлен возможный бесконечный цикл при выполнении каскадных операций.
добавлена функция «synonym()», применяемая к свойствам, имя которых совпадает с именем другого свойства, для переопределения реквизитов и обеспечения доступности исходного имени реквизита в select_by().
Исправление типизации при построении клаузы, которое, в частности, помогает решить проблемы с типами при использовании polymorphic_union (CAST/ColumnClause распространяет свой тип на прокси-столбцы)
Продолжается работа над компиляцией мапперов, когда-нибудь она будет работать…. перенесена инициализация объектов MapperProperty на время после создания всех мапперов для лучшей обработки циклических компиляций. теперь метод do_init() вызывается для всех свойств, которые более осведомлены о своем «унаследованном» статусе, если это так.
явный запрет на увеличение нагрузки на самореферентные отношения или отношения с наследующим картографом (который также является самореферентным)
уменьшен размер bind param в query._get, чтобы успокоить придирчивого оракула
References: #244
добавлен аргумент „checkfirst“ в table.create()/table.drop(), а также в table.exists()
References: #234
некоторые другие текущие исправления наследования
References: #245
атрибуты/обратные ссылки/орфаны/отслеживание истории, как обычно…
0.2.5¶
Released: Sat Jul 08 2006Исправлена ошибка бесконечного цикла в select_by(), если при обходе попадались два картографа, которые ссылались друг на друга
Модернизированы все unittests для вставки „./lib/“ в sys.path, что позволяет обойти новое поведение setuptools, убивающее PYTHONPATH
дальнейшие исправления с помощью attributes/dependencies/etc….
Улучшена обработка ошибок, когда DynamicMetaData не подключена
Поддержка MS-SQL в основном работает (проверено с помощью pymssql)
упорядочивание операторов UPDATE и DELETE внутри групп теперь осуществляется в порядке возрастания значений первичных ключей, что обеспечивает более детерминированное упорядочивание
Расширения маппера after_insert/delete/update теперь вызываются для каждого объекта, а не для каждого объекта и таблицы
дополнительные исправления/рефакторинги в компиляции мапперов
0.2.4¶
Released: Tue Jun 27 2006try/except, когда mapper устанавливает init.__name__ для сопоставленного класса, поддерживает python 2.3
Исправлена ошибка, при которой потоково-локальный движок выполнял автокоммит, несмотря на выполняющуюся транзакцию
Операции lazy load и deferred load требуют, чтобы родительский объект находился в сессии; если раньше операция просто возвращала пустой список или None, то теперь она вызывает исключение.
Session.update() немного мягче, если сессия, к которой ранее был прикреплен данный объект, была собрана; в противном случае все равно требуется явное удаление экземпляра из предыдущей сессии.
исправления в компиляции маппера, проверка большего количества условий ошибок
Небольшое исправление нетерпеливой загрузки в сочетании с упорядочиванием/ограничением/смещением
совершенно замечательно: добавлен одинарный пробел между „CREATE TABLE“ и „(<остальное>“, поскольку так MySQL обозначает не зарезервированное слово tablename…...
References: #206
больше исправлений в наследовании, связанных с отношениями «многие-ко-многим» и корректным сохранением
Исправлена ошибка при указании явного модуля для диалекта mysql
когда QueuePool завершает работу, он выдает ошибку TimeoutError вместо ошибочного установления нового соединения
Использование Queue.Queue в пуле заменено на локально модифицированную версию (работает в py2.3/2.4!), использующую threading.RLock для мьютекса. Это сделано для исправления зафиксированного случая, когда метод ConnectionFairy’s __del__() вызывался внутри метода Queue’s get(), который затем возвращал свое соединение с Queue через метод put(), вызывая реентерабельное зависание, если не использовать threading.RLock.
postgres не будет помещать ключевое слово SERIAL в столбец первичного ключа, если он имеет ограничение внешнего ключа
Метод cursor() в ConnectionFairy позволяет распространять специфические для db аргументы расширения
References: #221
Параметры привязки при ленивой загрузке правильно распространяют тип столбца
References: #225
новые типы MySQL: MSEnum, MSTinyText, MSMediumText, MSLongText и т.д. Больше поддержки специфических для MS параметров длины/точности в числовых типах, исправление любезно предоставлено Майком Бернсоном
некоторые исправления в функции invalidate() пула соединений
References: #224
0.2.3¶
Released: Sat Jun 17 2006изменена отложенная компиляция отображений. Это позволяет строить отображения в любом порядке, а их связи друг с другом компилировать при первом использовании отображений.
Исправлено довольно сильное снижение скорости в поведении каскадов, особенно когда использовались обратные ссылки
Полностью переписан модуль инструментария атрибутов, он стал намного проще и понятнее, немного быстрее. «История» атрибута больше не обрабатывается при каждом изменении, а является частью объекта «CommittedState», создаваемого при первой загрузке экземпляра. HistoryArraySet исчез, поведение списочных атрибутов стало более открытым (т.е. они больше не являются наборами).
В py2.4 конструкция «set» используется внутренне, возвращаясь к sets.Set, когда «set» недоступен или требуется упорядочивание.
Исправление управления транзакциями, чтобы повторные вызовы rollback() не приводили к сбоям (они приводили к тому, что flush() вызывал исключение в большом блоке транзакций try/except)
Аргумент «foreignkey» в relation() также может быть списком. Исправлено определение автоиностранного ключа
References: #151
исправлена ошибка, из-за которой таблицы с именами схем не индексировались в объекте MetaData должным образом
исправлена ошибка, из-за которой в ResultProxy не происходило преобразование типа колонки с переопределенным свойством «key»
References: #207
исправлен атрибут „port“ в URL на целое число, если он присутствует
Исправлена старая ошибка, когда в таблице «многие-ко-многим», отображаемой как «вторичная», имелись дополнительные столбцы, операции удаления не выполнялись
Исправление ошибок при сопоставлении с UNION-запросами
исправлен некорректный выброс класса исключения при отсутствии драйвера БД
добавлено исключение NonExistentTable, возникающее при отражении несуществующей таблицы
References: #138
Небольшое исправление в ActiveMapper относительно обратных ссылок «один к одному», другие рефакторинги
переопределенный конструктор в отображаемых классах получает __name__ и __doc__ из исходного класса
Исправлена небольшая ошибка в файле selectresult.py, касающаяся расширения mapper
References: #200
небольшая доработка cascade_mappers, не очень сильно поддерживаемая функция на данный момент
Некоторые исправления в between(), column.between() для лучшего распространения информации о типе
References: #202
если объект не удается построить, он не добавляется в сессию
References: #203
Функция CAST выделена в отдельный объект clause с собственной функцией компиляции в ansicompiler; это позволяет MySQL молча игнорировать большинство вызовов CAST, поскольку MySQL, похоже, поддерживает стандартный синтаксис CAST только для типов Date. Поддержка MySQL-совместимого CAST для строк, интов и т.д. - TODO
0.2.2¶
Released: Mon Jun 05 2006значительные улучшения в поведении полиморфного наследования, позволяющие работать с табличными структурами списков смежности
References: #190
значительные исправления и рефакторинг отношений наследования в целом, больше модульных тестов
исправлен флаг «echo_pool» в функции create_engine()
Исправление в документации, удалена неверная информация о том, что close() небезопасно использовать с threadlocal стратегией (она абсолютно безопасна !)
create_engine() может принимать URL в виде строки или юникода
References: #188
Частично завершена поддержка firebird; спасибо Джеймсу Ралстону и Брэду Клементсу за их усилия.
Нарушена трансляция Oracle url, исправлено, при наличии поля „database“ в cx_oracle makedsn() будет передаваться host/port/sid, в противном случае используется прямое TNS-имя из поля „host“.
исправление использования юникодного критерия для query.get()/query.load()
Функция count() для selectables теперь использует первичный ключ таблицы или первый столбец вместо «1» в качестве критерия, а также использует метку «rowcount» вместо «count».
убрана рудиментарная функциональность «отображения на несколько таблиц», более корректно документирована
Восстановленная функция global_connect() присоединяется к экземпляру DynamicMetaData с именем «default_metadata». Если оставить MetaData arg в Table out, то будут использоваться метаданные по умолчанию.
исправления в поведении каскада сессий, распространении имени_существа
реорганизованы unittests в подкаталоги
Дополнительные исправления шаблонов вложенности потоковых соединений
0.2.1¶
Released: Mon May 29 2006Аргумент «pool» в create_engine() корректно распространяет
исправляет URL, вызывает исключение, если не разобрано, не передает пустые поля в строку подключения к БД (строка типа user:host@/db ломалась на postgres).
Небольшие исправления в работе Mapper при вставке и попытке получить обратно новые значения первичного ключа
Переписал половину TLEngine, ComposedSQLEngine, используемого со стратегией „strategy=»threadlocal»“. Теперь он правильно реализует engine.begin()/ engine.commit(), которые полностью вложены в connection.begin()/trans.commit(). добавил около шести unittests.
Основная «ошибка» в pool.Pool - забыли вернуть на место WeakValueDictionary. unittest, который должен был проверить это, также молча пропускал его. исправили unittest, чтобы ConnectionFairy корректно выпадал из области видимости.
В SingletonThreadPool добавлен метод placeholder dispose(), который пока ничего не делает
Функция rollback() автоматически вызывается при возникновении исключения, но только в том случае, если транзакция не находится в процессе (т.е. работает скорее как autocommit).
исправлено возникновение исключения в sqlite при отсутствии модуля sqlite
добавлена дополнительная детализация примера для документа «Объект ассоциации
Добавляется проверка соединения на то, что оно уже закрыто
0.2.0¶
Released: Sat May 27 2006перестройка системы Engine, в результате которой то, что раньше было SQLEngine, теперь является ComposedSQLEngine, состоящим из множества компонентов, включая Dialect, ConnectionProvider и т.д. Это коснулось всех модулей db, а также Session и Mapper.
create_engine теперь принимает только строки в стиле RFC-1738:
driver://user:password@host:port/database
обновление этот формат в целом, но не в точности соответствует RFC-1738, в том числе в части «scheme» принимаются подчеркивания, а не тире или периоды.
Полностью переработана методология копирования соединений, объекты Connection теперь могут напрямую выполнять элементы клаузы, добавлено явное «закрытие», а также поддержка во всем Engine/ORM для корректной обработки закрытия, больше не полагаясь на __del__ для возврата соединений в пул.
References: #152
переработаны интерфейс сессий и их масштабирование. используются методы в стиле hibernate, включая query(class), save(), save_or_update() и т.д. По умолчанию не устанавливается потоково-локальная область видимости. Предоставляет интерфейс привязки к конкретным движкам и/или соединениям, так что базовые объекты Schema не обязательно привязывать к движку. Добавлен базовый объект SessionTransaction, позволяющий упрощенно агрегировать транзакции между несколькими движками.
переработана система зависимостей и «каскадного» поведения маппера; логика зависимостей вынесена из properties.py в отдельный модуль «dependency.py». Поведение «каскада» теперь явно контролируется, реализована корректная реализация «delete», «delete-orphan» и т.д. Система зависимостей теперь может определять во время флеша, есть ли у дочернего объекта родитель или нет, чтобы принимать более точные решения о том, как этот дочерний объект должен обновляться в БД в отношении удалений.
переработка схемы для создания объекта MetaData вместо движка. Вся система SQL/Schema может использоваться без каких-либо движков, исполняясь только через явный объект Connection. «Связанная» методология существует через BoundMetaData для объектов схемы. ProxyEngine, как правило, больше не нужен и заменяется DynamicMetaData.
реализовано истинное полиморфное поведение, исправлены
References: #167
Система «oid» полностью переведена на поведение во время компиляции; если они используются в order_by, где их нет, то order_by не компилируется, исправления
References: #147
изменена упаковка; «mapping» теперь «orm», «objectstore» теперь «session», старое пространство имен «objectstore» загружается через мод «threadlocal», если используется
Моды теперь вызываются через «import <modname>». расширениям отдается предпочтение перед модами, так как моды глобально монкипатчимы
Исправление add_property, чтобы оно распространяло свойства на наследующие отображатели
References: #154
Обратные ссылки создаются по первичному отображателю исходного свойства, аргументы primary/secondary join могут быть указаны для переопределения. помогает их использование с полиморфными отображателями
Реализована функция «таблица существует»
References: #31
»create_all/drop_all» добавлен в объект MetaData
References: #98
улучшения и исправления в алгоритме топологической сортировки, а также больше модульных тестов
В документацию добавлена обучающая страница, которую также можно запустить с помощью пользовательской программы doctest runner для проверки правильности работы. Документация в целом переработана для работы с новыми паттернами кода
еще много исправлений, рефакторингов.
Руководство по миграции доступно в Wiki по адресу https://www.sqlalchemy.org/trac/wiki/02Migration.