在SQLAlchemy中插入两个相关对象失败
我遇到了一个(可能很简单的)错误,但对可能的原因完全没有头绪。我想用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的概念。
我到底哪里做错了?
1 个回答
5
你的代码会出问题,如果没有走到 not(user)
这一部分。
你在查询 User.name,这其实是一个列,而不是一个绑定的对象。
user = s.query(User).filter("...some filter here...").first()
一个对象在被传送到数据库时就会被分配一个 ID。你是在提交的那一部分做的这个操作,这可能不是你想要的。你应该使用 flush。可以查阅一下文档,了解两者的区别。
另外,你不需要提交新创建的用户。如果你把一个用户对象分配给一个关系,这个过程应该是自动处理的。每次提交都会结束一个事务,这可能会很耗资源(比如锁定、磁盘寻址等)。