python - 使 SQLalchemy 将字符串存储为小写的正确方法是什么?

标签 python sqlite sqlalchemy case-insensitive

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

我有一个 User,它有一个基于字符串的唯一 ID,例如asdf@asdf.com,或 先生。弗诺德。我不在乎 id 的格式 - 只是它是独一无二的。但是,我希望这是一个不区分大小写的唯一性。所以先生。 Fnord先生。 fNoRd 是等价的。

显然,在您可以使用的架构上有一个 COLLATE 设置,但是(至少对于 sqlite)它似乎并不直接。我的解决方案是在类上使用属性将所有内容小写,然后再放到表中,但这看起来很脆弱/hackish。

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

最佳答案

我没有亲自尝试过,但也许你可以使用 custom comparator operator ? IE。

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

这样,您的 ID 可以以任何大小写形式存储,但将以小写形式进行比较。


另一个想法 - augment 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)
    ...

关于python - 使 SQLalchemy 将字符串存储为小写的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14048562/

相关文章:

python sqlalchemy结合来自两个表的查询

python - SQLAlchemy + pyTelegramBotAPI : SQLite objects created in a thread can only be used in that same thread

python - 使用 Python 确定当前的 Mac Safari 网页

python - 在 Python3 中使用循环计算阶乘

python - 在 Windows 7 上使用 pyodbc 访问本地 SQL Server 2008 数据库

python - sqlalchemy 无法获取过滤器选项中 bool 字段的数据(用 is 指定)

用于文件夹列表的 Python Inotify

mysql - Python 3.4 - 如何将 Pandas 数据面板(非框架)转换为 mySQL 数据库?

android - 选择同一组的多个相关行 onlongclick ListView

java - 错误: “Method getText() must be called from the UI thread, currently inferred thread is worker.”