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

Ser*_*nov 3 python sql orm sqlalchemy

我得到了(可能是微不足道的)错误,但对可能的原因完全无能为力.我想使用SQLAlchemy在DB中插入两个对象.这些对象是相关的,这里是声明.班级用户:

class User(Base):
    __tablename__ = 'cp_user'

    id = Column(Integer, Sequence('id_seq'), primary_key=True)
# ... more properties
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

在我从数据库中提取正确的用户后,我正在尝试插入新图片,或者只是创建它:

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()
Run Code Online (Sandbox Code Playgroud)

这失败,但有例外: AttributeError: 'RowTuple' object has no attribute '_sa_instance_state'

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

我做错了什么?

ebo*_*ebo 5

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

您查询User.name这是一个列而不是绑定对象.

user = s.query(User).filter("...some filter here...").first()
Run Code Online (Sandbox Code Playgroud)

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

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