SQLAlchemy CheckConstraint com várias condições gera aviso

Sep 06 2020

Estou usando SQLAlchemy 1.3.18, Python 3.8.5 e PostgreSQL 12.

Eu tenho a seguinte declaração de tabela com uma restrição de verificação com várias colunas e condições:

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

Embora o aplicativo crie a restrição de verificação no banco de dados corretamente, estou recebendo o seguinte aviso:

C:\Python38\lib\site-packages\sqlalchemy\sql\base.py:559: SAAviso: Coluna 'fim' na tabela Nenhuma sendo substituída por <sqlalchemy.sql.elements.ColumnClause em 0x26522ab0e50; end>, que tem a mesma chave. Considere use_labels para instruções select().

C:\Python38\lib\site-packages\sqlalchemy\sql\base.py:559: SAAviso: Coluna 'start' na tabela Nenhuma sendo substituída por <sqlalchemy.sql.elements.ColumnClause em 0x26522ab0b80; start>, que tem a mesma chave. Considere use_labels para instruções select().

C:\Python38\lib\site-packages\sqlalchemy\sql\base.py:559: SAAviso: Coluna 'end' na tabela Nenhuma sendo substituída por <sqlalchemy.sql.elements.ColumnClause em 0x26522ab0c70; end>, que tem a mesma chave. Considere use_labels para instruções select().

O que estou fazendo errado?

Respostas

1 AndreFeijo Sep 06 2020 at 14:23

Obrigado a Ilja Everilä pelo comentário que resolveu o problema.

Esta é a solução, coloque as colunas em variáveis ​​para que sejam o mesmo objeto na memória.

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