Как я могу определить поведение для вставки во внешние объединенные таблицы? - PullRequest
0 голосов
/ 17 октября 2019

Я работаю с базой данных, где есть две таблицы, по сути, отношения 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')
...