SQLAlchemy CheckConstraint con múltiples condiciones genera una advertencia

Sep 06 2020

Estoy usando SQLAlchemy 1.3.18, Python 3.8.5 y PostgreSQL 12.

Tengo la siguiente declaración de tabla con una restricción de verificación con múltiples columnas y condiciones:

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

Aunque la aplicación SÍ crea correctamente la restricción de verificación en la base de datos, recibo la siguiente advertencia:

C: \ Python38 \ lib \ site-packages \ sqlalchemy \ sql \ base.py: 559: SAWarning: Column 'end' on table Ninguna reemplazada por <sqlalchemy.sql.elements.ColumnClause en 0x26522ab0e50; end>, que tiene la misma clave. Considere use_labels para las declaraciones select ().

C: \ Python38 \ lib \ site-packages \ sqlalchemy \ sql \ base.py: 559: SAWarning: Columna 'start' en la tabla Ninguna reemplazada por <sqlalchemy.sql.elements.ColumnClause en 0x26522ab0b80; start>, que tiene la misma clave. Considere use_labels para las declaraciones select ().

C: \ Python38 \ lib \ site-packages \ sqlalchemy \ sql \ base.py: 559: SAWarning: Column 'end' on table Ninguna reemplazada por <sqlalchemy.sql.elements.ColumnClause en 0x26522ab0c70; end>, que tiene la misma clave. Considere use_labels para las declaraciones select ().

¿Que estoy haciendo mal?

Respuestas

1 AndreFeijo Sep 06 2020 at 14:23

Gracias a Ilja Everilä por el comentario que resolvió el problema.

Esta es la solución, ponga las columnas en variables para que sean el mismo objeto en la memoria.

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