从 Blaze 调用 SQL 个函数

calling SQL functions from Blaze

我特别想调用 Postgres levenshtein 函数。 我想将 blaze 查询写入 return 个类似于单词 'similar' 的单词,即相当于:

select word from wordtable where levenshtein(word, 'similar') < 3;

在 Blaze 中,这应该类似于

db.wordtable.word[levenshtein(db.wordtable.word, 'similar') < 3]

但是 levenshtein 没有在我在 python 端导入的任何模块中定义。 Where/how 我是否在 Python 端获得了用于 Blaze 表达式的 levenshtein 定义?


我找到了 sqlalchemy.sql.func 包,它为 SQL 函数提供 Python 句柄以用于 SqlAlchemy,但这些在 Blaze 表达式中不起作用。是否有等效的 Blaze 包,或者我如何在 Blaze 表达式中使用 sqlalchemy.sql.func.levenshtein

PyPi is your friend. Searching there finds the python-Levenshtein 包裹。如果您使用 windows 并想要预编译版本,请使用 Christoph Gohlke's wheel(他的构建安全、可靠且正确;numpy 构建使用 MKL 库,因此它们也很快!)。

如果您希望看到这些词并对它们执行一些简单的操作,您可以尝试从 Postgres 查询将过滤后的数据加载到 Blaze。

from blaze import data
import sqlalchemy as sa

engine = sa.create_engine('postgresql://...')
result = engine.execute('''select word from wordtable where levenshtein(word, 'similar') < 3;''')
rows = result.fetchall()
wordtable = data(rows)

# Now you may work with wordtable as a blaze table
wordtable[wordtable.word.like('a*')]  # all words starting with 'a'

Blaze 只是一个前端;并重组,然后将查询提供给 SQL 后端,后者从您的数据库收集数据。

From the doku:

What operations work on SQL databases? Most tabular operations, but not all. SQLAlchemy translation is a high priority. Failures include array operations like slicing and dot products don’t make sense in SQL. Additionally some operations like datetime access are not yet well supported through SQLAlchemy. Finally some databases, like SQLite, have limited support for common mathematical functions like sin.

Blaze 旨在忘记后端,并为所有后端提供相似/相同的语法。因此它只支持普通操作。在我看来,不可能指定 sqlalchemy 或 postgresql 函数供 blaze 使用,因此我认为现在这是不可能的。

... 但是 blaze 有 0.10 版,它是去年积极贡献的测试版。我有信心,这将在一段时间内实施。您始终可以跟踪 release notes.

中的更改

补充: 要进一步解释 SQL 中的 UDF(用户定义函数)并在 blaze 中使用它们,请比较 link provided by beldaz(与此问题非常相似)。