【问题标题】:SQLAlchemy CheckConstraint with multiple conditions raises warning具有多个条件的 SQLAlchemy CheckConstraint 引发警告
【发布时间】:2020-12-24 21:01:07
【问题描述】:

我正在使用 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())
        )
    )
)

虽然应用程序确实在数据库中正确创建了检查约束,但我收到以下警告:

C:\Python38\lib\site-packages\sqlalchemy\sql\base.py:559: SAWarning: 表上的列“结束”没有被替换 ,其中 有相同的钥匙。考虑 select() 语句的 use_labels。

C:\Python38\lib\site-packages\sqlalchemy\sql\base.py:559: SAWarning: 表上的“开始”列没有被替换 ,其中 有相同的钥匙。考虑 select() 语句的 use_labels。

C:\Python38\lib\site-packages\sqlalchemy\sql\base.py:559: SAWarning: 表上的列“结束”没有被替换 ,其中 有相同的钥匙。考虑 select() 语句的 use_labels。

我做错了什么?

【问题讨论】:

  • SQLA 根据对象身份识别column() 对象,因此您应该预先创建它们并为每个列引用使用相同的对象。

标签: python sqlalchemy


【解决方案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())
        )
    )
)

【讨论】:

  • 谢谢你...这让我免于消除一个毫无意义的神秘警告 :)
猜你喜欢
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2015-02-15
  • 2013-04-18
相关资源
最近更新 更多