Python 具有多个条件的SQLAlchemy CheckConstraint引发警告

Python 具有多个条件的SQLAlchemy CheckConstraint引发警告,python,sqlalchemy,Python,Sqlalchemy,我正在使用SQLAlchemy 1.3.18、Python 3.8.5和PostgreSQL 12 我有以下带有多个列和条件的检查约束的表声明: Table( 'my_table', MetaData(), Column('id', Integer, primary_key=True), Column('start', DateTime(), nullable=False), Column('end', DateTime(), nullable=False

我正在使用SQLAlchemy 1.3.18、Python 3.8.5和PostgreSQL 12

我有以下带有多个列和条件的检查约束的表声明:

Table(
    'my_table',
    MetaData(),
    Column('id', Integer, primary_key=True),
    Column('start', DateTime(), nullable=False),
    Column('end', DateTime(), nullable=False),
    CheckConstraint(
        and_(
            or_(
                func.date_trunc('month', column('start')) == func.date_trunc('month', column('end')),
                func.extract('day', column('end')) == 1
            ),
            (column('end') - (column('start') + func.make_interval(0, 1)) <= func.make_interval())
        )
    )
)
表格(
“我的桌子”,
元数据(),
列('id',整数,主键=True),
列('start',DateTime(),null=False),
列('end',DateTime(),null=False),
检查约束(
及_(
或_(
函数日期(“月”,列(“开始”)==函数日期(“月”,列(“结束”),
函数提取('day',列('end'))==1
),

(column('end')-(column('start')+func.make_interval(0,1))感谢Ilja Everilä的评论解决了这个问题

这就是解决方案,将列放在变量中,以便它们在内存中是相同的对象

my_table_start = column('start')
my_table_end = column('end')

Table(
    'my_table',
    MetaData(),
    Column('id', Integer, primary_key=True),
    Column('start', DateTime(), nullable=False),
    Column('end', DateTime(), nullable=False),
    CheckConstraint(
        and_(
            or_(
                func.date_trunc('month', my_table_start) == func.date_trunc('month', my_table_end),
                func.extract('day', my_table_end) == 1
            ),
            (my_table_end - (my_table_start + func.make_interval(0, 1)) <= func.make_interval())
        )
    )
)
my_table_start=列('start'))
my_table_end=列('end'))
桌子(
“我的桌子”,
元数据(),
列('id',整数,主键=True),
列('start',DateTime(),null=False),
列('end',DateTime(),null=False),
检查约束(
及_(
或_(
函数日期(“月”,我的表开始)=函数日期(“月”,我的表结束),
函数提取('day',my_table_end)==1
),

(my_table_end-(my_table_start+func.make_interval(0,1))SQLA根据对象标识标识
列()
对象,因此您应该预先创建它们,并对每个列引用使用相同的对象。