【问题标题】:Sequence / Identity support in python webframeworkspython webframeworks中的序列/身份支持
【发布时间】:2009-09-30 09:01:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql jpa ejb-3.0 sqlalchemy web2py


    【解决方案1】:

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

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

    SQLAlchemy 将使用数据库的内置自动递增范例(如果有),否则它将定义一个序列。它还管理生成的 id 的获取,但由于 API 是最小公分母,您显然无法在插入之前访问它。如果您愿意,您当然可以手动获取 id。例如,对于具有序列但也具有由序列支持的自动递增 serial 数据类型的 PostgreSQL,这将使用 serial 数据类型。对于旧版本,它将自动预取下一个序列值以在插入中使用,对于 SQLAlchemy 0.6 系列和 Postgres 8.3+,它将使用 INSERT ... RETURNING ... 功能一次性插入和提取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-31
      • 2017-01-30
      • 2021-12-13
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多