0.3 Changelog

0.3.11

Released: Sun Oct 14 2007

orm

  • [orm]

    Добавлена проверка на объединение из A->B с помощью join() по двум разным m2m-таблицам. Это вызывает ошибку в 0.3, но возможно в 0.4 при использовании псевдонимов.

    References: #687

  • [orm]

    Исправлена небольшая ошибка с выбросом исключений в Session.merge()

  • [orm]

    исправлена ошибка, при которой mapper, будучи связанным с join, в котором одна из таблиц не имела столбцов PK, не определял, что объединенная таблица не имеет PK.

  • [orm]

    Исправлены ошибки, связанные с определением правильных условий синхронизации из пользовательских условий наследования

    References: #769

  • [orm]

    Операция удаления объекта из backref не завершается, если коллекция другой стороны не содержит элемента, поддерживаются коллекции noload

    References: #813

engine

  • [engine]

    исправлено еще одно случайное состояние гонки, которое могло возникнуть при использовании пула с настройкой threadlocal

sql

  • [sql]

    изменить приоритет DISTINCT для предложений типа func.count(t.c.col.distinct()).

  • [sql]

    Исправлено определение внутренних символов „$“ в :bind$params

    References: #719

  • [sql]

    не предполагайте, что критерий join состоит только из объектов-столбцов

    References: #768

  • [sql]

    скорректировано предшествование оператора NOT для соответствия „==“ и другим, так что ~(x==y) дает NOT (x=y), что совместимо с MySQL < 5.0 (не любит «NOT x=y»)

    References: #764

mysql

  • [mysql]

    исправлено указание столбцов YEAR при генерации схемы

sqlite

  • [sqlite]

    проход для строчных дат

mssql

  • [mssql]

    добавлена поддержка столбцов TIME (моделируется с помощью DATETIME)

    References: #679

  • [mssql]

    добавлена поддержка BIGINT, MONEY, SMALLMONEY, UNIQUEIDENTIFIER и SQL_VARIANT

    References: #721

  • [mssql]

    Имена индексов теперь берутся в кавычки при сбросе из отраженных таблиц

    References: #684

  • [mssql]

    теперь можно указать DSN для PyODBC, используя URI типа mssql:///?dsn=bob

oracle

  • [oracle]

    удалены LONG_STRING, LONG_BINARY из «бинарных» типов, чтобы объекты типа не пытались читать их значения как LOB.

    References: #622, #751

misc

  • [postgres]

    При отражении таблиц из альтернативных схем «по умолчанию», помещенному в первичный ключ, т.е. обычно в имя последовательности, имя «схемы» безусловно заключено в кавычки, так что имена схем, требующие кавычек, работают нормально. для имен схем, не требующих кавычек, это несколько излишне, но не вредно.

  • [firebird]

    supports_sane_rowcount() установлено значение False в связи с тикетом #370 (правильный путь).

  • [firebird]

    исправлено отражение свойства Column’s nullable.

0.3.10

Released: Fri Jul 20 2007

general

  • [general]

    новый мьютекс, добавленный в 0.3.9, приводит к сбою функции pool_timeout в условиях гонки; потоки немедленно и без задержки выдают ошибку TimeoutError, если много потоков одновременно переполняют пул. эта проблема была исправлена.

orm

  • [orm]

    очистка сессий, связанных с соединением, SessionTransaction

sql

  • [sql]

    получил метаданные, связанные с соединением, для работы с неявным выполнением

  • [sql]

    спецификации внешних ключей могут иметь любые символы в своих идентификаторах

    References: #667

  • [sql]

    Добавлена возможность учета коммутативности при сравнении бинарных клаузул друг с другом, что улучшает оптимизацию ленивой загрузки ORM

    References: #664

misc

  • [postgres]

    фиксированная максимальная длина идентификатора (63)

    References: #571

0.3.9

Released: Sun Jul 15 2007

general

  • [general]

    улучшенное сообщение об ошибке для NoSuchColumnError

    References: #607

  • [general]

    наконец-то разобрался, как получить версию setuptools, доступную в виде sqlalchemy.__version__.

    References: #428

  • [general]

    Различные аргументы «engine», такие как «engine», «connectable», «engine_or_url», «bind_to» и т.д., присутствуют, но устарели. Все они заменяются одним термином «bind». Вы также устанавливаете «bind» метаданных с помощью metadata.bind = <engine or connection>.

orm

  • [orm]

    Совместимость с 0.4: в Query добавлены функции one(), first() и all(). Почти вся функциональность Query из 0.4 присутствует в 0.3.9 для целей форвард-компиляции.

  • [orm]

    reset_joinpoint() на этот раз действительно работает, обещаю ! позволяет повторно соединяться от корня: query.join([„a“, „b“]).filter(<крит>).reset_joinpoint().join([„a“, „c“]).filter(<какой-то другой критерий>).all() in 0.4 все вызовы join() начинаются от «корня»

  • [orm]

    добавлена синхронизация на этапе построения mapper(), чтобы избежать столкновения потоков, когда существующие ранее mappers компилируются в другом потоке

    References: #613

  • [orm]

    Mapper выдает предупреждение, когда два столбца первичного ключа с одинаковыми именами объединяются в один атрибут. Это часто происходит при отображении на джойны (или наследование).

  • [orm]

    Свойства synonym() полностью поддерживаются всеми операциями Query joining/ with_parent

    References: #598

  • [orm]

    Исправлена очень глупая ошибка при удалении элементов с отношениями «многие-ко-многим» uselist=False

  • [orm]

    Помните все эти вещи про polymorphic_union для наследования объединенных таблиц? Забавно… Для наследования объединенных таблиц он вроде как не нужен, можно просто соединить все таблицы через outerjoin(). Однако UNION все равно применяется, если речь идет о конкретных таблицах (поскольку объединять их не на чем).

  • [orm]

    Небольшое исправление в eager loading для улучшения работы с eager load в полиморфных картографах, использующих прямое предложение «outerjoin»

sql

  • [sql]

    ForeignKey к таблице в схеме, не являющейся схемой по умолчанию, требует явного указания схемы, т.е. ForeignKey(„alt_schema.users.id“)

  • [sql]

    Метаданные теперь могут быть сконструированы с движком или url в качестве первого аргумента, как и BoundMetaData

  • [sql]

    BoundMetaData в настоящее время устарела, и MetaData является ее прямой заменой.

  • [sql]

    DynamicMetaData была переименована в ThreadLocalMetaData. Имя DynamicMetaData устарело и является псевдонимом для ThreadLocalMetaData или обычного MetaData, если threadlocal=False

  • [sql]

    составной первичный ключ представляется в виде неключевого набора, что позволяет использовать составные ключи, состоящие из столбцов с одинаковыми именами; встречается в рамках Join. помогает в сценариях наследования сформулировать правильный PK.

  • [sql]

    Улучшена возможность получения «правильного» и наиболее минимального набора столбцов первичного ключа из соединения, приравнивая внешние ключи и другие приравненные столбцы. Это также в основном помогает сценариям наследования сформулировать наилучший выбор столбцов первичного ключа.

    References: #185

  • [sql]

    добавлен аргумент „bind“ в Sequence.create()/drop(), ColumnDefault.execute()

  • [sql]

    столбцы могут быть переопределены в отраженной таблице с атрибутом «ключ», отличным от имени столбца, в том числе для столбцов с первичным ключом

    References: #650

  • [sql]

    исправлено обнаружение результата «неоднозначный столбец» при наличии в результате дублирующихся имен столбцов

    References: #657

  • [sql]

    Некоторые улучшения в «нацеливании на столбец», возможность сопоставления столбца с «соответствующим» столбцом в другом селекте. Это влияет в основном на возможности ORM по сопоставлению со сложными объединениями

  • [sql]

    Метаданные и все SchemaItems безопасны для использования с pickle. Медленные отражения таблиц могут быть сброшены в pickled-файл для последующего использования. Просто переподключите движок к метаданным после распикировки.

    References: #619

  • [sql]

    добавлен мьютекс для вычисления «переполнения» QueuePool для предотвращения состояния гонки, которое может обойти max_overflow

  • [sql]

    Исправлена группировка составных селектов для получения корректных результатов. В некоторых случаях это приводит к поломке sqlite, но эти случаи все равно давали некорректные результаты, sqlite не поддерживает группированные составные селекты

    References: #623

  • [sql]

    исправлено старшинство операторов, чтобы скобки применялись корректно

    References: #620

  • [sql]

    Вызов <column>.in_() (т.е. без аргументов) вернет «CASE WHEN (<column> IS NULL) THEN NULL ELSE 0 END = 1)», так что во всех случаях будет возвращен NULL или False, а не выброшена ошибка

    References: #545

  • [sql]

    Исправлен критерий «where»/»from» в select() для приема строки юникода в дополнение к обычной строке - оба преобразуются в text()

  • [sql]

    добавлена отдельная функция distinct() в дополнение к column.distinct()

    References: #558

  • [sql]

    result.last_inserted_ids() должен возвращать список, размер которого идентичен размеру ограничения первичного ключа таблицы. Значения, которые были созданы «пассивно» и недоступны через cursor.lastrowid, будут равны None.

  • [sql]

    Определение длинных идентификаторов исправлено на использование >, а не >= для максимальной длины идентификатора

    References: #589

  • [sql]

    Исправлена ошибка, при которой selectable.corresponding_column(selectable.c.col) не возвращала selectable.c.col, если selectable являлся соединением таблицы и другого соединения, включающего ту же таблицу. Испорченное принятие решений в ORM

    References: #593

  • [sql]

    В types.py добавлен тип Interval

    References: #595

mysql

  • [mysql]

    исправлено перехватывание некоторых ошибок, свидетельствующих об обрыве соединения

    References: #625

  • [mysql]

    исправлено экранирование оператора modulo

    References: #624

  • [mysql]

    добавление „fields“ к зарезервированным словам

    References: #590

  • [mysql]

    различные улучшения/исправления отражения

sqlite

  • [sqlite]

    изменил инициализацию диалекта, чтобы он успел предупредить о том, что pysqlite1 слишком стар.

  • [sqlite]

    sqlite лучше справляется с объектами datetime/date/time, смешанными с различными столбцами Date/Time/DateTime

  • [sqlite]

    Строковые вставки в столбцы PK не перезаписываются OID

    References: #603

mssql

  • [mssql]

    Исправлена обработка опций порта для pyodbc

    References: #634

  • [mssql]

    теперь можно отражать начальные и инкрементные значения для столбцов идентификации

  • [mssql]

    предварительная поддержка использования scope_identity() в pyodbc

oracle

  • [oracle]

    Исправления datetime: заработал субсекундный TIMESTAMP, добавлен OracleDate, который поддерживает типы.Date, содержащие только год/месяц/день

    References: #604

  • [oracle]

    добавлен диалектный флаг «auto_convert_lobs», по умолчанию True; приводит к тому, что все LOB-объекты, обнаруженные в наборе результатов, принудительно преобразуются в OracleBinary, чтобы LOB был прочитан() автоматически, если не было типовой карты (т.е. если была выдана текстовая execute()).

  • [oracle]

    Оператор mod „%“ производит MOD

    References: #624

  • [oracle]

    преобразование объектов cx_oracle datetime в Python datetime.datetime при использовании Python 2.3

    References: #542

  • [oracle]

    исправлено преобразование юникода в типе Oracle TEXT

misc

  • [ext]

    итерация по прокси dict-ассоциациям теперь выполняется как dict, а не как InstrumentedList (например, по ключам, а не по значениям)

  • [ext]

    Ассоциативные прокси больше не привязываются жестко к исходным коллекциям, вместо этого они строятся с помощью thunk

    References: #597

  • [ext]

    добавлена функция selectone_by() в assignmapper

  • [postgres]

    исправлено экранирование оператора modulo

    References: #624

  • [postgres]

    добавлена поддержка отражения доменов

    References: #570

  • [postgres]

    Типы, отсутствующие в процессе отражения, разрешаются в тип Null, а не вызывают ошибку

  • [postgres]

    исправление в «schema» выше исправляет отражение внешних ключей из таблицы alt-schema в таблицу public schema

0.3.8

Released: Sat Jun 02 2007

orm

  • [orm]

    В Query добавлен метод reset_joinpoint(), который перемещает «точку соединения» обратно к начальному мапперу. В версии 0.4 поведение метода join() будет изменено на сброс «точки соединения» во всех случаях, поэтому данный метод является временным. Для дальнейшей совместимости убедитесь, что соединения по нескольким отношениям задаются с помощью одного метода join(), т.е. join([„a“, „b“, „c“]).

  • [orm]

    Исправлена ошибка в query.instances(), из-за которой не обрабатывалось более одного дополнительного отображателя или одного дополнительного столбца.

  • [orm]

    »delete-orphan» больше не подразумевает «delete». в настоящее время ведется работа по разделению поведения этих двух операций.

  • [orm]

    отношения «многие-ко-многим» корректно задают тип параметров привязки для операций удаления из таблицы ассоциаций

  • [orm]

    отношения «многие-ко-многим» проверяют соответствие количества строк, удаленных из таблицы ассоциации при операции удаления, ожидаемым результатам

  • [orm]

    session.get() и session.load() передают **kwargs в запрос

  • [orm]

    Исправление полиморфного запроса, позволяющее встраивать исходное полиморфное_соединение в коррелированный подзапрос

    References: #577

  • [orm]

    Исправление джойнов в стиле select_by(<propname>=<экземпляр объекта>) в сочетании с отношениями «многие-ко-многим», ошибка внесена в r2556

  • [orm]

    Аргумент «primary_key» в mapper() передается в «полиморфный» mapper. столбцы первичного ключа в этом списке нормализуются к столбцам локальной таблицы mapper’а.

  • [orm]

    Восстановлено протоколирование «ленивого пункта загрузки» в логгере sa.orm.strategies, удалено в 0.3.7

  • [orm]

    Улучшена поддержка ускоренной загрузки свойств из mappers, которые отображаются на операторы select(); т.е. eagerloader лучше находит нужный selectable, к которому можно присоединить LEFT OUTER JOIN.

sql

  • [sql]

    Класс _Label переопределяет compare_self для возврата своего конечного объекта. То есть, если сказать someexpr.label(„foo“) == 5, то будет выдано правильное «someexpr == 5».

  • [sql]

    _Label распространяет «_hide_froms()», чтобы скалярные селекты вели себя более корректно по отношению к предложению FROM #574

  • [sql]

    исправление генерации длинных имен при использовании oid_column в качестве порядка по (oids активно используется в запросах к мапперу)

  • [sql]

    Значительное повышение скорости работы ResultProxy, предварительное кэширование реализаций диалекта TypeEngine и экономия на вызовах функций для каждого столбца

  • [sql]

    Скобки применяются к клаузам с помощью новой конструкции _Grouping. Использование приоритета операторов для более разумного применения скобок к клаузам обеспечивает более чистую вложенность клаузов (не мутирует клаузы, помещенные в другие клаузы, т.е. нет флага „parens“)

  • [sql]

    Добавлено ключевое слово „modifier“, работает как func.<foo>, только не добавляет скобки. например, select([modifier.DISTINCT(…)]) и т.д.

  • [sql]

    снято ограничение «запрет на группировку by в селекте, являющемся частью UNION».

    References: #578

mysql

  • [mysql]

    Практически все типы столбцов MySQL теперь поддерживаются для объявления и отражения. Добавлены NCHAR, NVARCHAR, VARBINARY, TINYBLOB, LONGBLOB, YEAR

  • [mysql]

    Пасстаф sqltypes.Binary теперь всегда строит BLOB, что позволяет избежать проблем с очень старыми версиями баз данных

  • [mysql]

    поддержка деклараций CHARACTER SET и COLLATE на уровне столбцов, а также стенограммы ASCII, UNICODE, NATIONAL и BINARY.

misc

  • [engines]

    добавлена функция detach() для Connection, позволяющая отделять базовое DBAPI-соединение от его пула, закрывая его при dereference/close(), а не повторно используя пул.

  • [engines]

    добавление функции invalidate() к Connection приводит к немедленному аннулированию Connection и лежащего в его основе DBAPI-соединения.

  • [firebird]

    установить максимальную длину идентификатора равной 31

  • [firebird]

    Для функции supports_sane_rowcount() установлено значение False в связи с тикетом #370. Функция versioned_id_col не будет работать в FB.

  • [firebird]

    некоторые исправления в исполнении

  • [firebird]

    новая реализация ассоциативного прокси, реализующая полные прокси для коллекций отношений на основе списков, диктов и множеств

  • [firebird]

    добавлен Orderlist, класс пользовательского списка, который синхронизирует атрибут объекта с его позицией в списке

  • [firebird]

    небольшое исправление SelectResultsExt, чтобы он не обходил сам себя при выполнении select().

  • [firebird]

    в assignmapper добавлены filter(), filter_by()

0.3.7

Released: Sun Apr 29 2007

orm

  • [orm]

    исправлена критическая проблема, когда после использования options(eagerload()) картограф всегда применял «обертывающее» поведение запроса для всех последующих запросов LIMIT/OFFSET/DISTINCT, даже если для этих запросов не применялась ускоренная загрузка.

  • [orm]

    Добавлен метод query.with_parent(someinstance). осуществляет поиск целевого экземпляра по критерию lazy join из родительского экземпляра. принимает необязательную строку «property» для выделения нужного отношения. также добавлена статическая версия Query.query_from_parent(instance, property).

    References: #541

  • [orm]

    усовершенствован запрос query.XXX_by(someprop=someinstance) для использования методологии, аналогичной with_parent, т.е. с использованием предложения «lazy», которое не позволяет добавлять таблицу удаленного экземпляра в SQL, что делает возможными более сложные условия

    References: #554

  • [orm]

    В запрос добавлены генеративные версии агрегатов, т.е. sum(), avg() и т.д. Используются через query.apply_max(), apply_sum() и т.д. #552

  • [orm]

    исправление использования distinct() или distinct=True в сочетании с join() и аналогичными

  • [orm]

    Соответственно генерации имен label/bindparam, нетерпеливые загрузчики генерируют детерминированные имена для создаваемых ими псевдонимов с помощью md5-хэшей.

  • [orm]

    улучшены/исправлены классы пользовательских коллекций при передаче им классов или подклассов «set»/»sets.Set» (при ленивой загрузке они все равно искали методы append())

  • [orm]

    восстановлена старая ORM-функция «column_property()» (раньше называлась «column()») для принудительного добавления любого выражения столбца в качестве свойства на маппере, особенно тех, которые не присутствуют в отображаемом selectable. Это позволяет добавлять «скалярные выражения» любого типа в качестве отношений (хотя у них есть проблемы с нетерпеливой загрузкой).

  • [orm]

    исправление отношений «многие-ко-многим» для полиморфных отображателей

    References: #533

  • [orm]

    прогресс в использовании session.merge(), а также объединение ее использования с entity_name

    References: #543

  • [orm]

    обычная корректировка отношений между наследующими картографами, в данном случае создание relation()s к картографам подклассов, где условия присоединения берутся из таблицы суперкласса

sql

  • [sql]

    Ключи() столбцов результирующего набора не выделяются строчными буквами, а возвращаются в том виде, в котором они выражены в cursor.description. обратите внимание, что из-за этого в oracle имена столбцов будут выделены заглавными буквами.

  • [sql]

    Добавлена предварительная поддержка юникодных имен таблиц, столбцов и операторов SQL для баз данных, которые могут их поддерживать. Пока работает с sqlite и postgres. MySQL почти работает, за исключением того, что не работает функция has_table(). Reflection тоже работает.

  • [sql]

    тип Unicode теперь является прямым подклассом String, который теперь содержит всю логику «convert_unicode». Это позволяет лучше справляться с различными ситуациями, связанными с юникодом, которые возникают в таких СУБД, как MS-SQL, и позволяет создавать подклассы типа данных Unicode.

    References: #522

  • [sql]

    ClauseElements теперь можно использовать в предложениях in_(), например, для связывания параметров и т.д. #476

  • [sql]

    Реализованы обратные операторы для элементов CompareMixin, что позволяет использовать выражения типа «5 + somecolumn» и т.д. #474

  • [sql]

    Критерий «where» в операциях update() и delete() теперь коррелирует встроенные операторы select() с обновляемой или удаляемой таблицей. Это работает так же, как и корреляция вложенных операторов select(), и может быть отключено с помощью флага correlate=False во встроенном select().

  • [sql]

    Метки столбцов теперь генерируются на этапе компиляции, что означает, что их длина зависит от диалекта. Так, на oracle метка, усеченная до 30 символов, на postgres будет иметь длину 63 символа. Кроме того, истинное имя метки всегда подключается в качестве аксессора к родительскому Selectable, поэтому нет необходимости обращать внимание на «усеченные» имена меток.

    References: #512

  • [sql]

    Теперь метка столбца и параметр bind param «truncation» также генерируют детерминированные имена, основанные на их упорядочивании в компилируемом полном операторе. Это означает, что один и тот же оператор будет выдавать одну и ту же строку при всех перезапусках приложения и позволит лучше работать кэшированию плана запросов к БД.

  • [sql]

    »Мини» метки столбцов, генерируемые при использовании подзапросов и предназначенные для обхода глючного поведения SQLite, не понимающего «foo.id» как эквивалент «id», теперь генерируются только в том случае, если эти именованные столбцы выбраны из (части)

    References: #513

  • [sql]

    метод label() на ColumnElement будет корректно распространять TypeEngine базового элемента на метку, включая label(), созданную из оператора select() со скалярным=True.

  • [sql]

    MS-SQL лучше определяет, когда запрос является подзапросом, и умеет не генерировать фразы ORDER BY для таких запросов

    References: #513

  • [sql]

    исправление того, что аргумент fetchmany() «size» был позиционным в большинстве dbapis

    References: #505

  • [sql]

    Передача None в качестве аргумента в func.<something> приведет к появлению аргумента NULL

  • [sql]

    Строки запросов в юникодных URL получают ключи, закодированные в ascii для совместимости **kwargs

  • [sql]

    Небольшая доработка сырого изменения execute() для поддержки кортежей для позиционных параметров, а не только списков

    References: #523

  • [sql]

    исправление в конструкции case() для распространения типа первого условия WHEN в качестве возвращаемого типа оператора case

extensions

  • [extensions]

    большое исправление в AssociationProxy, чтобы несколько объектов AssociationProxy могли быть связаны с одной коллекцией ассоциаций.

  • [extensions]

    assign_mapper называет методы в соответствии с их ключами (т.е. __name__) #551

mysql

  • [mysql]

    поддержка SSL-аргументов, передаваемых в строке запроса URL, с префиксом «ssl_», любезно предоставленным terjeros@gmail.com.

  • [mysql] [<schemaname>]

    Для определения существования таблицы mysql использует команду «DESCRIBE.<tablename>», отлавливая исключения, если таблица не существует. Поддерживаются юникодные имена таблиц, а также имена схем. протестировано на MySQL5, но должно работать и в серии 4.1. (#557)

sqlite

  • [sqlite]

    Устранено глупое поведение, при котором sqlite отражал UNIQUE-индексы как часть первичного ключа (?!)

mssql

  • [mssql]

    pyodbc теперь является предпочтительным DB-API для MSSQL, и если модуль не запрашивается специально, то он будет загружен первым при проверке модуля.

  • [mssql]

    Вместо @@IDENTITY теперь используется @@SCOPE_IDENTITY. Это поведение может быть переопределено с помощью параметра ключевого слова engine_connect «use_scope_identity», который также может быть указан в dburi.

oracle

  • [oracle]

    Небольшое исправление, позволяющее последовательно компилировать один и тот же объект SELECT, содержащий LIMIT/OFFSET. Диалект oracle должен был модифицировать объект, чтобы он имел ROW_NUMBER OVER, и не выполнял всю серию шагов при последовательной компиляции.

misc

  • [engines]

    модуль warnings, используемый для выдачи предупреждений (вместо протоколирования)

  • [engines]

    очистка стратегий импорта DBAPI во всех движках

    References: #480

  • [engines]

    рефакторинг внутренних компонентов движка, снижающий сложность и количество кодовых путей; размещение большего количества состояний внутри ExecutionContext для более диалектного управления обработкой курсоров, наборов результатов. ResultProxy полностью рефакторизован и имеет две версии «буферизованных» наборов результатов, используемых для различных целей.

  • [engines]

    поддержка курсоров на стороне сервера, полностью функционирующая в postgres.

    References: #514

  • [engines]

    улучшена система автопроверки соединений, потерявших базовую базу данных, с помощью диалектного определения исключений, соответствующих сообщениям об ошибках, связанных с отключением базы данных. Кроме того, при обнаружении состояния «соединение больше не открыто» весь пул соединений удаляется и заменяется новым экземпляром. #516

  • [engines]

    Диалекты в sqlalchemy.databases становятся точками входа в setuptools. Загрузка встроенных диалектов баз данных работает так же, как и всегда, но если таковых не найдено, то придется обратиться к pkg_resources для загрузки внешнего модуля

    References: #521

  • [engines]

    Engine содержит атрибут «url», ссылающийся на объект url.URL, используемый функцией create_engine().

  • [informix]

    Добавлена поддержка informix ! благодаря Джеймсу Чжану, который приложил массу усилий.

0.3.6

Released: Fri Mar 23 2007

orm

  • [orm]

    весь набор функций расширения 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() более удобны в использовании.

  • [orm]

    Возвращаемое значение для нескольких отображений, используемых с функцией instances(), теперь возвращает картезианское произведение запрошенного списка отображений, представленное в виде списка кортежей. Это соответствует документированному поведению. Чтобы экземпляры соответствовали друг другу, при использовании этой функции отключается «уникализация».

  • [orm]

    Query имеет генеративные методы add_entity() и add_column(). Они добавляют заданный mapper/class или ColumnElement в запрос во время компиляции и применяют их в методе instances(). пользователь отвечает за построение разумных условий объединения (иначе можно получить полное картезианское произведение). набор результатов - это список кортежей, не уникальных.

  • [orm]

    Строки и столбцы также могут быть отправлены в *args функции instances(), где именно эти столбцы результатов будут входить в кортежи результатов.

  • [orm]

    В query.select() можно передать не только полную конструкцию select() (что в любом случае сработало), но и query.selectfirst(), query.selectone(), которые будут использованы как есть (т.е. запрос не компилируется). работает аналогично передаче результатов в instances().

  • [orm]

    Ускоренная загрузка не будет «псевдонизировать» предложения «order by», которые были помещены в оператор select не самим ускоренным загрузчиком, чтобы устранить возможность дублирования столбцов, как показано на рисунке. Однако это означает, что вы должны быть более внимательны к столбцам, помещенным в «order by» в Query.select(), если вы явно назвали их в своем критерии (т.е. вы не можете полагаться на то, что ускоренный загрузчик добавит их за вас).

    References: #495

  • [orm]

    В Session добавлен удобный многофункциональный метод «identity_key()», позволяющий генерировать идентификационные ключи для значений первичных ключей, экземпляров и строк, любезно предоставленный Дэниелом Миллером

  • [orm]

    таблица «многие-ко-многим» будет корректно обрабатываться даже для операций, которые происходят на стороне «обратной ссылки

    References: #249

  • [orm]

    Добавлен каскад «refresh-expire», позволяющий вызовам refresh() и expire() распространяться по отношениям.

    References: #492

  • [orm]

    Исправления в полиморфных отношениях, в том числе правильная генерация ленивых клаузул для отношений «многие-к-одному» в полиморфных отображениях. также исправлено определение «направления», более конкретное выделение столбцов, которые принадлежат полиморфному объединению, и тех, которые не принадлежат.

    References: #493

  • [orm]

    Некоторые исправления в расчетах отношений при использовании «viewonly=True» для подтягивания в условие соединения других таблиц, не являющихся родителями в связке родитель/дочь отношения

  • [orm]

    исправления flush на циклических референтных отношениях, содержащих ссылки на другие экземпляры вне циклической цепочки, когда некоторые объекты в цикле фактически не являются частью flush

  • [orm]

    поставить агрессивную проверку на ошибку «промывка объекта A с коллекцией объектов B, но вы поместили в коллекцию объект C» - даже если C является подклассом B, если только маппер B не загружается полиморфно. В противном случае в коллекцию позже будет загружен «B», который должен быть «C» (поскольку он не полиморфен), что нарушит двунаправленные связи (т.е. у C есть свой A, но обратная ссылка A будет лениво загружать его как другой экземпляр типа «B»). Эта проверка будет кусать некоторых из вас, кто делает это без проблем, поэтому в сообщении об ошибке будет также записан флаг «enable_typechecks=False», чтобы отключить эту проверку. Но имейте в виду, что двунаправленные отношения, в частности, становятся хрупкими без этой проверки.

    References: #500

sql

  • [sql]

    Имена bindparam() теперь повторяются! укажите два разных bindparam()с одинаковым именем в одном операторе, и ключ будет общим. правильные позиционные/именованные аргументы транслируются во время компиляции. для старого поведения «алиасинга» параметров связывания с конфликтующими именами укажите «unique=True» - эта опция по-прежнему используется внутри системы для всех автоматически генерируемых (основанных на значениях) параметров связывания.

  • [sql]

    Немного улучшена поддержка связывания параметров в качестве предложений столбцов, либо через bindparam(), либо через literal(), т.е. select([literal(„foo“)])

  • [sql]

    Метаданные могут привязываться к движку либо с помощью ключей «url» или «engine» в конструкторе, либо с помощью метода connect(). BoundMetaData идентична MetaData, за исключением того, что требуется параметр engine_or_url. DynamicMetaData аналогична и по умолчанию обеспечивает потоково-локальные соединения.

  • [sql]

    exists() становится пригодной для использования в качестве самостоятельного selectable, а не только в предложении WHERE, т.е. exists([columns], criterion).select()

  • [sql]

    Коррелирующие подзапросы работают внутри ORDER BY, GROUP BY

  • [sql]

    исправлено выполнение функций при явном подключении, т.е. conn.execute(func.dosomething())

  • [sql]

    Флаг use_labels в select() не будет автоматически создавать метки для буквальных элементов текстовых колонок, поскольку мы не можем делать никаких предположений о тексте. Для создания меток для буквальных колонок можно сказать «somecol AS somelabel», или использовать literal_column(«somecol»).label(«somelabel»)

  • [sql]

    Для литеральных столбцов не будет происходить цитирование, когда они «проксируются» в коллекцию столбцов для своего selectable (передается флаг is_literal). литеральные столбцы указываются через literal_column(«somestring»).

  • [sql]

    Добавлен логический аргумент «fold_equivalents» в Join.select(), который удаляет из результирующего предложения столбцы-дубликаты, которые, как известно, эквивалентны по условию объединения. Это очень удобно при построении подзапросов объединений, на которые Postgres жалуется, если в них присутствуют дублирующиеся имена столбцов.

  • [sql]

    исправлен флаг use_alter для ForeignKeyConstraint

    References: #503

  • [sql]

    исправлено использование только для 2.4 «reversed» в файле topological.py

    References: #506

  • [sql]

    для хакеров, рефакторинг системы «посетителей» ClauseElement и SchemaItem таким образом, что обход элементов контролируется самим ClauseVisitor, используя метод visitor.traverse(item). методы accept_visitor() по-прежнему могут вызываться напрямую, но не будут выполнять обход дочерних элементов. ClauseElement/SchemaItem теперь имеют настраиваемый метод get_children(), возвращающий коллекцию дочерних элементов для каждого родительского объекта. Это позволяет сделать полный обход элементов ясным и недвусмысленным (а также протоколируемым), с легким способом ограничения обхода (достаточно передать флаги, которые будут подхвачены соответствующими методами get_children()).

    References: #501

  • [sql]

    Параметр «else_» в операторе case теперь корректно работает при установке в ноль.

extensions

  • [extensions]

    Метод options() в SelectResults теперь реализован «генеративно», как и остальные методы SelectResults. Но сейчас вы все равно будете использовать только Query.

    References: #472

  • [extensions]

    Метод query() добавлен в assignmapper. Это помогает ориентироваться во всех новых генеративных методах на Query.

mysql

  • [mysql]

    В MSString добавлена функция **kwargs, помогающая отражать непонятные типы (например, «varchar() binary» в MS 4.0)

  • [mysql]

    добавлен явный тип MSTimeStamp, который вступает в силу при использовании types.TIMESTAMP.

oracle

  • [oracle]

    добился работы binary для ввода любого размера ! cx_oracle работает нормально, это была моя ошибка, так как для setinputsizes передавался BINARY, а не BLOB (также юнит-тесты даже не задавали размер ввода).

  • [oracle]

    также исправлено чтение/запись CLOB в отдельном наборе изменений.

  • [oracle]

    auto_setinputsizes по умолчанию принимает значение True для Oracle, исправлены случаи, когда он некорректно распространял плохие типы.

misc

  • [ms-sql]

    удален секундный ввод данных о типах столбцов DATE (возможно

    следует вообще убрать время)

  • [ms-sql]

    Нулевые значения в float-полях больше не вызывают ошибок

  • [ms-sql]

    LIMIT с OFFSET теперь вызывает ошибку (в MS-SQL нет поддержки OFFSET)

  • [ms-sql]

    добавлена возможность использования MSSQL-типа VARCHAR(max) вместо TEXT для больших строковых полей нестандартного размера. Для ее включения используйте новый параметр «text_as_varchar».

    References: #509

  • [ms-sql]

    Предложения ORDER BY без LIMIT теперь удаляются из подзапросов, так как MS-SQL запрещает такое использование

  • [ms-sql]

    очистка кода импорта модулей; определяемый модуль DB-API; более явное упорядочивание предпочтений модулей.

    References: #480

0.3.5

Released: Thu Feb 22 2007

orm

  • [orm] [bugs]

    очередной рефакторинг вычисления отношений. Позволяет более корректно вести себя в ORM с отношениями от/к/между картографами, в частности, с полиморфными картографами, а также использовать их в Query, SelectResults. билеты include,,,.

    References: #439, #441, #448

  • [orm] [bugs]

    Устранен устаревший способ указания пользовательских коллекций на классах; теперь необходимо использовать опцию «collection_class». Старый способ приводил к конфликтам, когда люди использовали assign_mapper(), который теперь исправляет метод «options», в сочетании с отношением с именем «options». (отношения имеют приоритет над методами assign_mapper, пропатченными обезьяной).

  • [orm] [bugs]

    Опция запроса extension() распространяется на метод Mapper._instance(), так что все методы, связанные с загрузкой, будут вызваны

    References: #454

  • [orm] [bugs]

    Если для отношения не будет возвращено ни одной строки, то не произойдет сбоя.

  • [orm] [bugs]

    Исправлена ошибка загрузки отношения eager relation при использовании отношения eager relation для нескольких классов-потомков

    References: #486

  • [orm] [bugs]

    исправление для очень больших топологических сортов, любезно предоставлено ants.aasma at gmail

    References: #423

  • [orm] [bugs]

    eager loading несколько более строго относится к обнаружению «самореферентных» отношений, в частности, между полиморфными отображателями. Это приводит к «ухудшению» eager load по сравнению с lazy loading.

  • [orm] [bugs]

    Улучшена поддержка сложных запросов, встроенных в критерий «where» для query.select()

    References: #449

  • [orm] [bugs]

    Опции mapper, такие как eagerload(), lazyload(), deferred(), будут работать для отношений «synonym()».

    References: #485

  • [orm] [bugs]

    исправлена ошибка, при которой каскадные операции некорректно включали в каскад удаленные элементы коллекции

    References: #445

  • [orm] [bugs]

    исправлена ошибка удаления отношений, когда дочерний элемент «один-ко-многим» перемещается к новому родителю в одной единице работы

    References: #478

  • [orm] [bugs]

    исправлена ошибка удаления отношений, когда при ручном удалении или использовании каскада «delete» без «delete-orphan» родитель/ребенок с единственным столбцом в качестве PK/FK у ребенка возникала ошибка «blank out the primary key».

  • [orm] [bugs]

    исправление в отложенном режиме, чтобы операция загрузки не происходила ошибочно, когда установлены только атрибуты PK col

  • [orm] [enhancements]

    Реализованный аргумент foreign_keys для mapper. Используется совместно с аргументами primaryjoin/secondaryjoin для указания/определения внешних ключей, определенных для экземпляра Table.

    References: #385

  • [orm] [enhancements]

    contains_eager(„foo“) автоматически подразумевает eagerload(„foo“)

  • [orm] [enhancements]

    В функции contains_eager() добавлен аргумент «alias». с его помощью можно указать строковое имя или экземпляр Alias псевдонима, используемого в запросе для загружаемых с нетерпением дочерних элементов. проще использовать, чем «декоратор»

  • [orm] [enhancements]

    добавлена опция «contains_alias()» для сопоставления набора результатов с псевдонимом сопоставленной таблицы

  • [orm] [enhancements]

    добавлена поддержка оператора py2.5 «with» для SessionTransaction

    References: #468

sql

  • [sql]

    Значение параметра «case_sensitive» теперь по умолчанию принимает значение True, независимо от регистра идентификатора, если специально не установлено значение False. Это связано с тем, что объект может быть обозначен как нечто другое, содержащее смешанный регистр, и распространение значения «case_sensitive=False» нарушает это. Другие исправления, связанные с цитированием при использовании меток и «фальшивых» объектов столбцов

  • [sql]

    добавлен метод «supports_execution()» для ClauseElement, чтобы отдельные виды клаузул могли выражать, подходят ли они для выполнения… например, можно выполнить «select», но не «Table» или «Join».

  • [sql]

    Исправлена передача аргументов для прямого текстового execute() на движке, соединении. можно обрабатывать *args или экземпляр списка для позиционных, **kwargs или экземпляр dict для именованных аргументов, или список списков или dicts для вызова executemany()

  • [sql]

    Небольшое исправление в BoundMetaData для приема URL в юникоде или строке

  • [sql]

    исправлена генерация PrimaryKeyConstraint с именем, любезно предоставленным andrija at gmail

    References: #466

  • [sql]

    исправлена генерация ограничений CHECK на столбцы

    References: #464

  • [sql]

    исправления в операции tometadata() для распространения ограничений на уровне столбцов и таблиц

extensions

  • [extensions]

    добавлен метод distinct() в SelectResults. в общем случае он должен иметь значение только при использовании count().

  • [extensions]

    в SelectResults добавлен метод options(), эквивалентный query.options()

    References: #472

  • [extensions]

    В ActiveMapper добавлен необязательный словарь __table_opts__, который будет передавать kw-опции объектам Table

    References: #462

  • [extensions]

    в assign_mapper добавлены selectfirst(), selectfirst_by()

    References: #467

mysql

  • [mysql]

    исправление отражения на старых БД, которые могли возвращать тип array() для операторов «show variables like»

mssql

  • [mssql]

    предварительная поддержка pyodbc (Ура!)

    References: #419

  • [mssql]

    добавлена улучшенная поддержка типов NVARCHAR

    References: #298

  • [mssql]

    исправление логики фиксации в pymssql

  • [mssql]

    исправление для query.get() со схемой

    References: #456

  • [mssql]

    исправление для нецелых отношений

    References: #473

  • [mssql]

    Модуль DB-API теперь можно выбирать во время выполнения программы

    References: #419

  • [mssql] [415] [481] [tickets:422]

    теперь проходит гораздо больше модульных тестов

  • [mssql]

    улучшена совместимость unittest с ANSI-функциями

    References: #479

  • [mssql]

    Улучшена поддержка неявной последовательности столбцов PK с автовставкой

    References: #415

  • [mssql]

    исправление пустого пароля в adodbapi

    References: #371

  • [mssql]

    исправления для обеспечения работы модульных тестов с pyodbc

    References: #481

  • [mssql]

    Исправление авто_идентичности_вставки в запросе db-url

  • [mssql]

    добавление query_timeout в параметры запроса к db-url. в настоящее время работает только для pymssql

  • [mssql]

    протестирован с pymssql 0.8.0 (который теперь LGPL)

oracle

  • [oracle]

    При возврате «rowid» в качестве столбца ORDER BY или при использовании ROW_NUMBER OVER диалект oracle проверяет, к какому selectable он применяется, и переключается на таблицу PK, если она неприменима, т.е. для UNION. Проверка для DISTINCT, GROUP BY (других мест, где rowid недействителен) все еще остается TODO.

    References: #436

  • [oracle]

    Последовательности на непк столбце будут корректно срабатывать при INSERT

  • [oracle]

    добавлена поддержка PrefetchingResultProxy для предварительной выборки LOB-колонок, если известно, что они присутствуют, исправления

    References: #435

  • [oracle]

    реализовано отражение таблиц на основе синонимов, в том числе через dblinks

    References: #379

  • [oracle]

    выдает предупреждение в журнал, когда связанная таблица не может быть отражена из-за определенных ошибок в правах доступа

    References: #363

misc

  • [postgres]

    улучшенное отражение последовательностей для таблиц с альтернативной схемой

    References: #442

  • [postgres]

    Последовательности на непк столбце будут корректно срабатывать при INSERT

  • [postgres]

    добавлены тип PGInterval, тип PGInet

    References: #444, #460

0.3.4

Released: Tue Jan 23 2007

general

  • [general]

    глобальное изменение «insure»->»ensure». в американском английском «insure» действительно в значительной степени взаимозаменяем с «ensure» (так говорит словарь), так что я не совсем безграмотен, но он определенно неоптимален по сравнению с «ensure», который не является однозначным.

orm

  • [orm]

    Проделал первую дырку в банке с червями: если сказать query.select_by(somerelationname=someinstance), то будет создано соединение столбцов первичного ключа, представленного маппером «somerelationname», с реальным первичным ключом в «someinstance».

  • [orm]

    Переработано взаимодействие отношений с «полиморфными» отображениями, т.е. отображениями, имеющими select_table, а также полиморфные флаги. Улучшено определение правильных условий присоединения, взаимодействие с условиями присоединения, определяемыми пользователем, и поддержка самореферентных полиморфных отображений.

  • [orm]

    В связи с полиморфными отношениями отображения, углублена проверка ошибок при компиляции отношений, для выявления неоднозначного «primaryjoin» в случае, когда обе стороны отношения имеют ссылки на внешний ключ в условии primary join. также ужесточены условия, используемые для определения «направления отношения», связывающие «внешний ключ» отношения с «primaryjoin».

  • [orm]

    немного улучшена концепция «конкретного» отображения наследования, хотя эта концепция пока не очень хорошо проработана (добавлен тестовый пример для поддержки конкретных отображений поверх полиморфной базы).

  • [orm]

    исправление поведения «proxy=True» в функции synonym()

  • [orm]

    Исправлена ошибка, при которой delete-orphan в принципе не работал с отношениями «многие-ко-многим», наличие backref вообще скрывало этот симптом

    References: #427

  • [orm]

    Добавил мьютекс на шаг компиляции маппера. Я неохотно добавлял какие-либо потоки в SA, но здесь он действительно необходим, поскольку мапперы обычно являются «глобальными», и хотя их состояние не меняется во время обычной работы, шаг начальной компиляции значительно изменяет внутреннее состояние, и этот шаг обычно происходит не во время инициализации на уровне модуля (если вы не вызываете compile()), а во время первого запроса

  • [orm]

    Основная идея «session.merge()» фактически реализована. требуется дополнительное тестирование.

  • [orm]

    добавлена функция «compile_mappers()» для быстрого компилирования всех картографов

  • [orm]

    Исправление в MapperExtension create_instance, чтобы имя_сущности корректно ассоциировалось с новым экземпляром

  • [orm]

    повышение скорости инстанцирования объектов ORM, ускоренная загрузка строк

  • [orm]

    Недопустимые опции, переданные в строку „cascade“, вызовут исключение

    References: #406

  • [orm]

    Исправлена ошибка в обновлении/истечении срока действия маппера, из-за которой нетерпеливые загрузчики некорректно переполняли списки элементов

    References: #407

  • [orm]

    Исправление в post_update для обеспечения обновления строк даже в сценариях без вставки/удаления

    References: #413

  • [orm]

    добавлено сообщение об ошибке, если вы действительно пытаетесь изменить значения первичного ключа в сущности и затем промыть ее

    References: #412

sql

  • [sql]

    В ResultProxy добавлена поддержка функции «fetchmany()»

  • [sql]

    добавлена поддержка атрибута «ключ» столбца для использования в row[<key>]/row.<key>

  • [sql]

    изменен подкласс «BooleanExpression» на подкласс от «BinaryExpression», чтобы булевы выражения также могли следовать поведению столбцов-клауз (т.е. label() и т.д.).

  • [sql]

    В вызовах func.<xxx>, таких как func.if_(), обрезаются символы подчеркивания.

  • [sql]

    исправление корреляции подзапросов, когда список столбцов оператора select строится с помощью отдельных вызовов append_column(); исправлена ошибка ORM, из-за которой вложенные операторы select не коррелировали с основным select, генерируемым объектом Query.

  • [sql]

    исправлена корреляция подзапросов, в результате чего подзапрос, содержащий только один элемент FROM, не будет коррелировать с этим элементом, поскольку в запросе должен быть хотя бы один элемент FROM.

  • [sql]

    По умолчанию параметр «timezone» теперь равен False. Это соответствует поведению Python в отношении времени, а также типам timestamp/time в Postgres (который на данный момент является единственным диалектом, чувствительным к временной зоне)

    References: #414

  • [sql]

    Функция «op()» теперь рассматривается как «операция», а не как «сравнение». Разница в том, что при операции создается двоичное выражение, с которым можно производить дальнейшие операции, а при сравнении создается более строгое булево выражение

  • [sql]

    Попытка переопределить отраженный столбец первичного ключа как непервичный приводит к ошибке

  • [sql]

    система типов немного изменена для поддержки TypeDecorators, которые могут быть переопределены диалектом (ок, это не очень понятно, это позволяет сделать твик mssql ниже)

extensions

  • [extensions]

    В assign_mapper добавлен аргумент «validate=False», если он равен True, то обеспечивается именование только сопоставленных атрибутов

    References: #426

  • [extensions]

    В assign_mapper добавляются функции «options», «instances» (т.е. MyClass.instances())

mysql

  • [mysql]

    mysql не согласен с тем, какие кавычки он использует во внешних ключах при выполнении SHOW CREATE TABLE, отражение обновлено для учета всех трех стилей

    References: #420

  • [mysql]

    Опции создания таблицы mysql теперь работают на общем passthru, т.е. Table(…, mysql_engine=“InnoDB“, mysql_collate=»latin1_german2_ci», mysql_auto_increment=»5», mysql_<somearg>…), помогает

    References: #418

mssql

  • [mssql]

    добавлен тип NVarchar (производит NVARCHAR), а также MSUnicode, который обеспечивает Unicode-трансляцию для NVarchar независимо от настройки диалекта convert_unicode.

oracle

  • [oracle]

    Поддерживается небольшая поддержка двоичного кода, но все еще необходимо разобраться с тем, как вставлять достаточно большие значения (более 4К). требуется auto_setinputsizes=True в create_engine(), строки должны быть полностью сгенерированы по отдельности и т.д.

misc

  • [postgres]

    Исправление начальной проверки таблиц для учета текущей схемы

    References: #424

  • [postgres]

    В postgres имеется дополнительный флаг «server_side_cursors=True», который позволяет использовать курсоры на стороне сервера. Они подходят для получения только частичных результатов и необходимы для работы с очень большими неограниченными наборами результатов. Мы хотели бы, чтобы это поведение было принято по умолчанию, но в разных средах наблюдаются разные результаты, и причины этого не были выявлены, поэтому пока мы оставляем эту функцию по умолчанию выключенной. Использует недокументированное поведение psycopg2, недавно обнаруженное в списке рассылки psycopg.

  • [postgres]

    добавлена поддержка «BIGSERIAL» для таблиц postgres с PGBigInteger/autoincrement

  • [postgres]

    исправления в отражении postgres для лучшей обработки присутствия имен схем; спасибо jason (at) ncsmags.com

    References: #402

  • [firebird]

    порядок создания ограничений ставит первичный ключ на первое место перед всеми остальными ограничениями; требуется для firebird, неплохая идея для других

    References: #408

  • [firebird]

    Исправление в Firebird автозагрузки многопольных внешних ключей

    References: #409

  • [firebird]

    Тип Firebird NUMERIC правильно обрабатывает тип без точности

    References: #409

0.3.3

Released: Fri Dec 15 2006
  • [no_tags]

    Исправлены строковые предложения FROM, т.е. select(…, from_obj=[«sometext»])

  • [no_tags]

    исправления флага passive_deletes, флага lazy=None (noload)

  • [no_tags]

    добавлены примеры/документы для работы с большими коллекциями

  • [no_tags]

    добавлен метод object_session() в пространство имен sqlalchemy

  • [no_tags]

    Исправлена ошибка в QueuePool, благодаря которой он лучше справлялся с повторным подключением к базе данных, которая была недоступна (спасибо Sébastien Lelong), также исправлен метод dispose()

  • [no_tags]

    патч, который заставляет MySQL rowcount работать корректно!

    References: #396

  • [no_tags]

    Исправление перехвата ошибок 2006/2014 в MySQL для корректного перевызова исключения OperationalError

0.3.2

Released: Sun Dec 10 2006
  • [no_tags]

    Исправлена крупная ошибка пула соединений. Устранены ошибки рассинхронизации MySQL, а также предотвращен случайный откат транзакций во всех БД

    References: #387

  • [no_tags]

    значительные улучшения скорости по сравнению с 0.3.1, чтобы вернуть скорость к уровню 0.2.8

  • [no_tags]

    сделал условные десятки вызовов журнала отладки, которые требовали много времени для формирования сообщений журнала

  • [no_tags]

    исправлена ошибка в правилах каскадирования, из-за которой весь граф объектов мог быть излишне каскадирован при каскаде сохранения/обновления

  • [no_tags]

    различные ускорения в модуле атрибутов

  • [no_tags]

    Карта идентичности в сессии по умолчанию не имеет слабой ссылки. Чтобы она была слабой ссылкой, используйте исправление create_session(weak_identity_map=True).

    References: #388

  • [no_tags]

    MySQL обнаруживает ошибки 2006 (сервер ушел) и 2014 (команды рассинхронизированы) и аннулирует соединение, на котором они возникли.

  • [no_tags]

    Исправление типа MySQL bool:

    References: #307

  • [no_tags]

    Исправления отражений в postgres:

    References: #349, #382

  • [no_tags]

    добавлены ключевые слова EXCEPT, INTERSECT, EXCEPT ALL, INTERSECT ALL

    References: #247

  • [no_tags]

    assign_mapper в расширении assignmapper возвращает созданный маппер

    References: #2110

  • [no_tags]

    В класс Select добавлена функция label(), когда scalar=True используется для создания скалярного подзапроса, т.е. «select x, y, (select max(foo) from table) AS foomax from table».

  • [no_tags]

    добавлены ключевые аргументы onupdate и ondelete для ForeignKey; распространяются на нижележащий ForeignKeyConstraint, если он присутствует. (однако не распространяются в другом направлении)

  • [no_tags]

    исправление в session.update() для сохранения «грязного» состояния входящего объекта

  • [no_tags]

    Передача селекта в IN через функцию in_() больше не создает «объединение» из нескольких селектов; теперь допускается передача только одного селекта в функцию in_() (если необходимо создать объединение, сделайте его сами)

  • [no_tags]

    улучшена поддержка отключения каскадного сохранения обновлений с помощью cascade=»none» и т.д.

  • [no_tags]

    В relation() добавлен аргумент «remote_side», используемый только в самореферентных картографах для принудительного определения направления отношения родитель/ребенок. Заменяет использование параметра «foreignkey» для «переключения» направления. Аргумент «foreignkey» устарел для всех случаев использования и со временем будет заменен аргументом, предназначенным для спецификации ForeignKey в картографах.

0.3.1

Released: Mon Nov 13 2006

orm

  • [orm]

    Каскад «удаления» будет загружать все дочерние объекты, если они еще не были загружены. Это можно отключить (т.е. вернуть старое поведение), установив в relation() значение passive_deletes=True.

  • [orm]

    внесены изменения в генерацию запросов, чтобы исключить ошибки при циклических загружаемых отношениях (например, обратных ссылках)

  • [orm]

    Исправлена ошибка, при которой опция eagerload() (равно как и lazyload()) не указывала Query, следует ли использовать «вложенность» при формировании LIMIT-запроса.

  • [orm]

    Исправлена ошибка в сортировке циклических зависимостей во время прошивки; если объект A содержал циклическую связь «многие-к-одному» с объектом B, а объект B был просто присоединен к объекту A, но сам объект B не был изменен, то синхронизация атрибута первичного ключа B с атрибутом внешнего ключа A «многие-к-одному» не происходила.

    References: #360

  • [orm]

    Реализован аргумент from_obj для query.count, что улучшает работу функции подсчета на selectresults

    References: #325

  • [orm]

    добавлено утверждение на этапе «каскада» ORM-отношений для проверки соответствия класса объекта, присоединенного к родительскому объекту (т.е. если в A.items хранятся объекты B, то при присоединении C к A.items будет выдана ошибка)

  • [orm]

    Новое расширение sqlalchemy.ext.associationproxy обеспечивает прозрачное отображение «объект-ассоциация». новый пример examples/association/proxied_association.py иллюстрирует.

  • [orm]

    улучшение наследования одной таблицы для загрузки полных иерархий под целевым классом

  • [orm]

    исправление тонкого условия в топологической сортировке, когда узел может появиться дважды, для

    References: #362

  • [orm]

    дополнительная переработка топологического сорта, рефакторинг, для

    References: #365

  • [orm]

    »delete-orphan» для определенного типа может быть установлен более чем на один родительский класс; экземпляр является «сиротой» только в том случае, если он не привязан ни к одному из этих родителей

misc

  • [engine/pool]

    несколько новых классов утилит Pool, обновлена документация

  • [engine/pool]

    »use_threadlocal» на Pool по умолчанию False (аналогично create_engine)

  • [engine/pool]

    исправлено прямое выполнение скомпилированных объектов

  • [engine/pool]

    Переработана функция create_engine() для строгого учета входящих **kwargs. Все аргументы ключевых слов должны быть использованы одним из конструкторов диалекта, пула соединений и движка, иначе выдается ошибка TypeError, описывающая полный набор недопустимых kwargs по отношению к выбранной конфигурации диалекта/пула/движка.

  • [databases/types]

    MySQL ловит исключение на «describe» и сообщает об этом как NoSuchTableError

  • [databases/types]

    Дополнительные исправления в булевых значениях sqlite, которые не работали по умолчанию

  • [databases/types]

    исправление цитирования последовательностей в postgres при использовании схем

0.3.0

Released: Sun Oct 22 2006

general

  • [general]

    Логирование теперь осуществляется через стандартный модуль python «logging». Параметры ключевого слова «echo» по-прежнему функциональны, но устанавливают/отменяют уровни логирования для соответствующих классов/экземпляров. Все логирование может управляться непосредственно через Python API путем установки уровней INFO и DEBUG для логгеров в пространстве имен «sqlalchemy». Логирование на уровне класса находится под «sqlalchemy.<module>.<classname>», на уровне экземпляра - под «sqlalchemy.<module>.<classname>.0x..<00-FF>». В тестовый набор добавлены аргументы «–log-info» и «–log-debug», которые работают независимо от аргументов –verbose/–quiet. В orm добавлено протоколирование, позволяющее отслеживать конфигурации маппера, итерации строк.

  • [general]

    переработана система генерации документации, которая стала гораздо проще по дизайну и более интегрирована с Markdown

orm

  • [orm]

    отслеживание атрибутов изменено для более интеллектуального обнаружения изменений, особенно в случае мутабельных типов. Объекты TypeEngine теперь играют более значительную роль в определении того, как сравнивать два скалярных экземпляра, включая добавление миксина MutableType, который реализуется PickleType. unit-of-work теперь отслеживает «грязный» список как выражение всех постоянных объектов, в которых менеджер атрибутов обнаруживает изменения. Основной исправленной проблемой является обнаружение изменений в объектах PickleType, но также обобщена обработка типов и проверка «измененных» объектов, что делает ее более полной и расширяемой.

  • [orm]

    широкий рефакторинг архитектур «загрузчика атрибутов» и «опций». ColumnProperty и PropertyLoader определяют свое поведение при загрузке с помощью переключаемых «стратегий», а MapperOptions больше не используют копирование мапперов/свойств для своей работы; вместо этого они распространяются через объекты QueryContext и SelectionContext во время выполнения запроса/экземпляра. Все внутреннее копирование отображателей и свойств, которое использовалось для работы с наследованием, а также options(), было удалено; структура отображателей и свойств стала намного проще, чем раньше, и наглядно представлена в новом модуле „interfaces“.

  • [orm]

    связано с перестройкой маппера/свойств, внутренний рефакторинг метода mapper instances() для использования объекта SelectionContext для отслеживания состояния во время операции. Небольшое нарушение API: методы append_result() и populate_instances() в MapperExtension теперь имеют немного другую сигнатуру метода в результате изменений; надеемся, что эти методы пока не используются повсеместно.

  • [orm]

    Метод instances() теперь перенесен в Query, обратно-совместимая версия осталась в Mapper.

  • [orm]

    Добавлена опция contains_eager() MapperOption, используемая совместно с instances() для указания свойств, которые должны быть загружены из результирующего набора с опережением, используя по умолчанию их обычные имена столбцов, либо транслированные с помощью пользовательской функции перевода строк.

  • [orm]

    более подробная перестройка схемы фиксации единицы работы для более корректной работы зависимостей внутри циклических стоков… обновлена реализация обхода задач и ведения журналов

  • [orm]

    полиморфные отображатели (т.е. использующие наследование) теперь производят INSERT-запросы в порядке следования таблиц во всех наследуемых классах

    References: #321

  • [orm]

    добавлена функция автоматического «переключения строк» в маппинге, которая обнаруживает пару ожидающий экземпляр/удаленный экземпляр с одинаковым идентификационным ключом и преобразует INSERT/DELETE в один UPDATE

  • [orm]

    Упрощение отображения «ассоциаций» для использования преимуществ функции автоматического «переключения рядов»

  • [orm]

    »Классы пользовательских списков» теперь реализуются через ключевой аргумент «collection_class» в relation(). старый способ по-прежнему работает, но уже устарел

    References: #212

  • [orm]

    добавлен флаг «viewonly» в relation(), позволяющий строить отношения, не влияющие на процесс flush().

  • [orm]

    добавлен аргумент «lockmode» в базовые функции Query select/get, включая функцию «with_lockmode» для получения копии Query, имеющей режим блокировки по умолчанию. На стороне select аргументы «read»/»update» будут транслироваться в аргумент for_update.

    References: #292

  • [orm]

    Реализована логика «проверки версии» в Query/Mapper, используемая, когда действует version_id_col и query.with_lockmode() используется для получения() экземпляра, который уже загружен

  • [orm]

    Улучшено поведение post_update; лучше работает над тем, чтобы не обновлять слишком много строк, обновляет только необходимые столбцы

    References: #208

  • [orm]

    внесены изменения в eager loading, в результате которых «цепочка eager» хранится отдельно от обычной настройки mapper, что предотвращает конфликты с работой lazy loader, исправления

    References: #308

  • [orm]

    исправление отложенной загрузки групп

  • [orm]

    session.flush() не закрывает открытое соединение

    References: #346

  • [orm]

    В mapper добавлен флаг «batch=True»; если False, то save_obj будет полностью сохранять один объект за раз, включая вызовы before_XXXX и after_XXXX

  • [orm]

    Добавлен аргумент «column_prefix=None» для mapper; добавляет заданную строку (обычно „_“) к атрибутам, основанным на колонках, которые автоматически устанавливаются из таблицы mapper’а

  • [orm]

    Указание joins в аргументе from_obj запроса query.select() заменит основную таблицу запроса, если эта таблица находится где-то в пределах заданного from_obj. Это позволяет создавать пользовательские joins и outerjoins в запросах без двойного добавления основной таблицы.

    References: #315

  • [orm]

    eagerloading настроен на более вдумчивое присоединение LEFT OUTER JOIN к заданному запросу с поиском пользовательских предложений «FROM», которые, возможно, уже были заданы.

  • [orm]

    В SelectResults добавлены трансформационные методы join_to и outerjoin_to для построения условий join/outerjoin на основе имен свойств. также добавлен select_from для явного задания параметра from_obj.

  • [orm]

    удален флаг «is_primary» из маппера.

sql

  • [sql] [construction]

    изменен параметр «for_update», чтобы он принимал значения False/True/»nowait» и «read», два последних из которых интерпретируются только Oracle и MySQL

    References: #292

  • [sql] [construction]

    В sql-диалект добавлена функция extract() (SELECT extract(field FROM expr))

  • [sql] [construction]

    BooleanExpression включает новый аргумент «negate» для указания соответствующего оператора отрицания, если таковой имеется.

  • [sql] [construction]

    вызов отрицания на клаузулу «IN» или «IS» приведет к «NOT IN», «IS NOT» (в отличие от NOT (x IN y)).

  • [sql] [construction]

    Объекты функций теперь знают, что делать в предложении FROM. Их поведение должно быть таким же, только теперь вы можете делать такие вещи, как select([„*“], from_obj=[func.my_function()]), чтобы получить несколько столбцов из результата, или даже использовать конструкции sql.column(), чтобы назвать возвращаемые столбцы

    References: #172

schema

  • [schema]

    В пакете схем проведена значительная чистка, удалены неоднозначные методы, методы, которые больше не нужны. немного более ограниченное использование, больший акцент на явности

  • [schema]

    Атрибут «primary_key» таблицы Table и других selectables становится множеством, подобным объекту ColumnCollection; упорядочивается, но не индексируется численно. Предложение сравнения между двумя pk, полученными из одних и тех же базовых таблиц (например, двух объектов Alias), может быть сформировано через table1.primary_key==table2.primary_key

  • [schema]

    ForeignKey(Constraint) поддерживает функцию «use_alter=True» для создания/удаления внешнего ключа через ALTER. Это позволяет устанавливать циркулярные отношения внешних ключей.

  • [schema]

    Методы append_item() удалены из Table и Column; предпочтительно строить объекты Table/Column/связанные с ними объекты inline, но при необходимости использовать append_column(), append_foreign_key(), append_constraint() и т.д.

  • [schema]

    table.create() больше не возвращает объект Table, вместо этого не имеет возвращаемого значения. обычно таблицы создаются через метаданные, что предпочтительнее, так как позволяет обрабатывать зависимости таблиц.

  • [schema]

    добавлены UniqueConstraint (действует на уровне таблицы), CheckConstraint (действует на уровне таблицы или столбца).

  • [schema]

    index=False/unique=True в Column теперь создает UniqueConstraint, index=True/unique=False - обычный индекс, index=True/unique=True в Column - уникальный индекс. Аргументы ключевых слов „index“ и „unique“ в столбце теперь являются только булевыми; для явных имен и группировок индексов или уникальных ограничений используйте конструкции UniqueConstraint/Index в явном виде.

  • [schema]

    добавлено значение autoincrement=True для Column; отключает генерацию схемы SERIAL/AUTO_INCREMENT/identity seq для postgres/mysql/mssql, если явно установлено значение False

  • [schema]

    Объекты TypeEngine теперь имеют методы для работы с копированием и сравнением значений конкретного типа. В настоящее время используется в ORM, см. ниже.

  • [schema]

    исправлено состояние, возникающее при отражении, когда столбец первичного ключа был явно переопределен, при котором ограничение PrimaryKeyConstraint получало удвоение как отраженного, так и программного столбца

  • [schema]

    атрибут «foreign_key» для Column и ColumnElement в целом устарел, в пользу атрибута «foreign_keys», основанного на списке/наборе, который учитывает несколько внешних ключей для одного столбца. «foreign_key» возвращает первый элемент в списке/наборе «foreign_keys» или None, если список пуст.

sqlite

  • [sqlite]

    Тип данных sqlite boolean по умолчанию преобразует False/True в 0/1

  • [sqlite]

    исправление типов Дата/Время (SLDate/SLTime); теперь работает не хуже, чем в postgres

    References: #335

oracle

  • [oracle]

    Oracle имеет экспериментальную поддержку cx_Oracle.TIMESTAMP, которая требует вызова setinputsizes() на курсоре, что теперь разрешено с помощью флага „auto_setinputsizes“ в диалекте oracle.

misc

  • [ms-sql]

    исправлена ошибка 261 (нарушение отражения таблиц для баз данных MS-SQL, чувствительных к регистру)

  • [ms-sql]

    теперь можно указать порт для pymssql

  • [ms-sql]

    введена новая опция «auto_identity_insert» для автоматического переключения между режимами «SET IDENTITY_INSERT» при указании значений для столбцов IDENTITY

  • [ms-sql]

    теперь поддерживаются многоколоночные внешние ключи

  • [ms-sql]

    исправление отражения столбцов даты/времени

  • [ms-sql]

    Добавлена поддержка типов NCHAR и NVARCHAR

  • [firebird]

    В псевдонимах не используется «AS»

  • [firebird]

    корректно вызывает ошибку NoSuchTableError при отражении несуществующей таблицы

  • [connections/pooling/execution]

    Пул соединений отслеживает открытые курсоры и автоматически закрывает их, если соединение возвращается к пулу с еще открытыми курсорами. Может быть подвержен влиянию опций, которые заставляют его вместо этого выдавать ошибку или ничего не делать. исправляет проблемы с MySQL, другие

  • [connections/pooling/execution]

    Исправлена ошибка, при которой соединение не теряло транзакцию после фиксации/отката

  • [connections/pooling/execution]

    добавлен метод scalar() в ComposedSQLEngine, ResultProxy

  • [connections/pooling/execution]

    ResultProxy будет закрывать() нижележащий курсор при закрытии самого ResultProxy. Это приведет к автоматическому закрытию курсоров для объектов ResultProxy, у которых были извлечены все строки (или была вызвана функция scalar()).

  • [connections/pooling/execution]

    ResultProxy.fetchall() внутренне использует DBAPI fetchall() для большей эффективности, добавлена также итерация маппера (любезно предоставлено Michael Twomey)

Вернуться на верх