2015-03-06 10 views
8

Używam SQLAlchemy core z bazą danych PostgreSQL i chcę dodać typ ENUM do mojej definicji tabeli. Według postgresql documentation, typu ENUM muszą być zdefiniowane przed tworzona jest tabela:Typ ENUM w SQLAlchemy z PostgreSQL

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

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

Problem jest, gdy tworzę definicji tabeli. Po przeczytaniu SQLAlchemy documentation nie mogłem znaleźć żadnego przykładu wdrożenia. Próbowałem czegoś takiego, ale to nie zadziałało:

from sqlalchemy.dialects.postgresql import ENUM 

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

Jak to zrobić?

Odpowiedz

11

Musisz zaimportować Enum z sqlalchemy i dodać do niego nazwę. Powinno działać tak:

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

Aby to działało dla mnie z postgres, musiałem "z sqlalchemy.dialects.postgresql importować ENUM'A – miah

14

@ Odpowiedź Tima jest zdecydowanie poprawna, ale chciałem zaoferować sposób, w jaki skonfigurowałem moje ENUM.

W moim models.py będę tworzyć wartości jak krotki

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

Wtedy utworzyć zmienną skill_level_enum i przydzielić mu klasę ENUM z wartościami poziomu umiejętności jak args.

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

W moim modelu tabeli potem przechodzą w skill_level_enum

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

Znalazłem to sprawia, że ​​mój kod wiele czystsze i jestem w stanie dokonać aktualizacji do skill_levels na szczycie z mojego pliku, zamiast skanować moje modele, aby je zaktualizować.

+0

czy możesz ponownie użyć tej samej definicji enum w wielu tabelach w ten sposób? – filiprem

+0

To prawda, możesz zdefiniować wyliczenie raz i używać go w dowolnym miejscu. – m1yag1

Powiązane problemy