Python 无法使用SQLAlchemy';具有属性getter的ilike方法
我正在实现一个用户名搜索功能。有些名称有重音字符,但我希望能够用最接近的ascii字符近似值搜索它们。例如:Python 无法使用SQLAlchemy';具有属性getter的ilike方法,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我正在实现一个用户名搜索功能。有些名称有重音字符,但我希望能够用最接近的ascii字符近似值搜索它们。例如:VþTrån可以使用Vu-Tran进行搜索 我找到了一个名为unidecode的Python库来处理这种转换。它按预期工作,接受我的unicode字符串VþTrån,并返回Vu-Tran。太好了 当我开始查询我的数据库时,问题就出现了——我使用SQLAlchemy和Postgres 下面是我的Python查询: Person.query.filter(Person.ascii_name.i
VþTrån
可以使用Vu-Tran
进行搜索
我找到了一个名为unidecode
的Python库来处理这种转换。它按预期工作,接受我的unicode字符串VþTrån
,并返回Vu-Tran
。太好了
当我开始查询我的数据库时,问题就出现了——我使用SQLAlchemy和Postgres
下面是我的Python查询:
Person.query.filter(Person.ascii_name.ilike("%{q}%".format(q=query))).limit(25).all()
ascii\u name
是my name列的getter,实现如下
class Person(Base, PersonUtil):
"""
My abbreviated Person class
"""
__tablename__ = 'person'
id = Column(BigInteger, ForeignKey('user.id'), primary_key=True)
first_name = Column(Unicode, nullable=False)
last_name = Column(Unicode, nullable=False)
name = column_property(first_name + " " + last_name)
ascii_name = synonym('name', descriptor=property(fget=PersonUtil._get_ascii_name))
class PersonUtil(object):
def _get_ascii_name(self):
return unidecode(unicode(self.name))
我在这段代码背后的意图是,因为我在数据库中存储了名字和姓氏的unicode版本,所以在检索人名时,我需要有一种方法来调用unidecode(unicode(name))
。因此,我使用了descriptor=property(fget=…)
,这样每当我调用Person.ascii\u name
,我都会检索“unidecoded”name
属性。这样,我就可以简单地编写Person.ascii\u name.ilike(“%{my\u query}%”)…
并将最近的ascii\u名称与搜索查询匹配,这也是ascii字符
这不完全有效。当查询中没有任何转换字符时,使用ascii\u name
的ilike
方法可以工作。例如,ilike
查询将用于名称“Bob Smith”,但不适用于“BøB Smíth”。当遇到第一个转换的字符时失败,在“BøB Smíth”的情况下,它是字母“ø”
我不知道为什么会这样。ascii_name
getter返回我期望的字符串“Bob Smith”或“Vu Tran”,但是当与ilike
方法结合使用时,它不起作用
谢谢。您想做的事情根本不起作用,因为
ilike
只对数据库中的实际列起作用。column\u属性
和同义词
只是sqlalchemy提供的语法糖,有助于简化前端。如果您想利用后端以您想要的方式使用像
一样进行查询,则需要实际值。恐怕您必须将ascii全名生成/存储到数据库中,这意味着您需要更改模式以将ascii_名称包含为实列,并确保它们已插入。要亲自验证这一点,您应该转储表中的数据,看看手动构造的查询是否可行。谢谢您的回答。更改db模式不是什么大问题,但是如果能够在不修改模式的情况下做到这一点,那就太好了。似乎没有其他选择。PostgreSQL本身也有类似之处: