【发布时间】:2010-11-25 05:51:25
【问题描述】:
我正在编写一个 turbogears2 应用程序。我有一张这样的桌子:
class Order(DeclarativeBase):
__tablename__ = 'order'
# id of order
id = Column(Integer, autoincrement=True, primary_key=True)
# buyer's id
buyer_id = Column(Integer, ForeignKey('user.user_id',
onupdate="CASCADE", ondelete="CASCADE"), primary_key=True)
我想在此表中插入一个新行,但出现“字段 'order_id' 没有默认值”错误。看来我必须手动设置订单的id,因为我有两个主键。我的问题是,如何插入自动生成新 ID 的行?
如果我手动生成 id,我会遇到一些问题。例如:
maxId = DBSession.query(func.max(Order)).one()[0]
newOrder = Order(id=maxId + 1, buyer_id=xxx)
DBSession.add(newOrder)
以这种方式添加新订单似乎没问题,但是,如果两个请求几乎同时运行这些代码,我们就会遇到问题。
如果有请求 a 和 b 按以下顺序运行此代码:
a.maxId = DBSession.query(func.max(Order)).one()[0]
b.maxId = DBSession.query(func.max(Order)).one()[0]
b.newOrder = Order(id=maxId + 1, buyer_id=xxx)
b.DBSession.add(newOrder)
a.newOrder = Order(id=maxId + 1, buyer_id=xxx)
a.DBSession.add(newOrder)
那么请求a可能会失败,因为表中已经有一个id相同的订单。我可以捕获异常并重试。但我想知道,有没有更好的办法?
有时候,id不是简单的整数,我们可能需要这样的订单id:
2009090133 标准 2009-09-01 第 33 次订购
在这些情况下,自动增量不可用。所以我别无选择,为订单手动分配 id。所以我的另一个问题是,有没有比捕获异常并重试插入带有 id 的行更好的方法。
【问题讨论】:
标签: python sql database sqlalchemy