2009-09-30 5 views
0

В настоящее время я оцениваю веб-фреймворки с уровнем ORM, и я наткнулся на интересную проблему. Я использовал таблицы с столбцом ID в приложении Java EE (EJB3/JPA) с различными базами данных. В SAPDB я мог бы определить последовательность и использовать аннотацию генератора последовательности jpa, чтобы справиться с ней, так же, как и раньше, в базе данных оракула. Когда я переключился на SQL Server 2005, мне внезапно пришлось заменить все это на аннотацию IDENTITY, потому что это похоже на то, как SQL Server обрабатывает генерацию идентификатора. Я был разочарован тем, что JPA не дал мне абстракции выше этого, и я думаю, что это не единственное ограничение, с которым я столкнусь, используя разные базы данных.Поддержка последовательностей/идентификаторов в webframeworks python

Теперь на мой вопрос: я прочитал, что в web2py, например, все таблицы должны быть изменены, чтобы использовать индекс auto_increment. Поддерживает ли он генераторы последовательности или столбцы идентичности? Как насчет других веб-фреймворков? Разресят ли они мне переносить мое приложение на несколько устаревших баз данных? То есть определения таблиц одинаковы, за исключением столбца идентификации и незначительных различий между определением типа данных для строк (я помню, что изменял создаваемые там утверждения, но я не могу вспомнить, что именно было необходимо)

Существует также разница в получении идентификатора - с генератором последовательности вы можете получить доступ к сгенерированному идентификатору до фиксации, с auto_increment в MySQL, afaik, вы не можете.

ответ

1

SQLAlchemy может обрабатывать оба способа просто отлично. Учитывая заявление схемы, как это:

class Foo(Base): 
    id = Column(Integer, Sequence('foo_seq', optional=True), primary_key=True) 
    ... 

SQLAlchemy будет использовать встроенный в автоинкрементной парадигме базы данных, если она имеет один, в противном случае он будет определять последовательность. Он также управляет извлечением сгенерированного идентификатора, но поскольку API является наименее общим знаменателем, вы, очевидно, не можете получить к нему доступ до вставки. Если вы хотите, вы можете прибегнуть к идентификатору вручную. Например, для PostgreSQL, который имеет последовательности, но также имеет автоматически увеличивающийся тип данных serial, который поддерживается последовательностями, он будет использовать тип данных serial. В более ранних версиях он автоматически предварительно выбирает следующее значение последовательности, которое будет использоваться во вставке, с SQLAlchemy 0.6 series и Postgres 8.3+ оно будет использовать функцию INSERT ... RETURNING ... для вставки и извлечения за один раз.

Смежные вопросы