У меня есть следующая модель с индексом:Создать частичный индекс с 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ä!
Ну, для начала '«активна»true' это просто выражение питона, которое вычисляется в' false', который передается в качестве аргумента. Создаете ли вы 'Index' в классе класса в' __table_args__'? Вместо этого вы можете создать «Индекс» отдельно, что позволит вам получить доступ к соответствующим столбцам с помощью модели «Пользователь». –
Нет. Я не создаю его в __table_args__. Я создаю его в пользовательском классе. Когда я пытаюсь создать его вне класса, я получаю эту ошибку: «Объект« bool »не имеет атрибута« _compiler_dispatch »» – Eelco
Вы также не должны использовать 'is'. Это сопоставление идентичности объектов и не может быть переопределено, следовательно, это не сработает, даже если вы используете правильные sqla-конструкции. Вы получаете ошибку, потому что вы передаете 'False' как аргумент * postgresql_where *, который sqla не может скомпилировать. –