gpt4 book ai didi

python - 在 SQLAlchemy 中插入两个相关对象失败

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:26 25 4
gpt4 key购买 nike

我遇到了(可能微不足道的)错误,但对可能的原因一无所知。我想使用 SQLAlchemy 在数据库中插入两个对象。这些对象是相关的,这里是声明。类用户:

class User(Base):
__tablename__ = 'cp_user'

id = Column(Integer, Sequence('id_seq'), primary_key=True)
# ... more properties

类(class)图片(用户可能有很多):

class Picture(Base):
__tablename__ = 'picture'

id = Column(Integer, Sequence('id_seq'), primary_key=True)
authorId = Column('author_id', Integer, ForeignKey('cp_user.id'))
author = relation(User, primaryjoin = authorId == User.id)
# ... more properties

在我从数据库中获取正确的用户或刚刚创建它之后,我正在尝试插入新图片:

s = newSession()
user = s.query(User.name).filter("...some filter here...").first()
if not(user):
user = User()
s.add(user)
s.commit()

picture = Picture()
picture.author = user
s.add(picture)
s.commit()

失败并出现异常:AttributeError: 'RowTuple' object has no attribute '_sa_instance_state'

我尝试将作者的赋值移动到构造函数——同样的错误。我不能直接分配 ID——这打破了 ORM 的想法。

我做错了什么?

最佳答案

如果未采用 not(user) 分支,您的代码将失败。

您查询的 User.name 是一列而不是绑定(bind)对象。

user = s.query(User).filter("...some filter here...").first()

一个对象一旦被传输到数据库就得到它的id设计。您正在通过提交在分支中执行此操作。这可能不是您想要的。你应该发出同花顺。阅读有关差异的文档。

此外,您不需要提交新创建的用户。如果您将一个用户对象分配给一个关系,这应该被透明地处理。每次提交都会关闭一个事务,这可能会非常昂贵(锁定、磁盘查找等)

关于python - 在 SQLAlchemy 中插入两个相关对象失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569112/

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