sqlalchemy可以添加字段级规则,即两个特定列不能同时为None吗?

问题描述 投票:2回答:1

我有一个看起来像这样的模型:

class Foo(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    # omitted lengthy codes...

    spam = db.relationship('Spam')
    spam_id = db.Column(db.Integer, db.ForeignKey('spams.id'))

    bar = db.relationship('Bar')
    bar_id = db.Column(db.Integer, db.ForeignKey('bars.id'))

    created = db.Column(db.DateTime, server_default=db.func.now())

Flask-SQLAlchemy是否有任何选项可以添加spam_idbar_id在插入/更新期间不能同时为None的行为?但是,如果这些列中至少有一列具有值,则会接受。

python sqlalchemy flask-sqlalchemy
1个回答
1
投票

你可以使用table constraint here

from sqlalchemy import CheckConstraint


class Foo(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    # omitted lengthy codes...

    spam = db.relationship('Spam')
    spam_id = db.Column(db.Integer, db.ForeignKey('spams.id'))

    bar = db.relationship('Bar')
    bar_id = db.Column(db.Integer, db.ForeignKey('bars.id'))

    created = db.Column(db.DateTime, server_default=db.func.now())

    __table_args__ = (
        CheckConstraint('NOT(spam_id IS NULL AND bar_id IS NULL)', name='both_null'),
    )

尝试添加带有spam_id的新Foo实例和None?好的,你可以

foo=Foo(spam_id=None, bar_id=1)
sqlalchemy_session.add(foo)
sqlalchemy_session.commit()

尝试添加Foo,其中spam_id和bar_id都是无?不,先生!

foo=Foo(spam_id=None, bar_id=None)
sqlalchemy_session.add(foo)
sqlalchemy_session.commit()  # Raises Exception

引发的异常来自您的DBMS,例如使用PostgresQL和psycopg2驱动程序它是psycopg2.IntegrityError

© www.soinside.com 2019 - 2024. All rights reserved.