sqlalchemy,使用检查约束

mrQ*_*RTY 7 python sqlalchemy flask

我刚开始使用sqlalchemy,我想在我的一个列上设置检查约束.我有一个名为列startTimeendTime,我想确保endTime > startTime.

from sqlalchemy import Column, Integer, String, ForeignKey, Date
import models.Base

class Session(Base):
    __tablename__ = 'sessions'

    sid = Column(Integer, primary_key=True)
    uid = Column(Integer, ForeignKey('users.uid'), nullable=False)
    startTime= Column(Date, nullable=False)

    #probably won't work
    endTime = Column(Date, CheckConstraint('endTime > startTime'), nullable=False)
Run Code Online (Sandbox Code Playgroud)

小智 9

除了 MySQL 不支持检查约束这一事实之外,我认为问题在于您试图在列级检查约束中引用多个列。

假设您使用了另一个数据库,您需要在表级别定义约束,如下所示:

from sqlalchemy import Column, Integer, String, ForeignKey, Date
import models.Base

class Session(Base):
    __tablename__ = 'sessions'
    __table_args__ = (
        CheckConstraint('endTime > startTime'),
    )

    sid = Column(Integer, primary_key=True)
    uid = Column(Integer, ForeignKey('users.uid'), nullable=False)
    startTime= Column(Date, nullable=False)

    endTime = Column(Date, nullable=False)
Run Code Online (Sandbox Code Playgroud)


MOC*_*KBA 5

这是一种有效的语法,但是在MySQL中(我假设您正在使用MySQL?),这将被忽略。从sqla文档:

>可以使用CheckConstraint构造函数来命名或未命名检查约束,并且可以在列或表级别创建检查约束。检查约束的文本直接传递到数据库,因此有限的“数据库无关”行为。列级检查约束通常只应引用放置它们的列,而表级约束可以引用表中的任何列。请注意,某些数据库不积极支持检查约束,例如MySQL。

当然,您可以创建触发器,但随后将biz逻辑放入数据库层。我会写一个应用程序级的构造函数检查。