Sqlalchemy ORM не декларативные ссылки между таблицами - PullRequest
0 голосов
/ 14 сентября 2011

Я использую 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 помогает, но теперь я получаю сообщение об ошибке «Не удалось определить направление отношений для условия первичного соединения», поэтомуЯ предполагаю, что мы на правильном пути, но пока еще нет.

Ответы [ 2 ]

4 голосов
/ 16 сентября 2011

Просто дайте внешний ключ ребенку, и он будет работать автоматически.

LineItme

LineItemTbl = sqlalchemy.Table('Invoices_Items', dbM,
    Column(InvoiceNumber, ForeignKey('InvoiceTbl.InvoiceNumber),
    autoload = True)
1 голос
/ 15 сентября 2011

Попробуйте использовать PrimaryJoin ключевое слово arg из relation API,

orm.mapper(Invoice, InvoiceTbl properties={
    'LineItems' : orm.relation(LineItem,
                  primaryjoin='Table1.id==Table2.refid'),
    })
...