Возникла такая проблема.
Заранее извиняюсь за обилие кода, сократил как мог.
Есть таблица “месторождения”, “скважины” и “источники данных”.
У одного месторождения может быть несколько скважин и источников.
Пытаюсь оформить под это дело relations^
#таблица месторождений
field_table = Table('oil_field', metadata,
Column('rn', Integer, primary_key=True),
Column('name', String(50))
)
class Field(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Field ('%d', %s')>" % (self.rn, self.name.encode('utf-8'))
well_table = Table('well', metadata,
Column('rn', Integer, primary_key=True),
Column('prn', Integer, ForeignKey('oil_field.rn')),
Column('well_id', String(20)),
Column('name', String(20)),
Column('latitude', Numeric(15, 6)),
Column('td', Numeric(15, 6)),
Column('datun_elevation', Numeric(15, 6)),
Column('rus_name', String(20))
)
#таблица скважин
class Well(object):
def __init__(self, well_id, name, latitude=0, td = 0, datum=0, rus_name=''):
self.well_id = well_id
self.name = name
self.latitude = latitude
self.td = td
self.datun_elevation = datum
self.rus_name = rus_name
def __repr__(self):
return "<Well: (%d, %s, %s)>" % (self.rn, self.name.encode('utf-8'), self.well_id.encode('utf-8'))
#таблица источников данных
source_table = Table('src', metadata,
Column('rn', Integer, primary_key=True), #чисто, чтобы было
Column('oil_field', Integer, ForeignKey('oil_field.rn')),
Column('src', Integer),
Column('name', String(100))
)
class Source(object):
def __init__(self, oil_field, src, name):
self.oil_field = oil_field
self.src = src
self.name = name
def __repr__(self):
return '<Source: (%s, %s)>' % (self.src, self.name.encode('utf-8'))
#мапим всё
mapper(Well, well_table)
mapper(Source, source_table)
mapper(Field, field_table, properties={
'wells': relation(Well, backref='wells'),
'sourcess': relation(Source, backref='sourcess'),
}
)
А когда пытаюсь получить оттуда sourcess, то мне выдает сообщение:
sqlalchemy.exc.InterfaceError: (InterfaceError) (0, ‘Error while attempting to convert object of type <class \’decimal.Decimal\'> to database-internal numeric type for storage in field . The invalid input object is: Decimal(“33”)') ‘SELECT src.rn AS src_rn, src.oil_field AS src_oil_field, src.src AS src_src, src.name AS src_name \nFROM src \nWHERE ? = src.oil_field’ (Decimal(“33”),)
Для тестов делаю просто:
f = db.Session().query(db.Field).filter_by(rn=33).first()
print f.wells
print f.sourcess