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

【通用查询,依据SQL语句自动生成API服务,供前台调用】 应用场景,比如前端需要展示一个SQL的查询结果,只需要配置一下查询的SQL,就可以根据相应的SQL_ID,调用服务得到需要的数据.不需要后台再写接口 阅读详情

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 \u0026quot;_boot\u0026quot;,// this macro is private \u0026quot;used within other macros\u0026quot; // because it starts with \u0026quot;_\u0026quot;.// this rule only used within `RESTful` context._boot {    // the query we want to execute    exec = \u0026lt;\u0026lt;SQL        CREATE TABLE IF NOT EXISTS `users` (            `ID` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,            `name` VARCHAR(30) DEFAULT \u0026quot;@anonymous\u0026quot;,            `email` VARCHAR(30) DEFAULT \u0026quot;@anonymous\u0026quot;,            `password` VARCHAR(200) DEFAULT \u0026quot;\u0026quot;,            `time` INT UNSIGNED        );    SQL}// adduser macro/endpoint, just hit `/adduser` with// a `?user_name=\u0026amp;user_email=` or json `POST` request// with the same fields.adduser {    // what request method will this macro be called    // default: [\u0026quot;ANY\u0026quot;]    // this only used within `RESTful` context.    methods = [\u0026quot;POST\u0026quot;]    // 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 = [\u0026quot;GET http://web.hook/api/authorize\u0026quot;, \u0026quot;GET http://web.hook/api/allowed?roles=admin,root,super_admin\u0026quot;]    // the validation rules    // you can specify separated rules for each request method!    rules {        user_name = [\u0026quot;required\u0026quot;]        user_email =  [\u0026quot;required\u0026quot;, \u0026quot;email\u0026quot;]        user_password = [\u0026quot;required\u0026quot;, \u0026quot;stringlength: 5,50\u0026quot;]    }    // the query to be executed    exec = \u0026lt;\u0026lt;SQL       {{ template \u0026quot;_boot\u0026quot; }}        /* let's bind a vars to be used within our internal prepared statement */        {{ .BindVar \u0026quot;name\u0026quot; .Input.user_name }}        {{ .BindVar \u0026quot;email\u0026quot; .Input.user_email }}        {{ .BindVar \u0026quot;emailx\u0026quot; .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 \u0026quot;bcrypt\u0026quot; }}',            /* generate a unix timestamp \u0026quot;seconds\u0026quot; */            {{ .UnixTime }}        );        SELECT * FROM users WHERE id = LAST_INSERT_ID();    SQL}// list all databases, and run a transformer functiondatabases {    exec = \u0026quot;SHOW DATABASES\u0026quot;    transformer = \u0026lt;\u0026lt;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 \u0026lt;method\u0026gt; - 使用指定的方法[md5,sha1,sha256,sha512,bcrypt]散列指定的输入, {{ \u0026quot;data\u0026quot; | .Hash \u0026quot;md5\u0026quot; }};
  • ·.UnixTime - 以秒为单位返回unit时间, {{ .UnixTime }};
  • .UnixNanoTime - 以纳秒为单位返回unix时间,{{ .UnixNanoTime }};
  • .Uniqid - 返回唯一ID,{{ .Uniqid }}。

协议

SQLer遵循 Apache 2.0协议。

sqler:轻松使用直接SQL查询编写API,让我们重新思考一下SQL SQLer SQL-er是一款微型便携式服务器,使您可以使用SQL查询来编写API,以便在有人点击时执行该查询,还可以定义验证规则,以便可以验证请求正文/查询参数以及使用简单的数据转换javascript语法。 sqler对自定义表达式使用nginx样式配置语言( )和javascript引擎。 目录 产品特点 独立无依赖性。 可与大多数SQL数据库一起使用,包括( SQL Server , MYSQL , SQLITE , PostgreSQL , Cockroachdb ) 内置RESTful服务器 内置RESP Redis Protocol ,您连接到SQLer使用任何redis 立即下载

相关推荐

resquel:使用Express.js轻松将您SQL数据库转换为REST API

轻松将您SQL数据库转换为REST API。 这是一个轻量级的Express.js中间件库,能够将SQL数据库转换为REST API。 该库还与平台无缝,在平台上您可以在SQL数据库之上构建Angular.js和React.js应用程序。 请访问了解更多信息。 该库已通过Microsoft SQL Server,MySQL和PostgreSQL验证。 这个怎么运作 此模块通过将路由分配给您定义的特定查询来工作,这些查询在触发路由时执行。 例如,假设您有以下客户表。 顾客 名 姓 电子邮件 该库能够将其转换为以下REST API。 GET:/ customer-返回所有客户的列表。 GET:/ customer /:customerId-返回单个客户 POST:/ customer-创建一个新客户 PUT:/ customer /:customerId-更新客户 删除:/ cust

探索SQLer:将SQL查询转化为安全有效API的利器

SQLer,一款轻量级且便携的服务器,为开发者带来了全新的可能性——利用简单的SQL查询直接构建API接口。它不仅简化了数据交互过程,更是通过集成JavaScript和HCL配置语言,赋予了开发者强大的灵活性与控制力。下面,我们深入探讨这一神器,看看它是如何让数据库访问变得前所未有的简单高效。 ## 项目介绍 SQLer是一个划时代的工具,它允许开发人员编写基于SQL查询的API端点,这些端点...

gitblog_00426的博客 880

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5516

K2-Horizon-7B-bf16源码深度剖析:k2_horizon.py如何用gather_mm单kernel高效移植MoE与MoVA注意力

K2-Horizon-7B-bf16 是面向 Apple Silicon 的 MLX 版 K2-Horizon 7B 大模型(bf16 精度、512K 长上下文),仓库自带单文件模型实现 [k2_horizon.py](https://link.gitcode.com/i/0d00ec2f51428b39edc8c7d2754f8930),用 `gather_mm` 单次 kernel 调用完成

gitblog_00408的博客 479

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南

本文深度解析了青龙人形机器人硬件平台的设计全流程,从需求分析、构型设计到核心系统实现。文章详细阐述了其43个自由度的仿生构型、高动态性下肢设计、灵巧作业系统以及分布式控制架构,并探讨了旋转关节与直线关节等关键技术选型,为开发者提供了从理论到实践的完整硬件设计指南。

weixin_29248313的博客 383

用Multisim复刻经典收音机:从零搭建超外差中波调幅接收机(附仿真源文件)

本文详细介绍了如何使用Multisim软件从零搭建超外差中波调幅接收机,复刻经典收音机的设计过程。通过模块化搭建、稳定性优化和增益分配等实战指南,帮助读者掌握超外差架构的核心技术,并附赠仿真源文件供实践参考。

weixin_28744423的博客 475

C/C++开发者如何快速读懂Python代码?一份实用阅读指南

编程语言各有其设计哲学,代码阅读方式也随之不同。对于熟悉C/C++的开发者而言,指针与类型思维根深蒂固,突然面对动态类型、缩进块和丰富的内建容器,难免感到困惑。Python采用解释执行,类型跟随对象而非变量,代码块由缩进而非花括号界定,函数与类的表达也更为灵活。理解这些底层差异,是高效阅读Python项目的关键。从变量赋值、数据结构、函数调用,到异常处理与装饰器,掌握核心语法映射后,便能顺着调用链和数据流快速定位逻辑。无论是接手遗留项目,还是参与开源协作,这种跨语言阅读能力都极具工程价值。本文从基础概念出发

weixin_34416754的博客 331

Revit二次开发——不启动Revit,做rvt文件数据导出

Revit二次开发——不启动Revit,做rvt文件数据导出Node.js部分调用C#端供外部调用的dllC#部分调用RevitNet.dll,做数据导出exe做外部调用dll总结功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 N

Y.Jerome的专栏 4112
上一篇: Uber宣布重启无人车路测,但规模变小、速度降低
下一篇: 谷歌发布开源Dopamine 2.0,让强化学习变得更灵活
2名名名名名名名名名名名名名名名名名名名
2名名名名名名名名名名名名名名名名名名名 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域 业界专家认证 业界专家认证
博客等级 码龄12年 1134粉丝 2600原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2名名名名名名名名名名名名名名名名名名名

谢谢啊011702

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值