Как добавить UniqueConstraint в SQLAlchemy - PullRequest
0 голосов
/ 27 апреля 2018

Как добавить UniqueConstraint, который не учитывает регистр, используя SQLalchemy?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Чтобы добавить к ответу @ jspcal, если модель определена с использованием class, то вам нужно будет либо создать ее экземпляр самостоятельно после объявления model, либо использовать конструкцию text.

т.е.

from sqlalchemy.sql.expressions import func

class User(Base):
    __tablename__ = 'user'
    username = Column('username', String(24), nullable=False)

Index('user_username_index', func.lower(User.username), unique=True)

с использованием текстового контракта;

from sqlalchemy.sql.expressions import text

class User(Base):
    __tablename__ = 'user'
    __table_args__ = (
        Index('ix_user_name', text('LOWER(name)')), 
    )
    username = Column('username', String(24), nullable=False)

NB: table_args должен быть кортежем, поэтому необходимо использовать запятую в скобках.

Это создаст индекс для username столбца таблицы user в строчной форме. Поэтому данные, хранящиеся в этом столбце, уникальны и не чувствительны к регистру.

0 голосов
/ 27 апреля 2018

В некоторых базах данных строковые столбцы по умолчанию не чувствительны к регистру (MySQL, SQL Server), поэтому вам не нужно ничего делать.

В других случаях вы можете создать функциональный индекс, который вводит уникальное ограничение без учета регистра:

Index('myIndex', func.lower(mytable.c.myColumn), unique=True)

Вы также можете указать регистр без учета регистра для столбца, если база данных его поддерживает. Например, SQLite имеет сопоставление NOCASE:

myColumn = Column(String(255), collation='NOCASE', nullable=False)

См. http://docs.sqlalchemy.org/en/latest/core/type_basics.html?highlight=collation#sqlalchemy.types.String.params.collation

Вы также можете указать пользовательский тип для вашего столбца, если в вашей базе данных есть подходящий. PostgreSQL имеет тип данных citext, который не зависит от регистра. Смотри https://github.com/mahmoudimus/sqlalchemy-citext

Наконец, вы можете настроить DDL, чтобы создать ограничение для вашей конкретной базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...