我正在学习开发带有烧瓶的网络应用程序,但现在我使用flask-sqlalchemy来解决这个错误:
Original exception was: (InterfaceError) Error binding parameter 0 - probably unsupported type.
u'INSERT INTO standards (std_insumo_id, std_name_id, cantidad, viviendas) VALUES (?, ?, ?, ?)' (...)",))
这些是我的模特
class Insumo(db.Model):
__tablename__ = 'insumos'
codigo = db.Column(db.Integer, primary_key=True)
descripcion = db.Column(db.String(64), unique=True)
um = db.Column(db.String(64))
class StandardName(db.Model):
__tablename__ = 'std_names'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
standards = db.relationship('Standard', backref='std_name')
class Standard(db.Model):
__tablename__ = 'standards'
id = db.Column(db.Integer, primary_key=True)
std_insumo_id = db.Column(db.Integer, db.ForeignKey('insumos.codigo'))
std_name_id = db.Column(db.Integer, db.ForeignKey('std_names.id'))
cantidad = db.Column(db.Float)
viviendas = db.Column(db.Integer)
这就是我在尝试插入行时所做的事情:
cemento = Insumo.query.filter_by(descripcion="Cemento").first()
mamp = StandardName.query.filter_by(name="Mamposteria").first()
这两个已经存在于db中,所以没有问题。当我尝试使用模型时会出现问题:标准
r1 = Standard(std_insumo_id=cemento, std_name_id=mamp, cantidad=10, viviendas=40)
db.session.add(r1)
db.session.commit()
你可以帮我理解发生了什么吗?我没有看到这些类型有什么问题。
答案 0 :(得分:2)
这里:
r1 = Standard(std_insumo_id=cemento, ...)
# ^^^^^^^^^^^^^^^^^^^^^
根据此处的声明, Standard
期待std_insumo_id
的值,该值应为int
:
std_insumo_id = db.Column(db.Integer, db.ForeignKey('insumos.codigo'))
但你有
cemento = Insumo.query.filter_by(descripcion="Cemento").first()
因此cemento
是Insumo
的实例,而不是int
。您可以执行这些操作,但除了列级别映射之外,还需要提供类级别映射,并使用relationship()
class Standard(db.Model):
std_insumo_id = db.Column(db.Integer, db.ForeignKey('insumos.codigo'))
std_insumo = relationship(Insumo)
然后
r1 = Standard(std_insumo=cemento, ...)
^ ^^^^^^^^^^
没有“_id
”