Сначала скажу, почему меня не устраивает проверка во время комита.
Во-первых, для sqlite (на нем я тестирую свое приложение) нужно включать специальную прагму, чтоб он их начал чекать.
Во-вторых, даже с включенной проверкой, сообщение об ошибке не объяснят, какого именно ключа нет. Просто пишет, что мол не смогло foreign-ключ собрать.
Вот, наговнокодил чуток. Повис, на том, как задать filter в последней строчке. Не могу выцепить класс модели для таблицы по foreign-ключу.
def check_foreign(session, obj):
obj_table = obj.metadata.tables[obj.__tablename__]
for (t_k, t_v) in zip(obj_table.columns.keys(), obj_table.columns.values()):
for f_k in t_v.foreign_keys:
(table, column) = f_k.target_fullname.split('.')
f_v = getattr(obj, t_k)
if f_v:
f_t = obj.metadata.tables[table]
print session.query(f_t).filter(getattr(f_t, column) == f_v)