Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用SQLAlchemy';具有属性getter的ilike方法_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python 无法使用SQLAlchemy';具有属性getter的ilike方法

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

我正在实现一个用户名搜索功能。有些名称有重音字符,但我希望能够用最接近的ascii字符近似值搜索它们。例如:
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
方法结合使用时,它不起作用

  • 为什么会这样?我找不到关于这个问题的任何信息
  • 我如何修复现有代码以使其工作,或者有更好的方法来完成这项工作?我宁愿不必更改我的DB模式

  • 谢谢。

    您想做的事情根本不起作用,因为
    ilike
    只对数据库中的实际列起作用。
    column\u属性
    同义词
    只是sqlalchemy提供的语法糖,有助于简化前端。如果您想利用后端以您想要的方式使用
    一样进行查询,则需要实际值。恐怕您必须将ascii全名生成/存储到数据库中,这意味着您需要更改模式以将ascii_名称包含为实列,并确保它们已插入。要亲自验证这一点,您应该转储表中的数据,看看手动构造的查询是否可行。

    谢谢您的回答。更改db模式不是什么大问题,但是如果能够在不修改模式的情况下做到这一点,那就太好了。似乎没有其他选择。PostgreSQL本身也有类似之处: