mrQ*_*RTY 7 python sqlalchemy flask
我刚开始使用sqlalchemy,我想在我的一个列上设置检查约束.我有一个名为列startTime和endTime,我想确保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)
这是一种有效的语法,但是在MySQL中(我假设您正在使用MySQL?),这将被忽略。从sqla文档:
>可以使用CheckConstraint构造函数来命名或未命名检查约束,并且可以在列或表级别创建检查约束。检查约束的文本直接传递到数据库,因此有限的“数据库无关”行为。列级检查约束通常只应引用放置它们的列,而表级约束可以引用表中的任何列。请注意,某些数据库不积极支持检查约束,例如MySQL。
当然,您可以创建触发器,但随后将biz逻辑放入数据库层。我会写一个应用程序级的构造函数检查。
| 归档时间: |
|
| 查看次数: |
4507 次 |
| 最近记录: |