高级过滤器#

dataset 提供两种运行查询的方法:table.find()db.query()。表查找辅助方法提供有限但简单的过滤选项

results = table.find(column={operator: value})
# e.g.:
results = table.find(name={'like': '%mole rat%'})

一种特殊形式是在特定列上使用关键字搜索

results = table.find(value=5)
# equal to:
results = table.find(value={'=': 5})

# Lists, tuples and sets are turned into `IN` queries:
results = table.find(category=('foo', 'bar'))
# equal to:
results = table.find(value={'in': ('foo', 'bar')})

支持以下比较运算符

运算符

描述

gt, >

大于

lt, <

小于

gte, >=

大于或等于

lte, <=

小于或等于

!=, <>, not

不等于单个值

in

值在给定序列中

notin

值不在给定序列中

like, ilike

文本搜索,ILIKE 不区分大小写。使用 % 作为通配符

notlike

类似文本搜索,但检查模式是否不存在

between, ..

值在给定元组中的两个值之间

startswith

字符串以开头

endswith

字符串以结尾

查询不存在于表中的列上的特定值将返回无结果。

您还可以通过回退到 dataset 包装的 SQLAlchemy 核心对象,将其他 SQLAlchemy 子句传递到 table.find() 方法中

# Get the column `city` from the dataset table:
column = table.table.columns.city
# Define a SQLAlchemy clause:
clause = column.ilike('amsterda%')
# Query using the clause:
results = table.find(clause)

这也可以用于定义组合的 OR 子句(例如 city = ‘Bla’ OR country = ‘Foo’)。

使用原始 SQL 的查询#

要运行更复杂的查询(包括 JOIN 或执行 GROUP BY 样式的聚合),您也可以使用 db.query() 来运行原始 SQL 查询。这也支持参数化以避免 SQL 注入。

最后,如果您正在寻找一种以编程方式组合生成 SQL 的方法,您应该考虑回退到 SQLAlchemy 核心来构建查询。