В приложении, которое я создаю, я использовал составной тип пользовательских типов для хранения данных. Это в основном список простых объектов типа:
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. Однако структура базы данных точно такая же.