我正在使用 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/