SuperAPI AI 工具集

surrealql

数据与分析

查看项目

更新于 10-15 14:52

技能介绍

用途

SurrealQL 是一个用于编写和修改 SurrealQL 查询、以便与 SurrealDB 数据库交互的技能。SurrealQL 是 SurrealDB 的官方查询语言,被描述为一种现代、灵活且强大的查询语言,设计目标是易于学习和使用。

在以下情况应参考本技能的指南:

  • 编写、修改或排查 SurrealQL 查询
  • 设计或管理模式(schema)
  • 将其他查询语言转换为 SurrealQL

版本与文档

应始终面向最新的稳定版 SurrealDB 发布版本。SurrealQL 在主要版本之间会演进,来自较旧版本(例如 SurrealDB 2.x)的语法是产生不正确、无法通过校验的查询的常见原因。除非用户明确要求旧版本,否则应生成当前(3.x)语法。

在生成对版本敏感的语法之前,先确定当前活动版本:

  • 如果已安装 SurrealDB CLI,运行 surreal version。
  • 否则,最新发布版本以纯字符串形式发布在 https://download.surrealdb.com(例如 v3.1.4):
curl -s https://download.surrealdb.com

https://surrealdb.com/docs 始终记录最新稳定版,应将其视为当前语法的权威来源。当不确定某个函数或形式是否仍然适用时(例如 type::* 辅助函数以及记录 ID 的构造方式),应依据当前文档确认,而不是假设旧行为。

规则与约定

  • SurrealQL 不是 ANSI-SQL。切勿假设来自其他数据库的 SQL 知识适用。应始终参考下方示例或 https://surrealdb.com/docs 上的文档,以获取准确的语法和行为。
  • 当 SurrealQL 存储在文件中时,应使用 .surql 扩展名。
  • SurrealQL 是一门相对年轻的语言,会在各发布版本之间变化。默认使用最新的 SurrealDB 版本(见“版本与文档”),并参考 https://surrealdb.com/docs 获取最新语法。

语句

查询语句

语句 用途
SELECT 查询记录、遍历图、聚合数据
CREATE 创建新记录(若记录已存在则报错)
INSERT 插入一条或多条记录或图边;支持 ON DUPLICATE KEY UPDATE
UPDATE 更新已有记录(若记录不存在则为空操作)
UPSERT 插入记录,若已存在则更新
DELETE 删除记录或图边
RELATE 在记录之间创建图边
LIVE SELECT 流式获取表的实时变更
KILL 取消一个活动的 LIVE SELECT 查询
LET 为参数赋值
RETURN 从块或函数返回值

模式与资源语句

语句 用途
DEFINE NAMESPACE 定义命名空间
DEFINE DATABASE 定义数据库
DEFINE TABLE 定义表(schemafull、schemaless、as view)
DEFINE FIELD 定义字段,含类型、默认值、断言
DEFINE INDEX 定义索引(unique、search、vector)
DEFINE EVENT 在表上定义事件触发器
DEFINE FUNCTION 定义自定义函数
DEFINE ANALYZER 定义搜索分析器
DEFINE ACCESS 定义认证访问方式(Bearer、JWT、Record)
DEFINE API 定义 API 端点
DEFINE BUCKET 定义存储桶
DEFINE CONFIG 定义配置
DEFINE MODULE 定义 Surrealism 扩展模块
DEFINE PARAM 定义全局参数
DEFINE SEQUENCE 定义自增序列
DEFINE USER 定义系统用户
ALTER 修改已有资源定义
REMOVE 移除任何已定义的资源
REBUILD 重建索引
ACCESS 管理访问授权
USE 切换到不同的命名空间或数据库
INFO 查看资源的定义
SHOW 查看表或数据库的变更流(changefeed)

控制流语句

语句 用途
BEGIN / COMMIT 开始并提交手动事务
CANCEL 取消事务
IF / ELSE 条件执行
FOR 遍历值
BREAK 提前退出 FOR 循环
CONTINUE 跳到 FOR 循环的下一次迭代
THROW 取消执行并返回错误
SLEEP 暂停执行一段时间

参考资料

  • 关于详细的查询模式(过滤、图遍历、聚合、子查询),参见 references/querying.md。
  • 关于模式管理模式(表、字段、索引、事件、访问),参见 references/schema.md。
  • 关于可存储在 SurrealDB 记录中的值的深入信息,参见 references/values.md。

校验

在生成 SurrealQL 查询或修改已有查询时,如果可用,应始终使用 SurrealDB CLI 对其进行校验。校验可能因版本差异而失败,此时可用 surreal version 获取 SurrealDB CLI 版本。校验只能针对完整查询或值执行,不能针对部分或片段式语句。

用法:

# 校验单个文件:
surreal validate query.surql

# 校验 glob 模式的文件:
surreal validate queries/*.surql

# 从 stdin 校验(自 SurrealDB v3.1.0 起可用):
echo "SELECT * FROM person WHERE age > 18" | surreal validate --stdin

格式化

在生成 SurrealQL 查询或 SQON 值时,如果存在类 NodeJS 运行时,可以决定使用 surqlfmt CLI 工具对其进行格式化。在以下情况应始终格式化:

  • 向用户展示查询时
  • 生成迁移文件时
  • 编写 .surql 文件时

用法:

# 格式化文件并打印到 stdout:
npx @surrealdb/surql-fmt query.surql

# 就地格式化文件:
npx @surrealdb/surql-fmt --write migrations/*.surql

# 检查文件是否已格式化(未格式化则以退出码 1 退出):
npx @surrealdb/surql-fmt --check src/**/*.surql

# 从 stdin 格式化:
echo "SELECT * FROM person WHERE age>18" | npx @surrealdb/surql-fmt --stdin

适用场景

  • 编写、修改或排查 SurrealQL 查询
  • 设计或管理 SurrealDB 模式
  • 将其他查询语言转换为 SurrealQL

限制

  • SurrealQL 不是 ANSI-SQL,不能套用其他数据库的 SQL 知识。
  • SurrealQL 在主要版本之间会变化,旧版本语法可能导致查询无法通过校验。
  • 校验只能针对完整查询或值,不能针对部分或片段式语句。
  • 格式化需要类 NodeJS 运行时。
  • 关于收费、价格、平台支持范围等信息,资料中暂未提供。