代码之家  ›  专栏  ›  技术社区  ›  Shift 'n Tab

sqlalchemy是否可以添加字段级规则,即两个特定列不能同时为“无”?

  •  2
  • Shift 'n Tab  · 技术社区  · 8 年前

    我有一个模型是这样的:

    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())
    

    是否有任何选项可供SQLAlchemy添加 spam_id 和 bar_id 不能两者兼而有之 None 插入/更新期间?但如果这些列中至少有一列有值,则接受。

    1 回复  |  直到 8 年前
        1
  •  2
  •   TonyMoutaux    8 年前

    你可以使用 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'),
        )
    

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

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

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

    推荐文章