Я работаю с базой данных, где есть две таблицы, по сути, отношения 1: 1, которые должны действовать как единая модель / форма. Для этого я использую следующую структуру:
t_table_a = db.Table(
'table_a',
db.Column('index', db.Integer, primary_key=True, unique=True, autoincrement=True),
db.Column('manufacturer',db.String(255)),
db.Column('manufacturer_pn',db.String(255)),
...
)
# This table extends table A
t_table_b= db.Table(
'table_b',
db.Column('id', db.Integer, db.ForeignKey('table_a.index'), primary_key=True, autoincrement=True),
db.Column('detail1', db.String(255)),
db.Column('detail2', db.String(255)),
...
)
joined_tables = db.outerjoin(t_table_a, t_table_b)
# Create an editable class based on the two underlying tables
# Documentation here https://docs.sqlalchemy.org/en/13/orm/nonstandard_mappings.html#mapping-a-class-against-multiple-tables
class JointTable(db.Model):
__table__ = joined_tables
# This line maps id to both of these columns
id = db.column_property(t_table_a.c.index, t_table_b.c.id)
По большей части это работает подобно магии для вставок и большинства правок, но обнаруживает ошибку, когда запись присутствует в таблице A, но отсутствует в таблице B:
UPDATE statement on table 'table_b' expected to update 1 row(s); 0 were matched.
Это довольно неизбежное явление с нашей схемой, поскольку таблица A существует уже много лет, но B довольно нов. Есть ли способ поручить sqlalchemy ВСТАВИТЬ новую запись в таблицу B, если ее нет, вместо того, чтобы пытаться ОБНОВИТЬ что-то, чего нет?
Если ничего не помогло, я мог бы установить триггерв базе данных, но было бы предпочтительнее что-то более элегантное.
Для контекста, вот форма, которую я использую:
class InvEditForm(ModelForm):
class Meta:
model = JointTable
all_fields_optional = True
submit = SubmitField('Modify')
change_message = StringField('Change Message')