5

我正在使用 SQLAlchemy 与我的数据库通信。因为没有多少人会使用我的应用程序(至少最初是这样),我认为 SQLite 是最快/最简单的后端。

我有一个User,它有一个基于字符串的唯一 ID,例如asdf@asdf.comMr. Fnord。我不在乎 id 是什么格式 - 只是它是独一无二的。但是,我希望这是一个不区分大小写的唯一性。所以Mr. Fnordmr. fNoRd将是等价的。

显然,COLLATE您可以使用架构上的设置,但是(至少使用 sqlite)它似乎并没有向前发展。我的解决方案是使用类上的属性在它上桌之前将所有内容小写,但这似乎很脆弱/hackish。

属性是处理小写所有内容的最佳方法,还是有更好的方法通过 SQLAlchemy/SQLite 使事物不区分大小写?

4

1 回答 1

10

我没有亲自尝试过,但也许您可以使用自定义比较器运算符?IE

class CaseInsensitiveColumnComparator(ColumnProperty.Comparator):
    def __eq__(self, other):
        return func.lower(self.__clause_element__()) == func.lower(other)

这样,您的 ID 可以在任何情况下存储,但会以小写形式进行比较。


另一个想法 -增加 sqlalchemy.types.Text,并将其用于您的 ID。

import sqlalchemy.types as types

class LowerCaseText(types.TypeDecorator):
    '''Converts strings to lower case on the way in.'''

    impl = types.Text

    def process_bind_param(self, value, dialect):
        return value.lower()

class User(Base):
    __tablename__ = 'user'
    id = Column(LowerCaseText, primary_key=True)
    ...
于 2012-12-27T02:53:34.377 回答