【发布时间】:2020-10-07 18:19:25
【问题描述】:
在我正在构建的应用程序中,我使用了自定义类型的复合类型来存储数据。 它基本上是一个简单类型对象的列表:
bin = CompositeType(columns=[Column('label', String()), Column('head', Float()), Column('tail', Float())], name='bin')
这是以如下方式内置到我的课程中的:
class Myclass(db.Model):
id = sa.Column('id', sa.Integer(), nullable=False)
bin = sa.Column('bin', CompositeArray(CompositeType('bin', [Column('label', String()), Column('head', Float()), Column('tail', Float())])))
那我试试:
id = '111331'
bins ={'1':{'start':0,'end':1},'2':{'start':1,'end':2}}
myclass = Myclass(id = int(id), bins = [(bin_key, bins[bin_key]['start'], bins[bin_key]['end']) for bin_key in bins])
# The object creation works flawlessly.
db.session.add(myclass)
db.session.commit()
# Error happens in SQLAlchemy commit
突然,我收到了这个错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.DatatypeMismatch)
column "bin" is of type bin[] but expression is of type record[] (...)
^ HINT: You will need to rewrite or cast the expression.
但我无法找到如何进行这种投射。
我应该创建一个类来描述 postgres 中使用的这种类型,然后在列表理解中实例化它吗?如果有,请举例说明。
顺便说一句,这曾经有效。当我使用 flask db migrate 迁移时停止工作。但是,数据库结构完全一样。
【问题讨论】:
标签: python sqlalchemy flask-migrate