несколько записей таблиц SQL с внешними ключами одновременно в колбе sqlalchemy - PullRequest
0 голосов
/ 10 октября 2019

В колбу с sqlalchemy имеют 3 вложенные друг в друга таблицы:

models.py:

class VariantManualReview( db.Model ) :

    __tablename__ = 'variantmanualreview'

    id = db.Column(db.Integer, primary_key=True, unique = True)
    name = db.Column(db.String(256), index=True, unique=True)
    last_review_on = db.Column(db.DateTime, index=True, default=datetime.now)
    revisions = db.relationship('VariantManualRevisions', backref='author', lazy='dynamic')

class VariantManualRevisions( db.Model ) :

    __tablename__ = 'variantmanualrevisions'

    variant_id = db.Column(db.Integer, db.ForeignKey('variantmanualreview.id'))
    id = db.Column(db.Integer, primary_key=True, unique = True)
    reviewed_on = db.Column(db.DateTime, index=True, default=datetime.now)
    reviewed_by = db.Column(db.String(128))
    ACMG_overall = db.Column(db.String(16))
    subcategories = db.relationship('VariantManualRevisionsSubcategories', backref='author', lazy='dynamic')

class VariantManualRevisionsSubcategories( db.Model ) :

    __tablename__ = 'variantmanualrevisionssubcategories'

    revision_id = db.Column(db.Integer, db.ForeignKey('variantmanualrevisions.id'))
    id = db.Column(db.Integer, primary_key=True, unique = True)
    reviewed_on = db.Column(db.DateTime, index=True, default=datetime.now)
    reviewed_by = db.Column(db.String(128))
    category = db.Column(db.String(16))
    accepted = db.Column(db.Boolean, default=False)
    notes = db.Column(db.String(256))
    studies = db.relationship('VariantManualRevisionsSubcategoriesPMIDs', backref='author', lazy='dynamic')

В некоторых случаях мне нужно вставитьзапись для всех 3 таблиц одновременно, когда форма проверена, я пытался вставить и извлечь их, но это не выглядит оптимальным, чтобы зафиксировать все эти изменения в одном действии, и более того, страница перезагружается после каждого commit() провалив утверждение if:

### ... rest of routes.py ...
from app.models import VariantManualReview, VariantManualRevisions, VariantManualRevisionsSubcategories
### ... rest of routes.py ...
    form = VariantCategoryRevision()
    if form.validate_on_submit() :

        if form.accepted.data == "Y" :
            form_accepted = True
        else :
            form_accepted = False

        form_notes = form.notes.data

        ### check if the var already reviewed
        var_revision_exists = db.session.query(VariantManualReview.id).filter_by(name=var_name).scalar() is not None
        ### if a revision already exists add to relative variant subtables
        if var_revision_exists :
            var_revision = VariantManualReview.query.filter_by( name = var_name).first()
            var_revision_overall = VariantManualRevisions.query.filter_by(variant_id = var_revision.id).all()
            if var_revision_overall :
                flash("variant already reviewed")
        ### if does not exist should create everything
        else :
            var_revision = VariantManualReview(
                                name = var_name
            )
            # add to database
            db.session.add( var_revision )
            # commit
            db.session.commit()
            # retrieve assigned ID
            var_revision_added = VariantManualReview.query.filter_by(name = var_revision.name).first()
            var_revision_overall = VariantManualRevisions(
                                variant_id = var_revision_added.id,
                                reviewed_by = current_user.username,
                                ACMG_overall = ACMG_overall
            )
            db.session.add( var_revision_overall )
            db.session.commit()
            var_revisions_overall_added = VariantManualRevisions.query.filter_by( variant_id = var_revisions_overall.variant_id ).first()
            var_revision_subcategory = VariantManualRevisionsSubcategories(
                                revision_id = var_revisions_overall_added.id,
                                reviewed_by = current_user.username,
                                category = category,
                                accepted = form_accepted,
                                notes = form_notes,
            )
            db.session.add( var_revision_subcategory )
            db.session.commit()

### ... rest of routes.py ...

Я оглянулся, но не нашел ответа, кто-нибудь понял, как это сделать?

Заранее большое спасибо залюбая помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...