如何使用SQLalchemy添加一个不区分大小写的UniqueConstraint?
答案 0 :(得分:2)
在某些数据库中,字符串列默认情况下不区分大小写(MySQL,SQL Server),因此您不需要做任何额外的操作。
在其他情况下,您可以创建一个强制执行不区分大小写的唯一约束的功能索引:
Index('myIndex', func.lower(mytable.c.myColumn), unique=True)
如果数据库支持,您还可以为列指定不区分大小写的排序规则。例如,SQLite有一个' NOCASE'归类:
myColumn = Column(String(255), collation='NOCASE', nullable=False)
如果您的数据库提供了合适的列,您也可以为列指定用户定义的类型。 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}}列上创建索引。因此,此列中存储的数据是唯一且不区分大小写的。