与SQLAlchemy

时间:2017-12-04 14:30:05

标签: database performance sqlalchemy string-comparison

如何确保=运算符始终呈现不区分大小写?与LOWERUPPER函数的比较是性能的最佳选择吗? ILIKE似乎很慢。

2 个答案:

答案 0 :(得分:3)

如果您只需要不区分大小写,请使用高级低级,因为类似不仅仅是大小写不敏感

更低的示例:

 my_string = 'BarFoo'
session.query(Foo).filter(func.lower(Foo.bar) == my_string.lower()).all()

在此处查看喜欢的更多信息how to execute LIKE query in sqlalchemy?

答案 1 :(得分:0)

对于不区分大小写的比较,可以继承Comparator的子类。

  

Building Custom Comparators

下面的示例类允许对名为word_insensitive的属性进行不区分大小写的比较:

from sqlalchemy.ext.hybrid import Comparator, hybrid_property
from sqlalchemy import func, Column, Integer, String
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

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

class SearchWord(Base):
    __tablename__ = 'searchword'
    id = Column(Integer, primary_key=True)
    word = Column(String(255), nullable=False)

    @hybrid_property
    def word_insensitive(self):
        return self.word.lower()

    @word_insensitive.comparator
    def word_insensitive(cls):
        return CaseInsensitiveComparator(cls.word)

上面,针对word_insensitive的SQL表达式会将LOWER() SQL函数应用于双方:

>>> print Session().query(SearchWord).filter_by(word_insensitive="Trucks")
SELECT searchword.id AS searchword_id, searchword.word AS searchword_word FROM searchword
WHERE lower(searchword.word) = lower(:lower_1)

上面的CaseInsensitiveComparator实现了ColumnOperators接口的一部分。可以使用eq将“小写”之类的“强制”操作应用于所有比较操作(即ltgtOperators.operate()等):

class CaseInsensitiveComparator(Comparator):
    def operate(self, op, other):
        return op(func.lower(self.__clause_element__()), func.lower(other))