JSON API¶
Datasette 为您的 SQLite 数据库提供了 JSON API。您可以通过 Datasette 用户界面执行的任何操作,也可以通过 API 以 JSON 格式访问。
要访问页面的 API,您可以点击该页面上的 .json 链接,或者编辑 URL 并添加 .json 扩展名。
如果您使用 --cors 选项启动 Datasette,每个 JSON 端点都将包含以下额外的 HTTP 头
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Authorization
Access-Control-Expose-Headers: Link
这意味着在任何域上运行的 JavaScript 都能够发出跨域请求来获取数据。
如果您启动 Datasette 时不带 --cors 选项,则只有与 Datasette 在同一域上运行的 JavaScript 才能访问 API。
不同格式¶
SQLite 表或自定义查询数据的默认 JSON 表示形式如下所示
{
"database": "sf-trees",
"table": "qSpecies",
"columns": [
"id",
"value"
],
"rows": [
[
1,
"Myoporum laetum :: Myoporum"
],
[
2,
"Metrosideros excelsa :: New Zealand Xmas Tree"
],
[
3,
"Pinus radiata :: Monterey Pine"
]
],
"truncated": false,
"next": "100",
"next_url": "http://127.0.0.1:8001/sf-trees-02c8ef1/qSpecies.json?_next=100",
"query_ms": 1.9571781158447266
}
columns 键列出了返回的列,而 rows 键则返回一个列表的列表,其中每个子列表代表一行。每一行中值的顺序与列的顺序相对应。
可以使用 _shape 参数来访问 rows 键的替代格式,这可能对您的应用程序更方便。有以下几种选项:
?_shape=arrays-"rows"是默认选项,如上所示?_shape=objects-"rows"是一个 JSON 键/值对象列表?_shape=array- 一个 JSON 对象数组?_shape=array&_nl=on- 一个以换行符分隔的 JSON 对象列表?_shape=arrayfirst- 一个只包含每行第一个值的扁平 JSON 数组?_shape=object- 一个使用行主键作为键的 JSON 对象
_shape=objects 格式如下所示
{
"database": "sf-trees",
...
"rows": [
{
"id": 1,
"value": "Myoporum laetum :: Myoporum"
},
{
"id": 2,
"value": "Metrosideros excelsa :: New Zealand Xmas Tree"
},
{
"id": 3,
"value": "Pinus radiata :: Monterey Pine"
}
]
}
_shape=array 格式如下所示
[
{
"id": 1,
"value": "Myoporum laetum :: Myoporum"
},
{
"id": 2,
"value": "Metrosideros excelsa :: New Zealand Xmas Tree"
},
{
"id": 3,
"value": "Pinus radiata :: Monterey Pine"
}
]
_shape=array&_nl=on 格式如下所示
{"id": 1, "value": "Myoporum laetum :: Myoporum"}
{"id": 2, "value": "Metrosideros excelsa :: New Zealand Xmas Tree"}
{"id": 3, "value": "Pinus radiata :: Monterey Pine"}
_shape=arrayfirst 格式如下所示
[1, 2, 3]
_shape=object 格式如下所示
{
"1": {
"id": 1,
"value": "Myoporum laetum :: Myoporum"
},
"2": {
"id": 2,
"value": "Metrosideros excelsa :: New Zealand Xmas Tree"
},
"3": {
"id": 3,
"value": "Pinus radiata :: Monterey Pine"
}
]
object 格式仅适用于针对表的查询,因为自定义 SQL 查询和视图没有明确的主键,所以无法使用这种格式返回。
object 键总是字符串。如果您的表有复合主键,则 object 键将是一个逗号分隔的字符串。
分页¶
默认的 JSON 表示形式包含一个 "next_url" 键,可用于访问下一页结果。如果该键为 null 或缺失,则表示您已到达结果的最后一页。
其他表示形式将分页信息包含在 link HTTP 头中。该头大致如下所示
link: <https://latest.datasette.io/fixtures/sortable.json?_next=d%2Cv>; rel="next"
这是一个使用 requests 构建的 Python 函数示例,它返回从这些 API 端点之一分页获取的所有项目的列表
def paginate(url):
items = []
while url:
response = requests.get(url)
try:
url = response.links.get("next").get("url")
except AttributeError:
url = None
items.extend(response.json())
return items
特殊的 JSON 参数¶
每个可以返回 JSON 的 Datasette 端点也接受以下查询字符串参数
?_shape=SHAPE要返回的 JSON 的格式,如上文所述。
?_nl=on与
?_shape=array一起使用时,生成以换行符分隔的 JSON 对象。?_json=COLUMN1&_json=COLUMN2如果您的任何 SQLite 列包含 JSON 值,您可以使用一个或多个
_json=参数请求将这些列作为常规 JSON 返回。如果没有此参数,这些列将作为 JSON 对象返回,这些对象已被双重编码为 JSON 字符串值。?_json_infinity=on如果您的数据包含正无穷大或负无穷大值,Datasette 在将其作为 JSON 返回时会将其替换为 None。如果您传递
_json_infinity=1,Datasette 将改为将其返回为Infinity或-Infinity,这虽然不是有效的 JSON,但可以由某些自定义 JSON 解析器处理。?_timelimit=MS设置查询的自定义时间限制(以毫秒为单位)。您可以将其用于乐观查询,如果您希望查询耗时过长时 Datasette 放弃,例如,如果您想实现自动补全搜索,但仅限于执行时间少于 10ms 的情况。
?_ttl=SECONDS此响应应被 HTTP 代理缓存多少秒?使用
?_ttl=0完全禁用此请求的 HTTP 缓存。?_trace=1为此页面启用追踪:请求期间执行的 SQL 查询将被收集并包含在响应中,对于 JSON 响应,将位于新的
"_traces"键中,如果响应是 HTML,则位于页面底部。此处返回的数据结构应被视为高度不稳定,并且很可能发生变化。
仅当trace_debug 设置启用时可用。
表格参数¶
Datasette 表格视图接受许多特殊的查询字符串参数。
列过滤参数¶
您可以使用查询字符串参数,根据列值过滤表格返回的数据。
?column__exact=value或?_column=value返回指定列与值完全匹配的行。
?column__not=value返回指定列与值不匹配的行。
?column__contains=value字符串列包含指定值的行(在 SQL 中是
column like "%value%")。?column__endswith=value字符串列以指定值结尾的行(在 SQL 中是
column like "%value")。?column__startswith=value字符串列以指定值开头的行(在 SQL 中是
column like "value%")。?column__gt=value大于指定值的行。
?column__gte=value大于或等于指定值的行。
?column__lt=value小于指定值的行。
?column__lte=value小于或等于指定值的行。
?column__like=value使用 LIKE 子句匹配行,不区分大小写,并使用
%作为通配符。?column__notlike=value匹配与提供的 LIKE 子句不匹配的行。
?column__glob=value类似于 LIKE,但使用 Unix 通配符语法且区分大小写。
?column__in=value1,value2,value3匹配提供的任一值的行。
您可以使用逗号分隔的字符串,或者使用 JSON 数组。
如果您的匹配值之一本身包含逗号,则 JSON 数组选项非常有用
?column__in=["value","value,with,commas"]?column__notin=value1,value2,value3列与提供的任何值都不匹配的行。
__in=的反义。也支持 JSON 数组。?column__arraycontains=value适用于包含 JSON 数组的列 - 如果该数组中的任何值与提供的值匹配则匹配。
这仅在启用
json1SQLite 扩展时可用。?column__arraynotcontains=value适用于包含 JSON 数组的列 - 如果该数组中的任何值都不与提供的值匹配则匹配。
这仅在启用
json1SQLite 扩展时可用。?column__date=value列是一个发生在指定 YYYY-MM-DD 日期的日期戳,例如
2018-01-02。?column__isnull=1匹配列为 null 的行。
?column__notnull=1匹配列不为 null 的行。
?column__isblank=1匹配列为空白的行,即 null 或空字符串。
?column__notblank=1匹配列不为空白的行。
特殊的表格参数¶
?_col=COLUMN1&_col=COLUMN2列出要显示的特定列。这些列将与任何主键一起显示。
?_nocol=COLUMN1&_nocol=COLUMN2列出要隐藏的特定列 - 未列出的任何列都将显示。主键不能被隐藏。
?_labels=on/off为每个可能的外键列展开外键引用。见下文。
?_label=COLUMN1&_label=COLUMN2为一个或多个指定列展开外键引用。
?_size=1000或?_size=max设置自定义页面大小。此值不能超过传递给
datasette serve的max_returned_rows限制。使用max获取max_returned_rows的值。?_sort=COLUMN按指定列对结果进行排序。
?_sort_desc=COLUMN按指定列对结果进行降序排序。
?_search=keywords对于配置了全文搜索的 SQLite 表,使用提供的关键字执行搜索。
?_search_COLUMN=keywords类似于
_search=,但允许您指定要搜索的列,而不是搜索 FTS 已索引的所有列。?_searchmode=raw使用此选项,传递给
?_search=或?_search_COLUMN=的查询将不会转义特殊字符。这意味着您可以利用完整的高级 SQLite FTS 语法,但如果语法错误,这可能会导致错误。?_where=SQL-fragment如果启用了execute-sql 权限,此参数可用于传递一个或多个额外的 SQL 片段,以用于查询表所使用的 SQL 的 WHERE 子句中。
这对于正在构建需要进行一些创意操作,但仍希望利用表格视图提供的其他便利(例如分面)的 JavaScript 应用程序特别有用,因此无需构建完全自定义的 SQL 查询。
一些例子
?_through={json}这可用于通过与另一张表的 JOIN 来过滤行。
JSON 参数必须包含三个键:
table、column和value。table必须是当前表通过外键关系关联到的表。column必须是那张其他表中的一列。value是您要匹配的值。例如,要过滤
roadside_attractions以仅显示具有“博物馆”特征的景点,您可以构建此 JSON{ "table": "roadside_attraction_characteristics", "column": "characteristic_id", "value": "1" }
作为一个 URL,它看起来像这样
?_through={%22table%22:%22roadside_attraction_characteristics%22,%22column%22:%22characteristic_id%22,%22value%22:%221%22}这是一个例子。
?_next=TOKEN通过继续令牌进行分页 - 传递前一页在
"next"属性中返回的令牌。?_facet=column按列分面。可以多次应用,参见分面。仅在默认 JSON 输出上有效,不适用于任何自定义格式。
?_facet_size=100增加每个分面返回的分面结果数量。使用
?_facet_size=max获取最大可用大小,该大小由max_returned_rows 确定。?_nofacet=1禁用此页面的所有分面和分面建议,包括在 metadata.json 中定义的分面。
?_nosuggest=1禁用此页面的分面建议。
?_nocount=1禁用此页面使用的
select count(*)查询 - 将改为返回计数为None。
展开外键引用¶
Datasette 可以检测外键关系并将这些引用解析为标签。HTML 界面默认对每个检测到的外键列执行此操作 - 您可以使用 ?_labels=off 将其关闭。
您可以使用 _labels=on 或 _label=COLUMN 特殊查询字符串参数请求在 JSON 中展开外键。下面是一个展开的行示例:
[
{
"rowid": 1,
"TreeID": 141565,
"qLegalStatus": {
"value": 1,
"label": "Permitted Site"
},
"qSpecies": {
"value": 1,
"label": "Myoporum laetum :: Myoporum"
},
"qAddress": "501X Baker St",
"SiteOrder": 1
}
]
在外键表中用作标签的列可以在 metadata.json 中指定 - 参见为表指定标签列。
发现页面的 JSON¶
Datasette 提供的大多数 HTML 页面都提供了使用 HTML link 机制发现其 JSON 等效项的机制。
您可以在这些页面的源代码顶部附近找到,如下所示
<link rel="alternate"
type="application/json+datasette"
href="https://latest.datasette.io/fixtures/sortable.json">
该页面的 JSON URL 也通过 Link HTTP 头提供
Link: https://latest.datasette.io/fixtures/sortable.json; rel="alternate"; type="application/json+datasette"