【问题标题】:Inserting two related objects fail in SQLAlchemy在 SQLAlchemy 中插入两个相关对象失败
【发布时间】:2010-12-06 20:21:19
【问题描述】:

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

class User(Base):
    __tablename__ = 'cp_user'

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

班级图片(用户可能有很多):

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 的想法。

我做错了什么?

【问题讨论】:

    标签: python sql orm sqlalchemy


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,用 User 替换 User.name 有帮助!我以为我疯了,但现在它起作用了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2021-12-07
    相关资源
    最近更新 更多