SQLAlchemy - 强制执行两列唯一约束,其中一列需要不区分大小写

时间:2014-09-29 04:53:13

标签: postgresql sqlalchemy unique-constraint case-insensitive

我正在使用SQLAlchemy和PostgreSQL,我想在sqlalchemy的一个表中对两列强制执行唯一约束。一列是数字(整数),一列是字母数字字符串。字母数字列必须按原样存储。 (即大写和小写字符的混合),但强制执行的唯一约束需要不区分大小写。

这是一个单词'标签列表'每个都带有外键的主题'。考虑tags表中的三列:id,topic_id和name。每个主题不能有多个相同的标记名称(不区分大小写)。换句话说,如果主题是“鱼”。 (tags.topic_id = 7)已经有' goldfish'的tags.name,你将无法添加另一行tag.topic_id = 7并且tag.name为' GolDFiSH& #39 ;.这两个标签是相同的,topic_id在不区分大小写的基础上是相同的。

这样做的正确方法是什么?

我为思想启动者提供了两个相关的参考资料:

(i)定义新的变量类型:https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/StringComparisonFilter

(ii)原始SQL:Create Unqiue case-insensitive constraint on two varchar fields

选项(i)和(ii)两者似乎都没问题,但这两者中哪一个更好,还是有更好的第三种方式?

最简单的解决方案是我所追求的。

我目前的想法是创造另一个幻象'名为tags.lower_case.name的列,由于自定义 init 方法和tags.name的自定义setter,因此会使用小写版本的tags.name进行填充。然后在此幻像列上强制执行唯一约束。

我正在考虑的另一个想法是看看我是否可以跨两列创建索引,并对该索引强制执行一些唯一约束(忽略一列上的大小写),请参阅here

0 个答案:

没有答案