Я использую SQLAlchemy, но не декларативным образом, по сути, я пытаюсь заполнить базу данных, используя данные, предоставляемые веб-службой SOAP (динамические классы).
У меня проблемы с созданиемсопоставления между различными частями объекта, это усложняется тем фактом, что таблицы находятся в таблицах MyISAM MySQL, которые не поддерживают внешний ключ.
import sqlalchemy
dbE = sqlalchemy.create_engine('create string')
dbM = sqlalchemy.MetaData()
dbM.bind = dbE
class Invoice(object):
pass
class LineItem(object):
pass
InvoiceTbl = sqlalchemy.Table('Invoices', dbM, autoload = True)
LineItemTbl = sqlalchemy.Table('Invoices_Items', dbM, autoload = True)
LineItemMapper = orm.mapper(InvoiceLineItemTbl, InvoiceLineItemTbl)
InvoiceMapper = orm.mapper(Invoice, InvoiceTbl)
sm = orm.sessionmaker(bind = dbE, autoflush = True, autocommit = False,
expire_on_commit = True)
session = orm.scoped_session(sm)
Используя вышеупомянутое, я могузапросите разные части счета отдельно со следующим, объекты заполняются столбцами, присутствующими в соответствующей таблице:
invoiceData = session.query(Invoice).filter(Invoice.InvoiceNumber.like('12345'))
invoiceItems = session.query(LineItem).filter(LineItem.InvoiceNumber.like('12345'))
Что я хочу сделать, это сделать LineItems как часть счета-фактуры:
orm.mapper(Invoice, InvoiceTbl properties={
'LineItems' : orm.relation(LineItem),
})
Но это возвращается с ошибкой о том, что он не знает о связи между двумя объектами / таблицами (понятно, учитывая, что внешних ключей не существует).Я пробовал разные параметры (primaryjoin, backref и т. Д.), Но до сих пор не добился успеха.
Любая помощь будет оценена, я понимаю, что это может быть не лучшим способом сделать это, но этот конкретныйСценарий управляется данными и должен быть несколько динамичным в случае изменения службы SOAP.
edit: предложение shahjapan в отношении аргумента primaryjoin помогает, но теперь я получаю сообщение об ошибке «Не удалось определить направление отношений для условия первичного соединения», поэтомуЯ предполагаю, что мы на правильном пути, но пока еще нет.