SQLAlchemy CheckConstraint con múltiples condiciones genera una advertencia
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
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())
)
)
)