2009-09-30 51 views
0

当前我正在评估带有ORM层的web框架,并且我偶然发现了一个有趣的问题。我在具有不同数据库的Java EE(EJB3/JPA)应用程序中使用具有ID列的表。在SAPDB中,我可以定义一个序列并使用jpa序列生成器注释来处理它,就像我之前在oracle数据库上做的一样。当我切换到SQL Server 2005时,我突然不得不将整个东西都替换为IDENTITY注释,因为这就是SQL Server显然处理ID生成的方式。我有点失望JPA没有给我一个抽象,我想这不是我使用不同数据库的唯一限制。python webframeworks中的序列/标识支持

现在我的问题:我已经读过,在web2py例如所有的表必须改变使用auto_increment索引。它是否也支持序列生成器或标识列?其他Web框架如何?他们是否允许我将应用程序移植到多个传统数据库?也就是说,除了标识列和字符串数据类型定义(我记得在那里修改创建语句,但我不记得究竟需要什么)之间的细微差别之外,表定义是相同的。

还有一个获取ID的差异 - 在序列生成器中,您可以在提交之前访问生成的ID,在MySQL中使用auto_increment afaik,则不能。

回答

1

SQLAlchemy可以很好地处理这两种方式。给定一个模式声明是这样的:

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

的SQLAlchemy将使用内置数据库的自动递增模式,如果它有一个,否则会定义一个序列。它还管理生成的ID的获取,但由于API是最不常见的分母,所以在插入之前显然无法访问它。如果你愿意的话,你可以手动获取id。例如,对于具有序列的PostgreSQL,但也具有自动递增的serial数据类型,该数据类型由序列支持,这将使用serial数据类型。使用旧版本时,它会自动预取下一个序列值以用于插入,使用SQLAlchemy 0.6系列和Postgres 8.3+,它将使用INSERT ... RETURNING ...功能一次插入和读取。