#sql-query #sql #programming-language #higher-order #transformation #applications

bin+lib queryscript

QueryScript 是一种基于 SQL 的语言,允许您在 SQL 查询中使用高级抽象,如变量、函数和模块

4 个版本

0.1.4 2023年3月9日
0.1.2 2023年2月17日
0.1.1 2023年2月9日
0.1.0 2023年2月9日

#2383 in 数据库接口

Apache-2.0

710KB
18K SLoC

QueryScript

QueryScript 是一种强类型编程语言,基于 SQL 构建。它提供现代工具、模块化和与流行关系数据库的集成。QueryScript 适用于应用业务逻辑、转换、ETL 和可视化。

  1. SQL 和更多。QueryScript 是一种功能强大的编程语言,具有变量、函数和模块。SQL 是语言中的第一类概念。
  2. 一次编写,到处运行。 QueryScript 会检查您的数据模型和查询,确保您的代码无需移植即可在任何数据库后端上运行。
  3. 性能始终如一。 QueryScript 是用 Rust 编写的,可以在您的 Typescript 和 Python 应用程序中本地运行。它将尽可能多的计算推向底层的数据库。

QueryScript VSCode Extension

下面,我们将通过一些示例和安装说明进行介绍。您可以在本地运行 QueryScript,这使得在像 VSCode 这样的工具中进行开发变得简单有趣。有关语言更详细的介绍,请访问 QueryScript 网站

示例

这是一个 QueryScript 的快速示例

-- Variables (including relations) are namespaced and can be imported. The below queries will
-- work for any definition of `users` and `events` as long as they typecheck.
import users, events from schema;

-- You can define variables (including scalars and relations)
-- using `let <name> [<type>] = <expr>`. These expressions are
-- lazily evaluated (and potentially inlined), so there is no
-- cost to defining them.
let active_users = SELECT * FROM users WHERE active;

-- You can run queries inline to help with debugging
SELECT COUNT(*) FROM active_users;

-- You can define functions that operate over values. Just like
-- variables, functions can be inlined and pushed down into the
-- target database, or evaluated directly.
fn username(user_id bigint) {
    SELECT name FROM active_users WHERE id = user_id
}

-- Find the users with the most events
SELECT username(user_id), COUNT(*) FROM events GROUP BY 1 ORDER BY 2 DESC LIMIT 10;

-- Find the users who are at risk of churn
SELECT username(user_id), MAX(ts) FROM events GROUP BY 1 HAVING MAX(ts) < NOW() - INTERVAL 1 MONTH;

-- You can also define functions over relations
fn most_popular_events(events) {
    SELECT name, COUNT(*) num FROM events ORDER BY 2 DESC
}

-- And see the most popular events globally
most_popular_events(events);

-- Or per user (this will return a sorted array of events
-- for each user)
SELECT username(user_id), most_popular_events(e) FROM events e GROUP BY 1;

安装

目前,安装 QueryScript 的唯一方法是 从源代码构建。我们将在未来几周内启用更流畅的安装方式。

从源代码构建

要从源代码构建 QueryScript,您需要 GitRustClang++

git clone https://github.com/qscl/queryscript.git
cd queryscript
git submodule update --init
cargo build --release

QueryScript 编译器将在 target/release/qs 处可用。

构建开发环境

如果您想为 QueryScript 做贡献或进行其他修改,您还需要一些额外的依赖项:Python >= 3.7Python venvGit LFSNode.jsYarnDocker Compose

首先,运行上述命令(尽管您可以跳过cargo build --release)。然后,运行

make develop

除了编译Rust库和在调试模式下编译qs二进制文件外,此命令还将

  • 在虚拟环境中设置一个名为qsutils的Python包,其中包含一些用于下载测试数据的实用脚本
  • 在虚拟环境中安装pre-commit钩子。
  • 安装VSCode扩展的依赖并编译它。
  • 通过git-lfs下载测试文件

如果您打算做出贡献,请运行make develop。您可以使用make test运行测试套件。

依赖项

~43–78MB
~1.5M SLoC