0.3 Changelog¶
0.3.11¶
Released: Sun Oct 14 2007orm¶
Добавлена проверка на объединение из A->B с помощью join() по двум разным m2m-таблицам. Это вызывает ошибку в 0.3, но возможно в 0.4 при использовании псевдонимов.
References: #687
Исправлена небольшая ошибка с выбросом исключений в Session.merge()
исправлена ошибка, при которой mapper, будучи связанным с join, в котором одна из таблиц не имела столбцов PK, не определял, что объединенная таблица не имеет PK.
Исправлены ошибки, связанные с определением правильных условий синхронизации из пользовательских условий наследования
References: #769
Операция удаления объекта из backref не завершается, если коллекция другой стороны не содержит элемента, поддерживаются коллекции noload
References: #813
engine¶
исправлено еще одно случайное состояние гонки, которое могло возникнуть при использовании пула с настройкой threadlocal
sql¶
изменить приоритет DISTINCT для предложений типа func.count(t.c.col.distinct()).
Исправлено определение внутренних символов „$“ в :bind$params
References: #719
не предполагайте, что критерий join состоит только из объектов-столбцов
References: #768
скорректировано предшествование оператора NOT для соответствия „==“ и другим, так что ~(x==y) дает NOT (x=y), что совместимо с MySQL < 5.0 (не любит «NOT x=y»)
References: #764
mysql¶
исправлено указание столбцов YEAR при генерации схемы
sqlite¶
проход для строчных дат
mssql¶
добавлена поддержка столбцов TIME (моделируется с помощью DATETIME)
References: #679
добавлена поддержка BIGINT, MONEY, SMALLMONEY, UNIQUEIDENTIFIER и SQL_VARIANT
References: #721
Имена индексов теперь берутся в кавычки при сбросе из отраженных таблиц
References: #684
теперь можно указать DSN для PyODBC, используя URI типа mssql:///?dsn=bob
oracle¶
misc¶
При отражении таблиц из альтернативных схем «по умолчанию», помещенному в первичный ключ, т.е. обычно в имя последовательности, имя «схемы» безусловно заключено в кавычки, так что имена схем, требующие кавычек, работают нормально. для имен схем, не требующих кавычек, это несколько излишне, но не вредно.
supports_sane_rowcount() установлено значение False в связи с тикетом #370 (правильный путь).
исправлено отражение свойства Column’s nullable.
0.3.10¶
Released: Fri Jul 20 2007general¶
новый мьютекс, добавленный в 0.3.9, приводит к сбою функции pool_timeout в условиях гонки; потоки немедленно и без задержки выдают ошибку TimeoutError, если много потоков одновременно переполняют пул. эта проблема была исправлена.
orm¶
очистка сессий, связанных с соединением, SessionTransaction
sql¶
получил метаданные, связанные с соединением, для работы с неявным выполнением
спецификации внешних ключей могут иметь любые символы в своих идентификаторах
References: #667
Добавлена возможность учета коммутативности при сравнении бинарных клаузул друг с другом, что улучшает оптимизацию ленивой загрузки ORM
References: #664
misc¶
фиксированная максимальная длина идентификатора (63)
References: #571
0.3.9¶
Released: Sun Jul 15 2007general¶
улучшенное сообщение об ошибке для NoSuchColumnError
References: #607
наконец-то разобрался, как получить версию setuptools, доступную в виде sqlalchemy.__version__.
References: #428
Различные аргументы «engine», такие как «engine», «connectable», «engine_or_url», «bind_to» и т.д., присутствуют, но устарели. Все они заменяются одним термином «bind». Вы также устанавливаете «bind» метаданных с помощью metadata.bind = <engine or connection>.
orm¶
Совместимость с 0.4: в Query добавлены функции one(), first() и all(). Почти вся функциональность Query из 0.4 присутствует в 0.3.9 для целей форвард-компиляции.
reset_joinpoint() на этот раз действительно работает, обещаю ! позволяет повторно соединяться от корня: query.join([„a“, „b“]).filter(<крит>).reset_joinpoint().join([„a“, „c“]).filter(<какой-то другой критерий>).all() in 0.4 все вызовы join() начинаются от «корня»
добавлена синхронизация на этапе построения mapper(), чтобы избежать столкновения потоков, когда существующие ранее mappers компилируются в другом потоке
References: #613
Mapper выдает предупреждение, когда два столбца первичного ключа с одинаковыми именами объединяются в один атрибут. Это часто происходит при отображении на джойны (или наследование).
Свойства synonym() полностью поддерживаются всеми операциями Query joining/ with_parent
References: #598
Исправлена очень глупая ошибка при удалении элементов с отношениями «многие-ко-многим» uselist=False
Помните все эти вещи про polymorphic_union для наследования объединенных таблиц? Забавно… Для наследования объединенных таблиц он вроде как не нужен, можно просто соединить все таблицы через outerjoin(). Однако UNION все равно применяется, если речь идет о конкретных таблицах (поскольку объединять их не на чем).
Небольшое исправление в eager loading для улучшения работы с eager load в полиморфных картографах, использующих прямое предложение «outerjoin»
sql¶
ForeignKey к таблице в схеме, не являющейся схемой по умолчанию, требует явного указания схемы, т.е. ForeignKey(„alt_schema.users.id“)
Метаданные теперь могут быть сконструированы с движком или url в качестве первого аргумента, как и BoundMetaData
BoundMetaData в настоящее время устарела, и MetaData является ее прямой заменой.
DynamicMetaData была переименована в ThreadLocalMetaData. Имя DynamicMetaData устарело и является псевдонимом для ThreadLocalMetaData или обычного MetaData, если threadlocal=False
составной первичный ключ представляется в виде неключевого набора, что позволяет использовать составные ключи, состоящие из столбцов с одинаковыми именами; встречается в рамках Join. помогает в сценариях наследования сформулировать правильный PK.
Улучшена возможность получения «правильного» и наиболее минимального набора столбцов первичного ключа из соединения, приравнивая внешние ключи и другие приравненные столбцы. Это также в основном помогает сценариям наследования сформулировать наилучший выбор столбцов первичного ключа.
References: #185
добавлен аргумент „bind“ в Sequence.create()/drop(), ColumnDefault.execute()
столбцы могут быть переопределены в отраженной таблице с атрибутом «ключ», отличным от имени столбца, в том числе для столбцов с первичным ключом
References: #650
исправлено обнаружение результата «неоднозначный столбец» при наличии в результате дублирующихся имен столбцов
References: #657
Некоторые улучшения в «нацеливании на столбец», возможность сопоставления столбца с «соответствующим» столбцом в другом селекте. Это влияет в основном на возможности ORM по сопоставлению со сложными объединениями
Метаданные и все SchemaItems безопасны для использования с pickle. Медленные отражения таблиц могут быть сброшены в pickled-файл для последующего использования. Просто переподключите движок к метаданным после распикировки.
References: #619
добавлен мьютекс для вычисления «переполнения» QueuePool для предотвращения состояния гонки, которое может обойти max_overflow
Исправлена группировка составных селектов для получения корректных результатов. В некоторых случаях это приводит к поломке sqlite, но эти случаи все равно давали некорректные результаты, sqlite не поддерживает группированные составные селекты
References: #623
исправлено старшинство операторов, чтобы скобки применялись корректно
References: #620
Вызов <column>.in_() (т.е. без аргументов) вернет «CASE WHEN (<column> IS NULL) THEN NULL ELSE 0 END = 1)», так что во всех случаях будет возвращен NULL или False, а не выброшена ошибка
References: #545
Исправлен критерий «where»/»from» в select() для приема строки юникода в дополнение к обычной строке - оба преобразуются в text()
добавлена отдельная функция distinct() в дополнение к column.distinct()
References: #558
result.last_inserted_ids() должен возвращать список, размер которого идентичен размеру ограничения первичного ключа таблицы. Значения, которые были созданы «пассивно» и недоступны через cursor.lastrowid, будут равны None.
Определение длинных идентификаторов исправлено на использование >, а не >= для максимальной длины идентификатора
References: #589
Исправлена ошибка, при которой selectable.corresponding_column(selectable.c.col) не возвращала selectable.c.col, если selectable являлся соединением таблицы и другого соединения, включающего ту же таблицу. Испорченное принятие решений в ORM
References: #593
В types.py добавлен тип Interval
References: #595
mysql¶
sqlite¶
изменил инициализацию диалекта, чтобы он успел предупредить о том, что pysqlite1 слишком стар.
sqlite лучше справляется с объектами datetime/date/time, смешанными с различными столбцами Date/Time/DateTime
Строковые вставки в столбцы PK не перезаписываются OID
References: #603
mssql¶
Исправлена обработка опций порта для pyodbc
References: #634
теперь можно отражать начальные и инкрементные значения для столбцов идентификации
предварительная поддержка использования scope_identity() в pyodbc
oracle¶
Исправления datetime: заработал субсекундный TIMESTAMP, добавлен OracleDate, который поддерживает типы.Date, содержащие только год/месяц/день
References: #604
добавлен диалектный флаг «auto_convert_lobs», по умолчанию True; приводит к тому, что все LOB-объекты, обнаруженные в наборе результатов, принудительно преобразуются в OracleBinary, чтобы LOB был прочитан() автоматически, если не было типовой карты (т.е. если была выдана текстовая execute()).
Оператор mod „%“ производит MOD
References: #624
преобразование объектов cx_oracle datetime в Python datetime.datetime при использовании Python 2.3
References: #542
исправлено преобразование юникода в типе Oracle TEXT
misc¶
итерация по прокси dict-ассоциациям теперь выполняется как dict, а не как InstrumentedList (например, по ключам, а не по значениям)
Ассоциативные прокси больше не привязываются жестко к исходным коллекциям, вместо этого они строятся с помощью thunk
References: #597
добавлена функция selectone_by() в assignmapper
исправлено экранирование оператора modulo
References: #624
добавлена поддержка отражения доменов
References: #570
Типы, отсутствующие в процессе отражения, разрешаются в тип Null, а не вызывают ошибку
исправление в «schema» выше исправляет отражение внешних ключей из таблицы alt-schema в таблицу public schema
0.3.8¶
Released: Sat Jun 02 2007orm¶
В Query добавлен метод reset_joinpoint(), который перемещает «точку соединения» обратно к начальному мапперу. В версии 0.4 поведение метода join() будет изменено на сброс «точки соединения» во всех случаях, поэтому данный метод является временным. Для дальнейшей совместимости убедитесь, что соединения по нескольким отношениям задаются с помощью одного метода join(), т.е. join([„a“, „b“, „c“]).
Исправлена ошибка в query.instances(), из-за которой не обрабатывалось более одного дополнительного отображателя или одного дополнительного столбца.
»delete-orphan» больше не подразумевает «delete». в настоящее время ведется работа по разделению поведения этих двух операций.
отношения «многие-ко-многим» корректно задают тип параметров привязки для операций удаления из таблицы ассоциаций
отношения «многие-ко-многим» проверяют соответствие количества строк, удаленных из таблицы ассоциации при операции удаления, ожидаемым результатам
session.get() и session.load() передают **kwargs в запрос
Исправление полиморфного запроса, позволяющее встраивать исходное полиморфное_соединение в коррелированный подзапрос
References: #577
Исправление джойнов в стиле select_by(<propname>=<экземпляр объекта>) в сочетании с отношениями «многие-ко-многим», ошибка внесена в r2556
Аргумент «primary_key» в mapper() передается в «полиморфный» mapper. столбцы первичного ключа в этом списке нормализуются к столбцам локальной таблицы mapper’а.
Восстановлено протоколирование «ленивого пункта загрузки» в логгере sa.orm.strategies, удалено в 0.3.7
Улучшена поддержка ускоренной загрузки свойств из mappers, которые отображаются на операторы select(); т.е. eagerloader лучше находит нужный selectable, к которому можно присоединить LEFT OUTER JOIN.
sql¶
Класс _Label переопределяет compare_self для возврата своего конечного объекта. То есть, если сказать someexpr.label(„foo“) == 5, то будет выдано правильное «someexpr == 5».
_Label распространяет «_hide_froms()», чтобы скалярные селекты вели себя более корректно по отношению к предложению FROM #574
исправление генерации длинных имен при использовании oid_column в качестве порядка по (oids активно используется в запросах к мапперу)
Значительное повышение скорости работы ResultProxy, предварительное кэширование реализаций диалекта TypeEngine и экономия на вызовах функций для каждого столбца
Скобки применяются к клаузам с помощью новой конструкции _Grouping. Использование приоритета операторов для более разумного применения скобок к клаузам обеспечивает более чистую вложенность клаузов (не мутирует клаузы, помещенные в другие клаузы, т.е. нет флага „parens“)
Добавлено ключевое слово „modifier“, работает как func.<foo>, только не добавляет скобки. например, select([modifier.DISTINCT(…)]) и т.д.
снято ограничение «запрет на группировку by в селекте, являющемся частью UNION».
References: #578
mysql¶
Практически все типы столбцов MySQL теперь поддерживаются для объявления и отражения. Добавлены NCHAR, NVARCHAR, VARBINARY, TINYBLOB, LONGBLOB, YEAR
Пасстаф sqltypes.Binary теперь всегда строит BLOB, что позволяет избежать проблем с очень старыми версиями баз данных
поддержка деклараций CHARACTER SET и COLLATE на уровне столбцов, а также стенограммы ASCII, UNICODE, NATIONAL и BINARY.
misc¶
добавлена функция detach() для Connection, позволяющая отделять базовое DBAPI-соединение от его пула, закрывая его при dereference/close(), а не повторно используя пул.
добавление функции invalidate() к Connection приводит к немедленному аннулированию Connection и лежащего в его основе DBAPI-соединения.
установить максимальную длину идентификатора равной 31
Для функции supports_sane_rowcount() установлено значение False в связи с тикетом #370. Функция versioned_id_col не будет работать в FB.
некоторые исправления в исполнении
новая реализация ассоциативного прокси, реализующая полные прокси для коллекций отношений на основе списков, диктов и множеств
добавлен Orderlist, класс пользовательского списка, который синхронизирует атрибут объекта с его позицией в списке
небольшое исправление SelectResultsExt, чтобы он не обходил сам себя при выполнении select().
в assignmapper добавлены filter(), filter_by()
0.3.7¶
Released: Sun Apr 29 2007orm¶
исправлена критическая проблема, когда после использования options(eagerload()) картограф всегда применял «обертывающее» поведение запроса для всех последующих запросов LIMIT/OFFSET/DISTINCT, даже если для этих запросов не применялась ускоренная загрузка.
Добавлен метод query.with_parent(someinstance). осуществляет поиск целевого экземпляра по критерию lazy join из родительского экземпляра. принимает необязательную строку «property» для выделения нужного отношения. также добавлена статическая версия Query.query_from_parent(instance, property).
References: #541
усовершенствован запрос query.XXX_by(someprop=someinstance) для использования методологии, аналогичной with_parent, т.е. с использованием предложения «lazy», которое не позволяет добавлять таблицу удаленного экземпляра в SQL, что делает возможными более сложные условия
References: #554
В запрос добавлены генеративные версии агрегатов, т.е. sum(), avg() и т.д. Используются через query.apply_max(), apply_sum() и т.д. #552
исправление использования distinct() или distinct=True в сочетании с join() и аналогичными
Соответственно генерации имен label/bindparam, нетерпеливые загрузчики генерируют детерминированные имена для создаваемых ими псевдонимов с помощью md5-хэшей.
улучшены/исправлены классы пользовательских коллекций при передаче им классов или подклассов «set»/»sets.Set» (при ленивой загрузке они все равно искали методы append())
восстановлена старая ORM-функция «column_property()» (раньше называлась «column()») для принудительного добавления любого выражения столбца в качестве свойства на маппере, особенно тех, которые не присутствуют в отображаемом selectable. Это позволяет добавлять «скалярные выражения» любого типа в качестве отношений (хотя у них есть проблемы с нетерпеливой загрузкой).
исправление отношений «многие-ко-многим» для полиморфных отображателей
References: #533
прогресс в использовании session.merge(), а также объединение ее использования с entity_name
References: #543
обычная корректировка отношений между наследующими картографами, в данном случае создание relation()s к картографам подклассов, где условия присоединения берутся из таблицы суперкласса
sql¶
Ключи() столбцов результирующего набора не выделяются строчными буквами, а возвращаются в том виде, в котором они выражены в cursor.description. обратите внимание, что из-за этого в oracle имена столбцов будут выделены заглавными буквами.
Добавлена предварительная поддержка юникодных имен таблиц, столбцов и операторов SQL для баз данных, которые могут их поддерживать. Пока работает с sqlite и postgres. MySQL почти работает, за исключением того, что не работает функция has_table(). Reflection тоже работает.
тип Unicode теперь является прямым подклассом String, который теперь содержит всю логику «convert_unicode». Это позволяет лучше справляться с различными ситуациями, связанными с юникодом, которые возникают в таких СУБД, как MS-SQL, и позволяет создавать подклассы типа данных Unicode.
References: #522
ClauseElements теперь можно использовать в предложениях in_(), например, для связывания параметров и т.д. #476
Реализованы обратные операторы для элементов CompareMixin, что позволяет использовать выражения типа «5 + somecolumn» и т.д. #474
Критерий «where» в операциях update() и delete() теперь коррелирует встроенные операторы select() с обновляемой или удаляемой таблицей. Это работает так же, как и корреляция вложенных операторов select(), и может быть отключено с помощью флага correlate=False во встроенном select().
Метки столбцов теперь генерируются на этапе компиляции, что означает, что их длина зависит от диалекта. Так, на oracle метка, усеченная до 30 символов, на postgres будет иметь длину 63 символа. Кроме того, истинное имя метки всегда подключается в качестве аксессора к родительскому Selectable, поэтому нет необходимости обращать внимание на «усеченные» имена меток.
References: #512
Теперь метка столбца и параметр bind param «truncation» также генерируют детерминированные имена, основанные на их упорядочивании в компилируемом полном операторе. Это означает, что один и тот же оператор будет выдавать одну и ту же строку при всех перезапусках приложения и позволит лучше работать кэшированию плана запросов к БД.
»Мини» метки столбцов, генерируемые при использовании подзапросов и предназначенные для обхода глючного поведения SQLite, не понимающего «foo.id» как эквивалент «id», теперь генерируются только в том случае, если эти именованные столбцы выбраны из (части)
References: #513
метод label() на ColumnElement будет корректно распространять TypeEngine базового элемента на метку, включая label(), созданную из оператора select() со скалярным=True.
MS-SQL лучше определяет, когда запрос является подзапросом, и умеет не генерировать фразы ORDER BY для таких запросов
References: #513
исправление того, что аргумент fetchmany() «size» был позиционным в большинстве dbapis
References: #505
Передача None в качестве аргумента в func.<something> приведет к появлению аргумента NULL
Строки запросов в юникодных URL получают ключи, закодированные в ascii для совместимости **kwargs
Небольшая доработка сырого изменения execute() для поддержки кортежей для позиционных параметров, а не только списков
References: #523
исправление в конструкции case() для распространения типа первого условия WHEN в качестве возвращаемого типа оператора case
extensions¶
большое исправление в AssociationProxy, чтобы несколько объектов AssociationProxy могли быть связаны с одной коллекцией ассоциаций.
assign_mapper называет методы в соответствии с их ключами (т.е. __name__) #551
mysql¶
поддержка SSL-аргументов, передаваемых в строке запроса URL, с префиксом «ssl_», любезно предоставленным terjeros@gmail.com.
Для определения существования таблицы mysql использует команду «DESCRIBE.<tablename>», отлавливая исключения, если таблица не существует. Поддерживаются юникодные имена таблиц, а также имена схем. протестировано на MySQL5, но должно работать и в серии 4.1. (#557)
sqlite¶
Устранено глупое поведение, при котором sqlite отражал UNIQUE-индексы как часть первичного ключа (?!)
mssql¶
pyodbc теперь является предпочтительным DB-API для MSSQL, и если модуль не запрашивается специально, то он будет загружен первым при проверке модуля.
Вместо @@IDENTITY теперь используется @@SCOPE_IDENTITY. Это поведение может быть переопределено с помощью параметра ключевого слова engine_connect «use_scope_identity», который также может быть указан в dburi.
oracle¶
Небольшое исправление, позволяющее последовательно компилировать один и тот же объект SELECT, содержащий LIMIT/OFFSET. Диалект oracle должен был модифицировать объект, чтобы он имел ROW_NUMBER OVER, и не выполнял всю серию шагов при последовательной компиляции.
misc¶
модуль warnings, используемый для выдачи предупреждений (вместо протоколирования)
очистка стратегий импорта DBAPI во всех движках
References: #480
рефакторинг внутренних компонентов движка, снижающий сложность и количество кодовых путей; размещение большего количества состояний внутри ExecutionContext для более диалектного управления обработкой курсоров, наборов результатов. ResultProxy полностью рефакторизован и имеет две версии «буферизованных» наборов результатов, используемых для различных целей.
поддержка курсоров на стороне сервера, полностью функционирующая в postgres.
References: #514
улучшена система автопроверки соединений, потерявших базовую базу данных, с помощью диалектного определения исключений, соответствующих сообщениям об ошибках, связанных с отключением базы данных. Кроме того, при обнаружении состояния «соединение больше не открыто» весь пул соединений удаляется и заменяется новым экземпляром. #516
Диалекты в sqlalchemy.databases становятся точками входа в setuptools. Загрузка встроенных диалектов баз данных работает так же, как и всегда, но если таковых не найдено, то придется обратиться к pkg_resources для загрузки внешнего модуля
References: #521
Engine содержит атрибут «url», ссылающийся на объект url.URL, используемый функцией create_engine().
Добавлена поддержка informix ! благодаря Джеймсу Чжану, который приложил массу усилий.
0.3.6¶
Released: Fri Mar 23 2007orm¶
весь набор функций расширения SelectResults был объединен в новый набор методов, доступных из Query. Все эти методы обеспечивают «генеративное» поведение, при котором запрос копируется и возвращается новый запрос с добавленными дополнительными критериями. К новым методам относятся:
filter() - применение к запросу критерия select
filter_by() - применяет к запросу критерий типа «по»
avg() - возвращает функцию avg() для заданного столбца
join() - присоединение к свойству (или к списку свойств)
outerjoin() - подобно join(), но использует LEFT OUTER JOIN
limit()/offset() - применение диапазона LIMIT/OFFSET, при котором применяется ограничение/смещение: session.query(Foo)[3:5]
distinct() - применить DISTINCT
list() - оценка критерия и возврат результатов
В API Query не было внесено никаких несовместимых изменений, и ни один метод не был устаревшим. Существующие методы select(), select_by(), get(), get_by() выполняют запрос за один раз и возвращают результаты, как и раньше. join_to()/join_via() по-прежнему существуют, хотя генеративные методы join()/outerjoin() более удобны в использовании.
Возвращаемое значение для нескольких отображений, используемых с функцией instances(), теперь возвращает картезианское произведение запрошенного списка отображений, представленное в виде списка кортежей. Это соответствует документированному поведению. Чтобы экземпляры соответствовали друг другу, при использовании этой функции отключается «уникализация».
Query имеет генеративные методы add_entity() и add_column(). Они добавляют заданный mapper/class или ColumnElement в запрос во время компиляции и применяют их в методе instances(). пользователь отвечает за построение разумных условий объединения (иначе можно получить полное картезианское произведение). набор результатов - это список кортежей, не уникальных.
Строки и столбцы также могут быть отправлены в *args функции instances(), где именно эти столбцы результатов будут входить в кортежи результатов.
В query.select() можно передать не только полную конструкцию select() (что в любом случае сработало), но и query.selectfirst(), query.selectone(), которые будут использованы как есть (т.е. запрос не компилируется). работает аналогично передаче результатов в instances().
Ускоренная загрузка не будет «псевдонизировать» предложения «order by», которые были помещены в оператор select не самим ускоренным загрузчиком, чтобы устранить возможность дублирования столбцов, как показано на рисунке. Однако это означает, что вы должны быть более внимательны к столбцам, помещенным в «order by» в Query.select(), если вы явно назвали их в своем критерии (т.е. вы не можете полагаться на то, что ускоренный загрузчик добавит их за вас).
References: #495
В Session добавлен удобный многофункциональный метод «identity_key()», позволяющий генерировать идентификационные ключи для значений первичных ключей, экземпляров и строк, любезно предоставленный Дэниелом Миллером
таблица «многие-ко-многим» будет корректно обрабатываться даже для операций, которые происходят на стороне «обратной ссылки
References: #249
Добавлен каскад «refresh-expire», позволяющий вызовам refresh() и expire() распространяться по отношениям.
References: #492
Исправления в полиморфных отношениях, в том числе правильная генерация ленивых клаузул для отношений «многие-к-одному» в полиморфных отображениях. также исправлено определение «направления», более конкретное выделение столбцов, которые принадлежат полиморфному объединению, и тех, которые не принадлежат.
References: #493
Некоторые исправления в расчетах отношений при использовании «viewonly=True» для подтягивания в условие соединения других таблиц, не являющихся родителями в связке родитель/дочь отношения
исправления flush на циклических референтных отношениях, содержащих ссылки на другие экземпляры вне циклической цепочки, когда некоторые объекты в цикле фактически не являются частью flush
поставить агрессивную проверку на ошибку «промывка объекта A с коллекцией объектов B, но вы поместили в коллекцию объект C» - даже если C является подклассом B, если только маппер B не загружается полиморфно. В противном случае в коллекцию позже будет загружен «B», который должен быть «C» (поскольку он не полиморфен), что нарушит двунаправленные связи (т.е. у C есть свой A, но обратная ссылка A будет лениво загружать его как другой экземпляр типа «B»). Эта проверка будет кусать некоторых из вас, кто делает это без проблем, поэтому в сообщении об ошибке будет также записан флаг «enable_typechecks=False», чтобы отключить эту проверку. Но имейте в виду, что двунаправленные отношения, в частности, становятся хрупкими без этой проверки.
References: #500
sql¶
Имена bindparam() теперь повторяются! укажите два разных bindparam()с одинаковым именем в одном операторе, и ключ будет общим. правильные позиционные/именованные аргументы транслируются во время компиляции. для старого поведения «алиасинга» параметров связывания с конфликтующими именами укажите «unique=True» - эта опция по-прежнему используется внутри системы для всех автоматически генерируемых (основанных на значениях) параметров связывания.
Немного улучшена поддержка связывания параметров в качестве предложений столбцов, либо через bindparam(), либо через literal(), т.е. select([literal(„foo“)])
Метаданные могут привязываться к движку либо с помощью ключей «url» или «engine» в конструкторе, либо с помощью метода connect(). BoundMetaData идентична MetaData, за исключением того, что требуется параметр engine_or_url. DynamicMetaData аналогична и по умолчанию обеспечивает потоково-локальные соединения.
exists() становится пригодной для использования в качестве самостоятельного selectable, а не только в предложении WHERE, т.е. exists([columns], criterion).select()
Коррелирующие подзапросы работают внутри ORDER BY, GROUP BY
исправлено выполнение функций при явном подключении, т.е. conn.execute(func.dosomething())
Флаг use_labels в select() не будет автоматически создавать метки для буквальных элементов текстовых колонок, поскольку мы не можем делать никаких предположений о тексте. Для создания меток для буквальных колонок можно сказать «somecol AS somelabel», или использовать literal_column(«somecol»).label(«somelabel»)
Для литеральных столбцов не будет происходить цитирование, когда они «проксируются» в коллекцию столбцов для своего selectable (передается флаг is_literal). литеральные столбцы указываются через literal_column(«somestring»).
Добавлен логический аргумент «fold_equivalents» в Join.select(), который удаляет из результирующего предложения столбцы-дубликаты, которые, как известно, эквивалентны по условию объединения. Это очень удобно при построении подзапросов объединений, на которые Postgres жалуется, если в них присутствуют дублирующиеся имена столбцов.
исправлен флаг use_alter для ForeignKeyConstraint
References: #503
исправлено использование только для 2.4 «reversed» в файле topological.py
References: #506
для хакеров, рефакторинг системы «посетителей» ClauseElement и SchemaItem таким образом, что обход элементов контролируется самим ClauseVisitor, используя метод visitor.traverse(item). методы accept_visitor() по-прежнему могут вызываться напрямую, но не будут выполнять обход дочерних элементов. ClauseElement/SchemaItem теперь имеют настраиваемый метод get_children(), возвращающий коллекцию дочерних элементов для каждого родительского объекта. Это позволяет сделать полный обход элементов ясным и недвусмысленным (а также протоколируемым), с легким способом ограничения обхода (достаточно передать флаги, которые будут подхвачены соответствующими методами get_children()).
References: #501
Параметр «else_» в операторе case теперь корректно работает при установке в ноль.
extensions¶
Метод options() в SelectResults теперь реализован «генеративно», как и остальные методы SelectResults. Но сейчас вы все равно будете использовать только Query.
References: #472
Метод query() добавлен в assignmapper. Это помогает ориентироваться во всех новых генеративных методах на Query.
mysql¶
В MSString добавлена функция **kwargs, помогающая отражать непонятные типы (например, «varchar() binary» в MS 4.0)
добавлен явный тип MSTimeStamp, который вступает в силу при использовании types.TIMESTAMP.
oracle¶
добился работы binary для ввода любого размера ! cx_oracle работает нормально, это была моя ошибка, так как для setinputsizes передавался BINARY, а не BLOB (также юнит-тесты даже не задавали размер ввода).
также исправлено чтение/запись CLOB в отдельном наборе изменений.
auto_setinputsizes по умолчанию принимает значение True для Oracle, исправлены случаи, когда он некорректно распространял плохие типы.
misc¶
- удален секундный ввод данных о типах столбцов DATE (возможно
следует вообще убрать время)
Нулевые значения в float-полях больше не вызывают ошибок
LIMIT с OFFSET теперь вызывает ошибку (в MS-SQL нет поддержки OFFSET)
добавлена возможность использования MSSQL-типа VARCHAR(max) вместо TEXT для больших строковых полей нестандартного размера. Для ее включения используйте новый параметр «text_as_varchar».
References: #509
Предложения ORDER BY без LIMIT теперь удаляются из подзапросов, так как MS-SQL запрещает такое использование
очистка кода импорта модулей; определяемый модуль DB-API; более явное упорядочивание предпочтений модулей.
References: #480
0.3.5¶
Released: Thu Feb 22 2007orm¶
очередной рефакторинг вычисления отношений. Позволяет более корректно вести себя в ORM с отношениями от/к/между картографами, в частности, с полиморфными картографами, а также использовать их в Query, SelectResults. билеты include,,,.
Устранен устаревший способ указания пользовательских коллекций на классах; теперь необходимо использовать опцию «collection_class». Старый способ приводил к конфликтам, когда люди использовали assign_mapper(), который теперь исправляет метод «options», в сочетании с отношением с именем «options». (отношения имеют приоритет над методами assign_mapper, пропатченными обезьяной).
Опция запроса extension() распространяется на метод Mapper._instance(), так что все методы, связанные с загрузкой, будут вызваны
References: #454
Если для отношения не будет возвращено ни одной строки, то не произойдет сбоя.
Исправлена ошибка загрузки отношения eager relation при использовании отношения eager relation для нескольких классов-потомков
References: #486
исправление для очень больших топологических сортов, любезно предоставлено ants.aasma at gmail
References: #423
eager loading несколько более строго относится к обнаружению «самореферентных» отношений, в частности, между полиморфными отображателями. Это приводит к «ухудшению» eager load по сравнению с lazy loading.
Улучшена поддержка сложных запросов, встроенных в критерий «where» для query.select()
References: #449
Опции mapper, такие как eagerload(), lazyload(), deferred(), будут работать для отношений «synonym()».
References: #485
исправлена ошибка, при которой каскадные операции некорректно включали в каскад удаленные элементы коллекции
References: #445
исправлена ошибка удаления отношений, когда дочерний элемент «один-ко-многим» перемещается к новому родителю в одной единице работы
References: #478
исправлена ошибка удаления отношений, когда при ручном удалении или использовании каскада «delete» без «delete-orphan» родитель/ребенок с единственным столбцом в качестве PK/FK у ребенка возникала ошибка «blank out the primary key».
исправление в отложенном режиме, чтобы операция загрузки не происходила ошибочно, когда установлены только атрибуты PK col
Реализованный аргумент foreign_keys для mapper. Используется совместно с аргументами primaryjoin/secondaryjoin для указания/определения внешних ключей, определенных для экземпляра Table.
References: #385
contains_eager(„foo“) автоматически подразумевает eagerload(„foo“)
В функции contains_eager() добавлен аргумент «alias». с его помощью можно указать строковое имя или экземпляр Alias псевдонима, используемого в запросе для загружаемых с нетерпением дочерних элементов. проще использовать, чем «декоратор»
добавлена опция «contains_alias()» для сопоставления набора результатов с псевдонимом сопоставленной таблицы
добавлена поддержка оператора py2.5 «with» для SessionTransaction
References: #468
sql¶
Значение параметра «case_sensitive» теперь по умолчанию принимает значение True, независимо от регистра идентификатора, если специально не установлено значение False. Это связано с тем, что объект может быть обозначен как нечто другое, содержащее смешанный регистр, и распространение значения «case_sensitive=False» нарушает это. Другие исправления, связанные с цитированием при использовании меток и «фальшивых» объектов столбцов
добавлен метод «supports_execution()» для ClauseElement, чтобы отдельные виды клаузул могли выражать, подходят ли они для выполнения… например, можно выполнить «select», но не «Table» или «Join».
Исправлена передача аргументов для прямого текстового execute() на движке, соединении. можно обрабатывать *args или экземпляр списка для позиционных, **kwargs или экземпляр dict для именованных аргументов, или список списков или dicts для вызова executemany()
Небольшое исправление в BoundMetaData для приема URL в юникоде или строке
исправлена генерация PrimaryKeyConstraint с именем, любезно предоставленным andrija at gmail
References: #466
исправлена генерация ограничений CHECK на столбцы
References: #464
исправления в операции tometadata() для распространения ограничений на уровне столбцов и таблиц
extensions¶
добавлен метод distinct() в SelectResults. в общем случае он должен иметь значение только при использовании count().
в SelectResults добавлен метод options(), эквивалентный query.options()
References: #472
В ActiveMapper добавлен необязательный словарь __table_opts__, который будет передавать kw-опции объектам Table
References: #462
в assign_mapper добавлены selectfirst(), selectfirst_by()
References: #467
mysql¶
исправление отражения на старых БД, которые могли возвращать тип array() для операторов «show variables like»
mssql¶
предварительная поддержка pyodbc (Ура!)
References: #419
добавлена улучшенная поддержка типов NVARCHAR
References: #298
исправление логики фиксации в pymssql
исправление для query.get() со схемой
References: #456
исправление для нецелых отношений
References: #473
Модуль DB-API теперь можно выбирать во время выполнения программы
References: #419
теперь проходит гораздо больше модульных тестов
улучшена совместимость unittest с ANSI-функциями
References: #479
Улучшена поддержка неявной последовательности столбцов PK с автовставкой
References: #415
исправление пустого пароля в adodbapi
References: #371
исправления для обеспечения работы модульных тестов с pyodbc
References: #481
Исправление авто_идентичности_вставки в запросе db-url
добавление query_timeout в параметры запроса к db-url. в настоящее время работает только для pymssql
протестирован с pymssql 0.8.0 (который теперь LGPL)
oracle¶
При возврате «rowid» в качестве столбца ORDER BY или при использовании ROW_NUMBER OVER диалект oracle проверяет, к какому selectable он применяется, и переключается на таблицу PK, если она неприменима, т.е. для UNION. Проверка для DISTINCT, GROUP BY (других мест, где rowid недействителен) все еще остается TODO.
References: #436
Последовательности на непк столбце будут корректно срабатывать при INSERT
добавлена поддержка PrefetchingResultProxy для предварительной выборки LOB-колонок, если известно, что они присутствуют, исправления
References: #435
реализовано отражение таблиц на основе синонимов, в том числе через dblinks
References: #379
выдает предупреждение в журнал, когда связанная таблица не может быть отражена из-за определенных ошибок в правах доступа
References: #363
misc¶
0.3.4¶
Released: Tue Jan 23 2007general¶
глобальное изменение «insure»->»ensure». в американском английском «insure» действительно в значительной степени взаимозаменяем с «ensure» (так говорит словарь), так что я не совсем безграмотен, но он определенно неоптимален по сравнению с «ensure», который не является однозначным.
orm¶
Проделал первую дырку в банке с червями: если сказать query.select_by(somerelationname=someinstance), то будет создано соединение столбцов первичного ключа, представленного маппером «somerelationname», с реальным первичным ключом в «someinstance».
Переработано взаимодействие отношений с «полиморфными» отображениями, т.е. отображениями, имеющими select_table, а также полиморфные флаги. Улучшено определение правильных условий присоединения, взаимодействие с условиями присоединения, определяемыми пользователем, и поддержка самореферентных полиморфных отображений.
В связи с полиморфными отношениями отображения, углублена проверка ошибок при компиляции отношений, для выявления неоднозначного «primaryjoin» в случае, когда обе стороны отношения имеют ссылки на внешний ключ в условии primary join. также ужесточены условия, используемые для определения «направления отношения», связывающие «внешний ключ» отношения с «primaryjoin».
немного улучшена концепция «конкретного» отображения наследования, хотя эта концепция пока не очень хорошо проработана (добавлен тестовый пример для поддержки конкретных отображений поверх полиморфной базы).
исправление поведения «proxy=True» в функции synonym()
Исправлена ошибка, при которой delete-orphan в принципе не работал с отношениями «многие-ко-многим», наличие backref вообще скрывало этот симптом
References: #427
Добавил мьютекс на шаг компиляции маппера. Я неохотно добавлял какие-либо потоки в SA, но здесь он действительно необходим, поскольку мапперы обычно являются «глобальными», и хотя их состояние не меняется во время обычной работы, шаг начальной компиляции значительно изменяет внутреннее состояние, и этот шаг обычно происходит не во время инициализации на уровне модуля (если вы не вызываете compile()), а во время первого запроса
Основная идея «session.merge()» фактически реализована. требуется дополнительное тестирование.
добавлена функция «compile_mappers()» для быстрого компилирования всех картографов
Исправление в MapperExtension create_instance, чтобы имя_сущности корректно ассоциировалось с новым экземпляром
повышение скорости инстанцирования объектов ORM, ускоренная загрузка строк
Недопустимые опции, переданные в строку „cascade“, вызовут исключение
References: #406
Исправлена ошибка в обновлении/истечении срока действия маппера, из-за которой нетерпеливые загрузчики некорректно переполняли списки элементов
References: #407
Исправление в post_update для обеспечения обновления строк даже в сценариях без вставки/удаления
References: #413
добавлено сообщение об ошибке, если вы действительно пытаетесь изменить значения первичного ключа в сущности и затем промыть ее
References: #412
sql¶
В ResultProxy добавлена поддержка функции «fetchmany()»
добавлена поддержка атрибута «ключ» столбца для использования в row[<key>]/row.<key>
изменен подкласс «BooleanExpression» на подкласс от «BinaryExpression», чтобы булевы выражения также могли следовать поведению столбцов-клауз (т.е. label() и т.д.).
В вызовах func.<xxx>, таких как func.if_(), обрезаются символы подчеркивания.
исправление корреляции подзапросов, когда список столбцов оператора select строится с помощью отдельных вызовов append_column(); исправлена ошибка ORM, из-за которой вложенные операторы select не коррелировали с основным select, генерируемым объектом Query.
исправлена корреляция подзапросов, в результате чего подзапрос, содержащий только один элемент FROM, не будет коррелировать с этим элементом, поскольку в запросе должен быть хотя бы один элемент FROM.
По умолчанию параметр «timezone» теперь равен False. Это соответствует поведению Python в отношении времени, а также типам timestamp/time в Postgres (который на данный момент является единственным диалектом, чувствительным к временной зоне)
References: #414
Функция «op()» теперь рассматривается как «операция», а не как «сравнение». Разница в том, что при операции создается двоичное выражение, с которым можно производить дальнейшие операции, а при сравнении создается более строгое булево выражение
Попытка переопределить отраженный столбец первичного ключа как непервичный приводит к ошибке
система типов немного изменена для поддержки TypeDecorators, которые могут быть переопределены диалектом (ок, это не очень понятно, это позволяет сделать твик mssql ниже)
extensions¶
В assign_mapper добавлен аргумент «validate=False», если он равен True, то обеспечивается именование только сопоставленных атрибутов
References: #426
В assign_mapper добавляются функции «options», «instances» (т.е. MyClass.instances())
mysql¶
mysql не согласен с тем, какие кавычки он использует во внешних ключах при выполнении SHOW CREATE TABLE, отражение обновлено для учета всех трех стилей
References: #420
Опции создания таблицы mysql теперь работают на общем passthru, т.е. Table(…, mysql_engine=“InnoDB“, mysql_collate=»latin1_german2_ci», mysql_auto_increment=»5», mysql_<somearg>…), помогает
References: #418
mssql¶
добавлен тип NVarchar (производит NVARCHAR), а также MSUnicode, который обеспечивает Unicode-трансляцию для NVarchar независимо от настройки диалекта convert_unicode.
oracle¶
Поддерживается небольшая поддержка двоичного кода, но все еще необходимо разобраться с тем, как вставлять достаточно большие значения (более 4К). требуется auto_setinputsizes=True в create_engine(), строки должны быть полностью сгенерированы по отдельности и т.д.
misc¶
Исправление начальной проверки таблиц для учета текущей схемы
References: #424
В postgres имеется дополнительный флаг «server_side_cursors=True», который позволяет использовать курсоры на стороне сервера. Они подходят для получения только частичных результатов и необходимы для работы с очень большими неограниченными наборами результатов. Мы хотели бы, чтобы это поведение было принято по умолчанию, но в разных средах наблюдаются разные результаты, и причины этого не были выявлены, поэтому пока мы оставляем эту функцию по умолчанию выключенной. Использует недокументированное поведение psycopg2, недавно обнаруженное в списке рассылки psycopg.
добавлена поддержка «BIGSERIAL» для таблиц postgres с PGBigInteger/autoincrement
исправления в отражении postgres для лучшей обработки присутствия имен схем; спасибо jason (at) ncsmags.com
References: #402
порядок создания ограничений ставит первичный ключ на первое место перед всеми остальными ограничениями; требуется для firebird, неплохая идея для других
References: #408
Исправление в Firebird автозагрузки многопольных внешних ключей
References: #409
Тип Firebird NUMERIC правильно обрабатывает тип без точности
References: #409
0.3.3¶
Released: Fri Dec 15 2006Исправлены строковые предложения FROM, т.е. select(…, from_obj=[«sometext»])
исправления флага passive_deletes, флага lazy=None (noload)
добавлены примеры/документы для работы с большими коллекциями
добавлен метод object_session() в пространство имен sqlalchemy
Исправлена ошибка в QueuePool, благодаря которой он лучше справлялся с повторным подключением к базе данных, которая была недоступна (спасибо Sébastien Lelong), также исправлен метод dispose()
патч, который заставляет MySQL rowcount работать корректно!
References: #396
Исправление перехвата ошибок 2006/2014 в MySQL для корректного перевызова исключения OperationalError
0.3.2¶
Released: Sun Dec 10 2006Исправлена крупная ошибка пула соединений. Устранены ошибки рассинхронизации MySQL, а также предотвращен случайный откат транзакций во всех БД
References: #387
значительные улучшения скорости по сравнению с 0.3.1, чтобы вернуть скорость к уровню 0.2.8
сделал условные десятки вызовов журнала отладки, которые требовали много времени для формирования сообщений журнала
исправлена ошибка в правилах каскадирования, из-за которой весь граф объектов мог быть излишне каскадирован при каскаде сохранения/обновления
различные ускорения в модуле атрибутов
Карта идентичности в сессии по умолчанию не имеет слабой ссылки. Чтобы она была слабой ссылкой, используйте исправление create_session(weak_identity_map=True).
References: #388
MySQL обнаруживает ошибки 2006 (сервер ушел) и 2014 (команды рассинхронизированы) и аннулирует соединение, на котором они возникли.
Исправление типа MySQL bool:
References: #307
Исправления отражений в postgres:
добавлены ключевые слова EXCEPT, INTERSECT, EXCEPT ALL, INTERSECT ALL
References: #247
assign_mapper в расширении assignmapper возвращает созданный маппер
References: #2110
В класс Select добавлена функция label(), когда scalar=True используется для создания скалярного подзапроса, т.е. «select x, y, (select max(foo) from table) AS foomax from table».
добавлены ключевые аргументы onupdate и ondelete для ForeignKey; распространяются на нижележащий ForeignKeyConstraint, если он присутствует. (однако не распространяются в другом направлении)
исправление в session.update() для сохранения «грязного» состояния входящего объекта
Передача селекта в IN через функцию in_() больше не создает «объединение» из нескольких селектов; теперь допускается передача только одного селекта в функцию in_() (если необходимо создать объединение, сделайте его сами)
улучшена поддержка отключения каскадного сохранения обновлений с помощью cascade=»none» и т.д.
В relation() добавлен аргумент «remote_side», используемый только в самореферентных картографах для принудительного определения направления отношения родитель/ребенок. Заменяет использование параметра «foreignkey» для «переключения» направления. Аргумент «foreignkey» устарел для всех случаев использования и со временем будет заменен аргументом, предназначенным для спецификации ForeignKey в картографах.
0.3.1¶
Released: Mon Nov 13 2006orm¶
Каскад «удаления» будет загружать все дочерние объекты, если они еще не были загружены. Это можно отключить (т.е. вернуть старое поведение), установив в relation() значение passive_deletes=True.
внесены изменения в генерацию запросов, чтобы исключить ошибки при циклических загружаемых отношениях (например, обратных ссылках)
Исправлена ошибка, при которой опция eagerload() (равно как и lazyload()) не указывала Query, следует ли использовать «вложенность» при формировании LIMIT-запроса.
Исправлена ошибка в сортировке циклических зависимостей во время прошивки; если объект A содержал циклическую связь «многие-к-одному» с объектом B, а объект B был просто присоединен к объекту A, но сам объект B не был изменен, то синхронизация атрибута первичного ключа B с атрибутом внешнего ключа A «многие-к-одному» не происходила.
References: #360
Реализован аргумент from_obj для query.count, что улучшает работу функции подсчета на selectresults
References: #325
добавлено утверждение на этапе «каскада» ORM-отношений для проверки соответствия класса объекта, присоединенного к родительскому объекту (т.е. если в A.items хранятся объекты B, то при присоединении C к A.items будет выдана ошибка)
Новое расширение sqlalchemy.ext.associationproxy обеспечивает прозрачное отображение «объект-ассоциация». новый пример examples/association/proxied_association.py иллюстрирует.
улучшение наследования одной таблицы для загрузки полных иерархий под целевым классом
исправление тонкого условия в топологической сортировке, когда узел может появиться дважды, для
References: #362
дополнительная переработка топологического сорта, рефакторинг, для
References: #365
»delete-orphan» для определенного типа может быть установлен более чем на один родительский класс; экземпляр является «сиротой» только в том случае, если он не привязан ни к одному из этих родителей
misc¶
несколько новых классов утилит Pool, обновлена документация
»use_threadlocal» на Pool по умолчанию False (аналогично create_engine)
исправлено прямое выполнение скомпилированных объектов
Переработана функция create_engine() для строгого учета входящих **kwargs. Все аргументы ключевых слов должны быть использованы одним из конструкторов диалекта, пула соединений и движка, иначе выдается ошибка TypeError, описывающая полный набор недопустимых kwargs по отношению к выбранной конфигурации диалекта/пула/движка.
MySQL ловит исключение на «describe» и сообщает об этом как NoSuchTableError
Дополнительные исправления в булевых значениях sqlite, которые не работали по умолчанию
исправление цитирования последовательностей в postgres при использовании схем
0.3.0¶
Released: Sun Oct 22 2006general¶
Логирование теперь осуществляется через стандартный модуль python «logging». Параметры ключевого слова «echo» по-прежнему функциональны, но устанавливают/отменяют уровни логирования для соответствующих классов/экземпляров. Все логирование может управляться непосредственно через Python API путем установки уровней INFO и DEBUG для логгеров в пространстве имен «sqlalchemy». Логирование на уровне класса находится под «sqlalchemy.<module>.<classname>», на уровне экземпляра - под «sqlalchemy.<module>.<classname>.0x..<00-FF>». В тестовый набор добавлены аргументы «–log-info» и «–log-debug», которые работают независимо от аргументов –verbose/–quiet. В orm добавлено протоколирование, позволяющее отслеживать конфигурации маппера, итерации строк.
переработана система генерации документации, которая стала гораздо проще по дизайну и более интегрирована с Markdown
orm¶
отслеживание атрибутов изменено для более интеллектуального обнаружения изменений, особенно в случае мутабельных типов. Объекты TypeEngine теперь играют более значительную роль в определении того, как сравнивать два скалярных экземпляра, включая добавление миксина MutableType, который реализуется PickleType. unit-of-work теперь отслеживает «грязный» список как выражение всех постоянных объектов, в которых менеджер атрибутов обнаруживает изменения. Основной исправленной проблемой является обнаружение изменений в объектах PickleType, но также обобщена обработка типов и проверка «измененных» объектов, что делает ее более полной и расширяемой.
широкий рефакторинг архитектур «загрузчика атрибутов» и «опций». ColumnProperty и PropertyLoader определяют свое поведение при загрузке с помощью переключаемых «стратегий», а MapperOptions больше не используют копирование мапперов/свойств для своей работы; вместо этого они распространяются через объекты QueryContext и SelectionContext во время выполнения запроса/экземпляра. Все внутреннее копирование отображателей и свойств, которое использовалось для работы с наследованием, а также options(), было удалено; структура отображателей и свойств стала намного проще, чем раньше, и наглядно представлена в новом модуле „interfaces“.
связано с перестройкой маппера/свойств, внутренний рефакторинг метода mapper instances() для использования объекта SelectionContext для отслеживания состояния во время операции. Небольшое нарушение API: методы append_result() и populate_instances() в MapperExtension теперь имеют немного другую сигнатуру метода в результате изменений; надеемся, что эти методы пока не используются повсеместно.
Метод instances() теперь перенесен в Query, обратно-совместимая версия осталась в Mapper.
Добавлена опция contains_eager() MapperOption, используемая совместно с instances() для указания свойств, которые должны быть загружены из результирующего набора с опережением, используя по умолчанию их обычные имена столбцов, либо транслированные с помощью пользовательской функции перевода строк.
более подробная перестройка схемы фиксации единицы работы для более корректной работы зависимостей внутри циклических стоков… обновлена реализация обхода задач и ведения журналов
полиморфные отображатели (т.е. использующие наследование) теперь производят INSERT-запросы в порядке следования таблиц во всех наследуемых классах
References: #321
добавлена функция автоматического «переключения строк» в маппинге, которая обнаруживает пару ожидающий экземпляр/удаленный экземпляр с одинаковым идентификационным ключом и преобразует INSERT/DELETE в один UPDATE
Упрощение отображения «ассоциаций» для использования преимуществ функции автоматического «переключения рядов»
»Классы пользовательских списков» теперь реализуются через ключевой аргумент «collection_class» в relation(). старый способ по-прежнему работает, но уже устарел
References: #212
добавлен флаг «viewonly» в relation(), позволяющий строить отношения, не влияющие на процесс flush().
добавлен аргумент «lockmode» в базовые функции Query select/get, включая функцию «with_lockmode» для получения копии Query, имеющей режим блокировки по умолчанию. На стороне select аргументы «read»/»update» будут транслироваться в аргумент for_update.
References: #292
Реализована логика «проверки версии» в Query/Mapper, используемая, когда действует version_id_col и query.with_lockmode() используется для получения() экземпляра, который уже загружен
Улучшено поведение post_update; лучше работает над тем, чтобы не обновлять слишком много строк, обновляет только необходимые столбцы
References: #208
внесены изменения в eager loading, в результате которых «цепочка eager» хранится отдельно от обычной настройки mapper, что предотвращает конфликты с работой lazy loader, исправления
References: #308
исправление отложенной загрузки групп
session.flush() не закрывает открытое соединение
References: #346
В mapper добавлен флаг «batch=True»; если False, то save_obj будет полностью сохранять один объект за раз, включая вызовы before_XXXX и after_XXXX
Добавлен аргумент «column_prefix=None» для mapper; добавляет заданную строку (обычно „_“) к атрибутам, основанным на колонках, которые автоматически устанавливаются из таблицы mapper’а
Указание joins в аргументе from_obj запроса query.select() заменит основную таблицу запроса, если эта таблица находится где-то в пределах заданного from_obj. Это позволяет создавать пользовательские joins и outerjoins в запросах без двойного добавления основной таблицы.
References: #315
eagerloading настроен на более вдумчивое присоединение LEFT OUTER JOIN к заданному запросу с поиском пользовательских предложений «FROM», которые, возможно, уже были заданы.
В SelectResults добавлены трансформационные методы join_to и outerjoin_to для построения условий join/outerjoin на основе имен свойств. также добавлен select_from для явного задания параметра from_obj.
удален флаг «is_primary» из маппера.
sql¶
изменен параметр «for_update», чтобы он принимал значения False/True/»nowait» и «read», два последних из которых интерпретируются только Oracle и MySQL
References: #292
В sql-диалект добавлена функция extract() (SELECT extract(field FROM expr))
BooleanExpression включает новый аргумент «negate» для указания соответствующего оператора отрицания, если таковой имеется.
вызов отрицания на клаузулу «IN» или «IS» приведет к «NOT IN», «IS NOT» (в отличие от NOT (x IN y)).
Объекты функций теперь знают, что делать в предложении FROM. Их поведение должно быть таким же, только теперь вы можете делать такие вещи, как select([„*“], from_obj=[func.my_function()]), чтобы получить несколько столбцов из результата, или даже использовать конструкции sql.column(), чтобы назвать возвращаемые столбцы
References: #172
schema¶
В пакете схем проведена значительная чистка, удалены неоднозначные методы, методы, которые больше не нужны. немного более ограниченное использование, больший акцент на явности
Атрибут «primary_key» таблицы Table и других selectables становится множеством, подобным объекту ColumnCollection; упорядочивается, но не индексируется численно. Предложение сравнения между двумя pk, полученными из одних и тех же базовых таблиц (например, двух объектов Alias), может быть сформировано через table1.primary_key==table2.primary_key
ForeignKey(Constraint) поддерживает функцию «use_alter=True» для создания/удаления внешнего ключа через ALTER. Это позволяет устанавливать циркулярные отношения внешних ключей.
Методы append_item() удалены из Table и Column; предпочтительно строить объекты Table/Column/связанные с ними объекты inline, но при необходимости использовать append_column(), append_foreign_key(), append_constraint() и т.д.
table.create() больше не возвращает объект Table, вместо этого не имеет возвращаемого значения. обычно таблицы создаются через метаданные, что предпочтительнее, так как позволяет обрабатывать зависимости таблиц.
добавлены UniqueConstraint (действует на уровне таблицы), CheckConstraint (действует на уровне таблицы или столбца).
index=False/unique=True в Column теперь создает UniqueConstraint, index=True/unique=False - обычный индекс, index=True/unique=True в Column - уникальный индекс. Аргументы ключевых слов „index“ и „unique“ в столбце теперь являются только булевыми; для явных имен и группировок индексов или уникальных ограничений используйте конструкции UniqueConstraint/Index в явном виде.
добавлено значение autoincrement=True для Column; отключает генерацию схемы SERIAL/AUTO_INCREMENT/identity seq для postgres/mysql/mssql, если явно установлено значение False
Объекты TypeEngine теперь имеют методы для работы с копированием и сравнением значений конкретного типа. В настоящее время используется в ORM, см. ниже.
исправлено состояние, возникающее при отражении, когда столбец первичного ключа был явно переопределен, при котором ограничение PrimaryKeyConstraint получало удвоение как отраженного, так и программного столбца
атрибут «foreign_key» для Column и ColumnElement в целом устарел, в пользу атрибута «foreign_keys», основанного на списке/наборе, который учитывает несколько внешних ключей для одного столбца. «foreign_key» возвращает первый элемент в списке/наборе «foreign_keys» или None, если список пуст.
sqlite¶
Тип данных sqlite boolean по умолчанию преобразует False/True в 0/1
исправление типов Дата/Время (SLDate/SLTime); теперь работает не хуже, чем в postgres
References: #335
oracle¶
Oracle имеет экспериментальную поддержку cx_Oracle.TIMESTAMP, которая требует вызова setinputsizes() на курсоре, что теперь разрешено с помощью флага „auto_setinputsizes“ в диалекте oracle.
misc¶
исправлена ошибка 261 (нарушение отражения таблиц для баз данных MS-SQL, чувствительных к регистру)
теперь можно указать порт для pymssql
введена новая опция «auto_identity_insert» для автоматического переключения между режимами «SET IDENTITY_INSERT» при указании значений для столбцов IDENTITY
теперь поддерживаются многоколоночные внешние ключи
исправление отражения столбцов даты/времени
Добавлена поддержка типов NCHAR и NVARCHAR
В псевдонимах не используется «AS»
корректно вызывает ошибку NoSuchTableError при отражении несуществующей таблицы
Пул соединений отслеживает открытые курсоры и автоматически закрывает их, если соединение возвращается к пулу с еще открытыми курсорами. Может быть подвержен влиянию опций, которые заставляют его вместо этого выдавать ошибку или ничего не делать. исправляет проблемы с MySQL, другие
Исправлена ошибка, при которой соединение не теряло транзакцию после фиксации/отката
добавлен метод scalar() в ComposedSQLEngine, ResultProxy
ResultProxy будет закрывать() нижележащий курсор при закрытии самого ResultProxy. Это приведет к автоматическому закрытию курсоров для объектов ResultProxy, у которых были извлечены все строки (или была вызвана функция scalar()).
ResultProxy.fetchall() внутренне использует DBAPI fetchall() для большей эффективности, добавлена также итерация маппера (любезно предоставлено Michael Twomey)