Newt查询示例
项目描述
Newt QBE是一个小型Newt DB插件,它提供帮助构建用于搜索Newt DB数据库的SQL WHERE子句,尤其是在由表单输入驱动搜索时。它还提供了一些JSONB搜索表达式细节的抽象。
Newt QBE的目标不是替代SQL的使用。PostgreSQL功能强大且文档齐全。如果您了解如何在搜索Newt数据库时应用它,您将从Newt DB中获得更多益处。为此,这个包可以提供一些SQL构建提示。
概述
要设置Newt QBE,您需要创建一个QBE对象,向其中添加一些项目,并将其添加到您的数据库中
>>> import newt.qbe >>> qbe = newt.qbe.QBE() >>> qbe['email'] = newt.qbe.scalar('email') >>> qbe['stars'] = newt.qbe.scalar("state->'rating'->'stars'", type='int') >>> qbe['keywords'] = newt.qbe.text_array('keywords') >>> qbe['path'] = newt.qbe.prefix('path', delimiter='/') >>> qbe['text'] = newt.qbe.fulltext('content_text(state)', 'english')
然后,您可以使用sql方法生成SQL,该方法接受一个包含项目名称和值的字典
>>> import newt.db >>> conn = newt.db.connection(dsn) >>> sql = qbe.sql(conn, dict(path='/foo', text='newt')) >>> result = conn.where(sql)
除了条件映射外,您还可以提供一个order_by关键字参数来指定排序信息。
QBE中的项目是搜索助手。有几个内置助手
- match
精确匹配标量值,利用标准的JSONB GIN索引
- scalar
搜索标量数据,包括范围搜索
- text_array
搜索文本数组数据
- prefix
通过前缀搜索字符串标量。
- fulltext
文本字段的全文搜索
- sql
使用提供的SQL的搜索器
您还可以通过实现一个相当简单的API来定义自己的助手。搜索助手提供以下方法,其中只有一个方法是必需的
- __call__(cursor, query)
计算助手对搜索WHERE子句的贡献。
此必需方法返回一个字节SQL表达式。
查询的必需格式由助手决定。
助手必须使用游标参数的mogrify方法来替换查询中的数据。
- order_by(cursor, query)
计算用于ORDER BY子句的PostgreSQL表达式。
此必需方法返回一个字节SQL表达式。
此方法为可选。如果不提供,则不允许在助手上进行排序。
如果需要,助手必须使用游标参数的mogrify方法来替换查询中的数据。
- index_sql(name)
返回用于创建相应索引的PostgreSQL字符串。
此方法为可选。
构造函数参数和搜索条件对每个助手都是特定的。
QBE方法
QBE对象提供以下方法
sql(query, order_by=())
返回PostgreSQLWHERE子句的内容(以字节形式)。
通过组合查询中给出的表达式返回SQL布尔表达式。如果查询为空,则返回'true'。
查询参数必须是一个映射对象。键也必须在QBE中存在。值(格式由助手特定)传递给助手的__call__方法。
order_by参数是一个排序条件的可迭代对象。项目可以是助手名称或包含助手名称和降序标志的两个元组。
为了说明用法,以下是使用概述部分中创建的QBE对象的一些示例
>>> qbe.sql(conn, dict()) b'true'>>> print(qbe.sql(conn, dict(text='database', path='/wiki'), ... order_by=[('stars', True), 'text']).decode('ascii')) (((state ->> 'path') || '/') like '/wiki' || '/%') AND content_text(state) @@ to_tsquery('english', 'database') ORDER BY (state->'rating'->>'stars')::int DESC, ts_rank_cd(array[0.1, 0.2, 0.4, 1], content_text(state), to_tsquery('english', 'database'))
index_sql(*names)
返回用于为给定助手创建索引的PostgreSQL文本列表。如果没有指定助手,则返回所有助手的语句(实现可选的index_sql方法的助手)。
>>> for sql in qbe.index_sql(): ... print(sql) CREATE INDEX CONCURRENTLY newt_email_idx ON newt ((state ->> 'email')) CREATE INDEX CONCURRENTLY newt_keywords_idx ON newt USING GIN ((state -> 'keywords')) CREATE INDEX CONCURRENTLY newt_path_idx ON newt (((state ->> 'path') || '/') text_pattern_ops) CREATE INDEX CONCURRENTLY newt_stars_idx ON newt (((state->'rating'->>'stars')::int)) CREATE INDEX CONCURRENTLY newt_text_idx ON newt USING GIN (content_text(state))
返回列表是因为需要单独执行这些语句(因为使用了CONCURRENTLY)。
内置辅助函数
match(name, convert=None)
匹配命名标量值(使用JSONB @>运算符)。这利用了Newt数据库默认创建的JSON GIN索引。它不支持范围搜索。
scalar(expr, type=None, convert=None)
scalar助手根据标量值进行搜索。构造函数接受一个产生文本结果的表达式。为了方便起见,如果提供了一个标识符(例如'email'),则它将被计算为访问顶级属性的表达式。为了方便起见,如果提供了一个简单的JSON访问器表达式,如
state -> 'x' -> 0
它将被修改以产生文本结果
state -> 'x' ->> 0
您还可以提供一个可选的第二个参数,给出将文本值转换为的PostgreSQL数据类型的名称。
可选的 convert 参数提供了一个可调用的函数,用于将查询值转换为可以传递给 psycopg2 游标 mogrify 方法的值。
text_array(expr, convert=None)
array 辅助函数基于文本数组值进行搜索。构造函数接受一个表达式,该表达式产生一个 PostgreSQL 文本数组。
搜索基于重叠。如果搜索值与给定的查询值有共同元素,则满足搜索条件。例如,查询 ['a', 'b'] 与 PostgreSQL 数组 ['a', 'c'] 匹配。
可选的 convert 参数提供了一个可调用的函数,用于将查询值转换为可以传递给 psycopg2 游标 mogrify 方法的值。
prefix(expr, delimiter=None, convert=None)
prefix 辅助函数支持对标量文本值进行前缀查询。这通常用于路径搜索。
构造函数接受一个表达式,该表达式产生一个文本结果。与标量辅助函数一样,如果需要,标识符或 JSON 访问器将被转换为表达式。
可以提供一个可选的第二个参数,给出路径分隔符。如果提供了,分隔符将包含在 like 查询中。如果从标识符或更简单的 JSON 访问器生成表达式,则分隔符也将包含在生成的表达式中。
可选的 convert 参数提供了一个可调用的函数,用于将查询值转换为可以传递给 psycopg2 游标 mogrify 方法的值。
fulltext(expr, config, parer=None, weights=(.1, .2, .4, 1.0))
fulltext 辅助函数支持全文搜索。构造函数接受一个表达式,该表达式评估为 PostgreSQL ts_vector 以及一个 测试搜索配置 的名称。
为了方便,如果提供了一个标识符或 JSON 访问器(例如 state -> 'x' -> 0),则会生成一个 tsvector 表达式。
在搜索时,查询作为字符串提供,并传递给 to_tsquery。可以提供一个可选的查询解析函数来转换搜索查询。
如果使用文本辅助函数进行排序,则将使用提供的权重调用 ts_rank_cd 函数。
sql(cond, order=None, convert=None)
sql 辅助函数提供了一种将任意 SQL 封装为搜索辅助函数的方法。构造函数接受一个字符串 SQL 表达式,用于在搜索时使用。该字符串应包含一个用于替换查询数据的单个 占位符。
可以提供一个可选的第二个参数,用于排序的 SQL 表达式。
可选的 convert 参数提供了一个可调用的函数,用于将查询值转换为可以传递给 psycopg2 游标 mogrify 方法的值。
状态
该项目处于早期开发阶段。内置的辅助函数涵盖了常见情况。初始辅助函数对于最初开发的应用程序来说很方便。可以想象未来的增强功能。欢迎贡献和建议,尤其是当它们是由具体需求驱动时。
值得注意的是,sql 辅助函数可以覆盖很多空白。例如,初始应用程序需要搜索来自函数的 PostgreSQL 数组,而不是 JSON 数组。这可以通过 sql 辅助函数轻松处理。
sql("allowed_to_view(state) && %s")
变更历史
0.1.1 (2017-06-21)
修复了在排序时使用全文索引导致生成无效 SQL 的 sql 生成错误。
0.1.0 (2017-04-26)
初始发布
项目详情
newt.qbe-0.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b685f969cda84aaf968283a29fc09a153176da23efe749250e7c38ab4c06c04e |
|
MD5 | fb0d368bbdb0c4f4c7d4ca077741684d |
|
BLAKE2b-256 | 96c2817e233b34c8dd6398d857f29e3c951a2145260d3eb005b584a30ddae888 |