2016-06-08 4 views
0

У меня есть следующая модель с индексом:Создать частичный индекс с SQLAlchemy и Alembic

class User(TableMixin, Base): 
    username = Column(String, nullable=False, unique=False) 
    password = Column(String, nullable=False, unique=False) 

    Index('ix_active_username', "active", username, 
      unique=True, 
      postgresql_where=("active" is True) 
     ) 

С TabbleMixin классом

class TableMixin(): 
    id = Column(Integer, primary_key=True) 
    active = Column(Boolean, nullable=False, default=True) 

Индексом Я хотел бы создать в моей Postgres БД:

CREATE UNIQUE INDEX unique_active_username on user (username, active) 
where active = True; 

Актив находится между кавычками, потому что он не распознается, так как он не распознается внутри пользователя c деваха.

После того, как я выполнил «alembic revision --autogenerate», файл alembic пуст. Кто-нибудь знает, что я делаю неправильно?

РЕДАКТИРОВАТЬ: Все, что мне нужно было сделать, это поместить индекс вне сферы действия класса. И изменить Куда

postgresql_where=(User.active == true()) 

Все Код:

class User(TableMixin, Base): 
    username = Column(String, nullable=False, unique=False) 
    password = Column(String, nullable=False, unique=False) 

class TableMixin(): 
    id = Column(Integer, primary_key=True) 
    active = Column(Boolean, nullable=False, default=True) 

Index('ix_active_username', User.active, User.username, 
     unique=True, 
     postgresql_where=(User.active == true()) 
    ) 

благодаря Илье Everilä!

+1

Ну, для начала '«активна»true' это просто выражение питона, которое вычисляется в' false', который передается в качестве аргумента. Создаете ли вы 'Index' в классе класса в' __table_args__'? Вместо этого вы можете создать «Индекс» отдельно, что позволит вам получить доступ к соответствующим столбцам с помощью модели «Пользователь». –

+0

Нет. Я не создаю его в __table_args__. Я создаю его в пользовательском классе. Когда я пытаюсь создать его вне класса, я получаю эту ошибку: «Объект« bool »не имеет атрибута« _compiler_dispatch »» – Eelco

+1

Вы также не должны использовать 'is'. Это сопоставление идентичности объектов и не может быть переопределено, следовательно, это не сработает, даже если вы используете правильные sqla-конструкции. Вы получаете ошибку, потому что вы передаете 'False' как аргумент * postgresql_where *, который sqla не может скомпилировать. –

ответ

3

Комплексное решение:

class User(TableMixin, Base): 
    username = Column(String, nullable=False, unique=False) 
    password = Column(String, nullable=False, unique=False) 

class TableMixin(): 
    id = Column(Integer, primary_key=True) 
    active = Column(Boolean, nullable=False, default=True) 

Index('ix_active_username', User.active, User.username, 
     unique=True, 
     postgresql_where=(User.active == true()) 
    ) 
Смежные вопросы