python webframeworks中的序列/身份支持

时间:2009-09-30 09:01:56

标签: sql jpa ejb-3.0 sqlalchemy web2py

目前我正在使用ORM层评估Web框架,我偶然发现了一个有趣的问题。我在具有不同数据库的Java EE(EJB3 / JPA)应用程序中使用了具有ID列的表。在SAPDB中,我可以定义一个序列并使用jpa序列生成器注释来处理它,就像我之前在oracle数据库上所做的那样。当我切换到SQL Server 2005时,我突然不得不将整个事物替换为IDENTITY注释,因为这就是SQL Server如何处理id生成的问题。我有点失望,JPA没有给我一个抽象,我猜它不是我将遇到使用不同数据库的唯一限制。

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

获取ID也有区别 - 使用序列生成器可以在提交之前访问生成的ID,在MySQL中使用auto_increment,afaik,你不能。

1 个答案:

答案 0 :(得分: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 ...功能一次性插入和获取。