如何在SQLAlchemy中添加UniqueConstraint

时间:2018-04-27 06:35:07

标签: database sqlalchemy

如何使用SQLalchemy添加一个不区分大小写的UniqueConstraint?

2 个答案:

答案 0 :(得分:2)

在某些数据库中,字符串列默认情况下不区分大小写(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以为特定数据库创建约束。

答案 1 :(得分:0)

要添加@jspcal的答案,如果使用class定义模型,则必须在声明model后使用text独立实例化它。 1}} contruct。

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)

使用文本contruct;

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)

注意: table_args 需要成为一个元组,因此需要在括号内使用该逗号。

这将以小写形式在表username的{​​{1}}列上创建索引。因此,此列中存储的数据是唯一且不区分大小写的。