【问题标题】:SQLAlchemy - How do I see a primary key id for a newly created record?SQLAlchemy - 如何查看新创建记录的主键 ID?
【发布时间】:2016-07-01 02:16:18
【问题描述】:

如何查看新创建记录的主键 ID?

models.py:

class Foo(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    foobar = db.Column(db.String(64), unique = True)
def __init__(self, foobar):
    self.foobar = foobar

views.py:

foo = Foo(foobar)
db.session.add(foo)
id = How?(foo.id)

【问题讨论】:

  • 你在提交后尝试打印(foo.id)吗?而是在 flush() 之后?
  • @ Sayse - 如果您阅读我的问题,您会发现问题与我描述的完全一样 - 我需要知道新创建的记录的主键 ID 才能在数据库中添加其他记录时使用它。到目前为止我所做的 - 我查看了文档,在 SA 上搜索了我的问题,但上述所有内容均未发布。现在,您可以回答了吗?
  • @JL Peyret - 谢谢,“在flush()之后”就是答案。还要感谢 Sayse 的帮助 :)
  • @JLPeyret - 另见first revision
  • @G33K。有一点建议是,当您的问题基本完成并即将发布时,请查看右侧的 Related 列。 SO 在您键入时分析您的问题文本,并经常提取相关答案,即使您之前的搜索没有找到它们。相当神奇。而且...习惯上接受一个答案,如果它解决了你的问题:-) 尤其是因为它向其他人表明了同样的问题,什么是有效的。最后,Sayse 并没有完全错,人们确实会用更好的答案奖励更深思熟虑的研究/格式化。欢迎登机。

标签: python django sqlalchemy


【解决方案1】:
 db.session.flush()
 #id is a Python builtin...
 id_= foo.id

发生的情况是您在刷新之前的原始代码仅在您的程序中,在 db.xml 中没有任何内容。 id 列可能是在插入 时分配的自动生成的字段。一旦插入记录(flush 将更改写入数据库),SQLAlchemy 基本上会从<inserted> 选择 id 并返回结果(各种数据库为此使用各种机制)。现在你已经填充了 id。

提交和回滚在本质上与刷新不同。它们会影响数据库中已经的内容。

另外,标记您的评论我需要在数据库中添加其他记录时使用它。我解释了如何获取 id 字段值,但这并不意味着它适合在更广泛的上下文中使用。 SQLAlchemy 在 flush() 之前有不同的方法来链接记录。

【讨论】:

  • 谢谢。关于您的最后一段,我(当然还有其他人)会很高兴看到一些链接/示例/cmets,了解在 SQLAlchemy 中添加连接表的最佳方法。
  • 为此,您必须阅读他们的文档。或者找一个好的教程。但是,基本上,您可能会有类似的情况:customer = Customer(...) order = Order(....) order.customer = customer。也就是说,如果您已经指定了 2. 之间的关系,那么会话刷新应该处理繁重的工作。如果您是专业人士,我会推荐 amazon.com/Essential-SQLAlchemy-Jason-Myers-ebook/dp/B018UXJADG/… 。这有点像一本入门级的书,但它会让你继续前进。
猜你喜欢
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2018-03-14
  • 2016-10-16
  • 1970-01-01
相关资源
最近更新 更多