2015-03-06 18 views
8

Sto usando SQLAlchemy core con un database postgresql e vorrei aggiungere il tipo ENUM alla mia definizione di tabella. Secondo il postgresql documentation, il tipo enum deve essere definito prima viene creata la tabella:Tipo ENUM in SQLAlchemy con PostgreSQL

CREATE TYPE gender_enum AS ENUM ('female', 'male'); 

CREATE TABLE person (
    name VARCHAR(20), 
    gender gender_enum 
); 

Il problema è quando sto creando la definizione della tabella. Dopo aver letto SQLAlchemy documentation non sono riuscito a trovare alcun esempio di implementazione. Ho provato qualcosa di simile ma non ha funzionato:

from sqlalchemy.dialects.postgresql import ENUM 

person = Table('user_profile', metadata, 
    Column('name', String(20)), 
    Column('gender', ENUM('female','male')) 
); 

Come deve essere fatto?

risposta

11

È necessario importare Enum da un sqlalchemy e aggiungervi un nome. Dovrebbe funzionare in questo modo:

from sqlalchemy import Enum 

person = Table("user_profile", metadata, 
    Column("name", String(20)), 
    Column("gender", Enum("female", "male", name="gender_enum", create_type=False)) 
); 
+2

Per far funzionare questo post con Postgres, ho dovuto 'from sqlalchemy.dialects.postgresql import ENUM' – miah

14

@ La risposta di Tim è sicuramente corretta ma volevo offrire il modo in cui ho impostato il mio ENUM.

Nel mio models.py creerò i valori come tuple

skill_levels = ('Zero', 'A little', 'Some', 'A lot')

Poi mi creerà una variabile skill_level_enum e assegnare una classe di ENUM con i valori di livello di abilità come args.

skill_level_enum = ENUM(*skill_levels, name="skill_level")

Nel mio modello da tavolo allora mi passano nella skill_level_enum

class User(db.Model): 
    id = db.Column(db.Integer(), primary_key=True) 
    skill_level = db.Column(skill_level_enum) 

Ho trovato questo rende il mio codice molto più pulito e io sono in grado di effettuare gli aggiornamenti ai skill_levels in alto del mio file piuttosto che scansionare i miei modelli per la cosa giusta da aggiornare.

+0

è possibile riutilizzare lo stesso definizione di enum in molte tabelle in questo modo? – filiprem

+0

Questo è corretto, è possibile definire l'enum una volta e utilizzarlo ovunque sia necessario. – m1yag1

Problemi correlati