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

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

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

有帮助吗?

解决方案

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 ... 一次性插入和获取的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top