如何使用SQLAlchemy将关系对象数据插入到数据库中?

时间:2014-02-05 00:51:38

标签: python postgresql sqlalchemy flask

我在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的新手,因此遵循了关于关系的文档中所说的内容。

模型中的两种数据类型(站点,学校)都是整数。

2 个答案:

答案 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应该为您提供详细信息。