gpt4 book ai didi

python - 在循环中使用 SQLAlchemy Session 对象提交数据时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:08 24 4
gpt4 key购买 nike

我在使用 SQLalchemy 时遇到数据库提交问题。这是我的场景,我有一个要添加到表中的记录列表。将记录添加到表中后,我需要获取插入的记录 Id 并再次插入到第二个表中。我在单个 session 下进行这些操作。代码结构如下所示,因为我不允许给出代码

创建 session 对象

循环要插入的记录列表:

 do the session.add(obj)

session.commit()

get obj.id

do the session.add(obj2) # with obj2 having the id from the obj

session.commit()

如果我们有多个记录,这里只有最后一个记录数据被正确提交

谁能帮我解决这个问题。

最佳答案

很有可能您不需要发出两次提交;使用 sqlalchemy session 的主要原因之一是它了解对象如何相互关联,并将以正确插入数据并正确表示所需结构的方式对其插入进行排序。这主要通过 relationship 结构来实现。这是一个简单的例子:

>>> from sqlalchemy import *
>>> from sqlalchemy.orm import *
>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()

>>> class A(Base):
... __tablename__ = "a_table"
... id = Column(Integer, primary_key=True)
...
>>> class B(Base):
... __tablename__ = "b_table"
... id = Column(Integer, primary_key=True)
... a_id = Column(Integer, ForeignKey(A.id))
... a = relationship(A)
...
>>> my_a = A()
>>> my_b = B()
>>> my_b.a = my_a
>>>

最重要的部分是我们通过B.a 声明AB 之间的关系。为了充分利用这一点,重要的是通过此关系属性表达每个实例之间的关系,并让 sqlalchemy 负责设置 a_id 列本身。

>>> engine = create_engine("sqlite:///:memory:")
>>> Base.metadata.create_all(engine)
>>> engine.echo = True
>>> Session = sessionmaker(engine)
>>>
>>> session = Session()
>>> session.add(my_a)
>>> session.add(my_b)
>>>
>>> session.commit()

使用 echo=True,输出看起来有点像这样:

2011-09-16 17:19:22,367 INFO sqlalchemy.engine.base.Engine.0x...ed50 BEGIN (implicit)
2011-09-16 17:19:22,368 INFO sqlalchemy.engine.base.Engine.0x...ed50 INSERT INTO a_table DEFAULT VALUES
2011-09-16 17:19:22,368 INFO sqlalchemy.engine.base.Engine.0x...ed50 ()
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 INSERT INTO b_table (a_id) VALUES (?)
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 (1,)
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 COMMIT

注意 my_a 对象被插入,sqlalchemy 读取分配的主键并将其用于 my_b 的插入。

关于python - 在循环中使用 SQLAlchemy Session 对象提交数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7447309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com