Saltar al contenido

¿Cómo usar Enum con SQLAlchemy y Alambic?

Solución:

¿Por qué los valores reales en la base de datos son ‘BORRADOR’, ‘APROBAR’, ‘PUBLICADO’, pero no borrador, etc.? Supuse que debería haber valores ENUM, no nombres.

Como el ya mencionado SQLAlchemy de Peter Bašista usa el nombres de enumeración (BORRADOR, APROBADO, PUBLICADO) en la base de datos. Supongo que se hizo porque los valores de enumeración (“borrador”, “aprobar”, …) pueden ser tipos arbitrarios en Python y no se garantiza que sean únicos (a menos que @unique se utiliza).

sin embargo, desde SQLAlchemy 1.2.3 los Enum la clase acepta un parámetro values_callable que se puede utilizar para almacenar valores de enumeración en la base de datos:

    status = db.Column(
        db.Enum(PostStatus, values_callable=lambda obj: [e.value for e in obj]),
        nullable=False,
        default=PostStatus.DRAFT.value,
        server_default=PostStatus.DRAFT.value
    )

¿Por qué el tipo poststatus no se creó en el nivel de base de datos automáticamente? En la migración similar fue.

Creo que básicamente estás alcanzando una limitación de alambique: no manejará las enumeraciones en PostgreSQL correctamente en algunos casos. Sospecho que el problema principal en su caso es que Autogenerate no maneja correctamente las enumeraciones postgresql # 278.

Noté que el tipo se crea correctamente si uso alembic.op.create_table entonces mi solución es básicamente:

enum_type = SQLEnum(PostStatus, values_callable=lambda enum: [e.value for e in enum])
op.create_table(
    '_dummy',
    sa.Column('id', Integer, primary_key=True),
    sa.Column('status', enum_type)
)
op.drop_table('_dummy')
c_status = Column('status', enum_type, nullable=False)
add_column('posts', c_status)

Solo puedo responder a la tercera parte de tu pregunta.

La documentación para el Enum escriba en SQLAlchemy establece que:

Arriba, los nombres de cadena de cada elemento, por ejemplo, “uno”, “dos”, “tres”, se conservan en la base de datos; los valores de Python Enum, aquí indicados como enteros, son no usó; por lo tanto, el valor de cada enumeración puede ser cualquier tipo de objeto Python, sea persistente o no.

Entonces, es por el diseño de SQLAlchemy que Enum nombres, los valores no se conservan en la base de datos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *