SQLer:无需编程语言即可将SQL查询转换为RESTful API的工具

2019 年 1 月 10 日

SQLer:无需编程语言即可将SQL查询转换为RESTful API的工具

SQLer 是一个微型 http 服务器,用 Go 语言编写,将旧的 CGI 概念应用于 SQL 查询。SQLer 允许编写端点并分配一个 SQL 查询,以便任何人点击它时能执行查询。此外 SQLer 还允许自定义验证规则,可验证请求正文或查询参数。SQLer 使用 nginx 样式配置语言(HCL)。


SQLer 功能


  • 无需依赖,可独立使用;

  • 支持多种数据可类型,包括:SQL Server, MYSQL, SQLITE, PostgreSQL, Cockroachdb等;

  • 内置RESTful服务器;

  • 内置RESP Redis协议,可以使用任何redis客户端连接到SQLer;

  • 内置Javascript解释器,可轻松转换结果;

  • 内置验证器;

  • 自动使用预备语句;

  • 使用(HCL)配置语言;

  • 可基于unix glob模式加载多个配置文件;

  • 每条SQL查询可被命名为宏;

  • 在每个宏内可使用 Go text/template

  • 每个宏都有自己的Context(查询参数+正文参数)作为.Input(map [string] interface{}),而.Utils是辅助函数列表,目前它只包含SQLEscape;

  • 可自定义授权程序,授权程序只是一个简单的webhook,sqler使用这个webhook验证是否应该完成某请求。


下载



配置概况


// create a macro/endpoint called "_boot",// this macro is private "used within other macros" // because it starts with "_".// this rule only used within `RESTful` context._boot {    // the query we want to execute    exec = <<SQL        CREATE TABLE IF NOT EXISTS `users` (            `ID` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,            `name` VARCHAR(30) DEFAULT "@anonymous",            `email` VARCHAR(30) DEFAULT "@anonymous",            `password` VARCHAR(200) DEFAULT "",            `time` INT UNSIGNED        );    SQL}
// adduser macro/endpoint, just hit `/adduser` with// a `?user_name=&user_email=` or json `POST` request// with the same fields.adduser { // what request method will this macro be called // default: ["ANY"] // this only used within `RESTful` context. methods = ["POST"]
// authorizers, // sqler will attempt to send the incoming authorization header // to the provided endpoint(s) as `Authorization`, // each endpoint MUST return `200 OK` so sqler can continue, other wise, // sqler will break the request and return back the client with the error occurred. // each authorizer has a method and a url. // this only used within `RESTful` context. authorizers = ["GET http://web.hook/api/authorize", "GET http://web.hook/api/allowed?roles=admin,root,super_admin"]
// the validation rules // you can specify separated rules for each request method! rules { user_name = ["required"] user_email = ["required", "email"] user_password = ["required", "stringlength: 5,50"] }
// the query to be executed exec = <<SQL {{ template "_boot" }}
/* let's bind a vars to be used within our internal prepared statement */ {{ .BindVar "name" .Input.user_name }} {{ .BindVar "email" .Input.user_email }} {{ .BindVar "emailx" .Input.user_email }}
INSERT INTO users(name, email, password, time) VALUES( /* we added it above */ :name,
/* we added it above */ :email,
/* it will be secured anyway because it is encoded */ '{{ .Input.user_password | .Hash "bcrypt" }}',
/* generate a unix timestamp "seconds" */ {{ .UnixTime }} );
SELECT * FROM users WHERE id = LAST_INSERT_ID(); SQL}
// list all databases, and run a transformer functiondatabases { exec = "SHOW DATABASES"
transformer = <<JS // there is a global variable called `$result`, // `$result` holds the result of the sql execution. (function(){ newResult = []
for ( i in $result ) { newResult.push($result[i].Database) }
return newResult })() JS}
复制代码


支持的 SQL 引擎


  • sqlite3

  • mysql

  • postgresql

  • cockroachdb

  • sqlserver


支持的 Util


  • .Hash <method> - 使用指定的方法[md5,sha1,sha256,sha512,bcrypt]散列指定的输入, {{ "data" | .Hash "md5" }}

  • ·.UnixTime - 以秒为单位返回unit时间, {{ .UnixTime }}

  • .UnixNanoTime - 以纳秒为单位返回unix时间,{{ .UnixNanoTime }}

  • .Uniqid - 返回唯一ID,{{ .Uniqid }}


协议


SQLer 遵循 Apache 2.0 协议。


2019 年 1 月 10 日 16:5113166
用户头像
张婵 InfoQ 技术编辑

发布了 87 篇内容, 共 44.4 次阅读, 收获喜欢 210 次。

关注

评论

发布
暂无评论
发现更多内容

LeetCode题解:18. 四数之和,哈希表,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

从月薪3K的Java菜鸟,到年薪80W的Java架构师,靠这份文档,让我学习像打怪升级一样简单!

Java架构之路

Java 程序员 架构 面试 编程语言

java代码优化技巧及原理

积极&丧

架构训练营-week13-总结

于成龙

工厂模式学习

en

golang 设计模式 工厂模式

性能优化总结(三)

Mars

JVM 垃圾回收原理简述

Mars

阿里P8传授给小老弟的Java面试宝典,竟让让小弟也拿到了P8的offer,傻眼了

Java架构之路

Java 程序员 架构 面试 编程语言

列举出常见的Java面试题100+,我靠这个在十月拿到了阿里的offer

Java架构之路

Java 程序员 架构 面试 编程语言

科普:区块链中的公链和私链的有什么区别?

CECBC区块链专委会

公有链 私有链

系统性能优化案例(秒杀系统)

积极&丧

智慧城市管理平台,多规合一平台搭建解决方案

t13823115967

智慧城市

[架构师训练营第 1 期] 第 13 周学习总结

猫切切切切切

极客大学架构师训练营

架构师训练营第九周作业

丁乐洪

看了这个你还不懂mybatis缓存,单独找我

田维常

mybatis

Java架构速成笔记:五大专题,1345页考点 看完直接收获腾讯、京东、滴滴offer

比伯

Java 编程 架构 面试 计算机

联邦学习与安全多方计算

DataFunTalk

学习 AI

天下武功,唯”拆“不破之架构篇一 | 技术人应知的创新思维模型 (7)

Alan

架构 个人成长 思维 28天写作营 技术人应知的创新思维模型

从“断臂求生”到一骑绝尘,航运巨头马士基如何利用区块链技术力挽狂澜?

CECBC区块链专委会

航运

百分点助力常州科教城上线两大平台 打造国际智慧创新城

百分点认知智能实验室

AI 智慧城市

架构师训练营第四周课后作业

万有引力

封装 axios 取消重复请求

360技术

Web 开发

架构师训练营第 13 周课后练习

北纬37°的浪漫与理性,穿越千年的信息之变

脑极体

泡泡玛特市值千亿背后,我们为什么会为盲盒买单?

脑极体

mybatis二级缓存,7个问题拿下它

田维常

mybatis

万字庖解区块链跨链技术

CECBC区块链专委会

区块链

阿里大牛亲自总结整理的一线互联网公司面试真题及面经(阿里、网易、字节)

Java架构之路

Java 程序员 架构 面试 编程语言

可视化指挥调度平台搭建,应急指挥调度监控中心建设方案

t13823115967

可视化 指挥调度

mybatis一级缓存是啥?5个面试题回答你

田维常

mybatis

在wildfly中使用SAML协议连接keycloak

程序那些事

程序那些事 SAML openid SSO wildfly

SQLer:无需编程语言即可将SQL查询转换为RESTful API的工具-InfoQ