我在Python 2.7.6和Flask中使用SQLAlchemy 0.9。
我收到表单数据,将其放入对象并将对象添加到会话中。当我尝试执行db.commit()时,我得到一个回滚,这似乎是由于INSERT语句中的关系对象。 SQL错误如下:
INFO sqlalchemy.engine.base.Engine INSERT INTO site (name, address1, address2, postcode, city, fk_country_id, fk_school_id) VALUES (%(name)s, %(address1)s, %(address2)s, %(postcode)s, %(city)s, %(fk_country_id)s, %(fk_school_id)s) RETURNING site.id
INFO sqlalchemy.engine.base.Engine {'city': u'New York', 'fk_school_id': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x8c274ac>, 'name': u'Site1', 'address1': u'2 York Way', 'address2': u'', 'postcode': u'12345', 'fk_country_id': u'2'}
INFO sqlalchemy.engine.base.Engine ROLLBACK (ProgrammingError) can't adapt type 'InstrumentedAttribute'
模型中的关系代码如下:
class Site(db.Model):
id = db.Column(db.Integer, primary_key = True)
school = db.relationship('School', backref = 'site', uselist = False)
导致回滚的关系对象是什么?我是SQLAlchemy的新手,因此遵循了关于关系的文档中所说的内容。
模型中的两种数据类型(站点,学校)都是整数。
答案 0 :(得分:1)
您的一个字段是对象,而不是ID整数或字符串。参见:
'fk_school_id': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x8c274ac>
您定义对象和db.session.add(站点)时的代码是什么?在你的School课程中,你有一个site_id字段作为ForeignKey?如果是这样,当你定义学校时,你可以说
school = School(name='x', .. site_id = site.id)
或者你可以说
site.school = school
答案 1 :(得分:1)
您需要一个专栏和一个关系。列缺失。这样的事情。
id = db.Column(db.Integer, primary_key = True)
school_id = db.Column(db.Integer, ForeignKey('school.id'))
school = db.relationship(School, backref='site', uselist = False)
此Documentation应该为您提供详细信息。