sqler sql 轉rest api javascript 試用

sqler 內嵌了一個js 引擎的實現(基於goja,當咱們配置了exec的配置以後
調用宏(redis 接口)或者rest api 的時候會有一個全局變量$result ,保存了執行的結果,咱們能夠
經過js 操做數據對象,好比進行數據改寫,進行一些額外的數據控制。
同時默認的demo 配置的databases 宏就包含了js 調用的demomysql

環境準備

docker-compose 運行git

  • docker-compose 文件
 
version: "3"
services:
  sqler:
    image: dalongrong/sqler:1.6
    volumes:
    - "./config/config.example.hcl:/app/config.example.hcl"
    environment:
    - "DSN=root:dalongrong@tcp(mysqldb:3306)/test?multiStatements=true"
    ports:
    - "3678:3678"
    - "8025:8025"
  mysqldb:
    image: mysql:5.7.16
    ports:
      - 3306:3306
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: dalongrong
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      TZ: Asia/Shanghai
 
 
  • 配置說明
_boot {
    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
}
allusers {
    methods = ["GET"]
    exec = <<SQL
        SELECT * FROM users;
    SQL
}
adduser {
    methods = ["POST"]
    rules {
        user_name = ["required"]
        user_email = ["required", "email"]
        user_password = ["required", "stringlength: 5,50"]
    }
    exec = <<SQL
        {{ template "_boot" }}
        /* let's bind a vars to be used within our internal prepared statment */
        {{ .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
}
databases {
    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
}
usersinfo {
  exec = "select * from users"
  transformer = <<JS
    // do some convert only print name && email
    (function(){
       var newResult=[];
       for (var item in $result) {
        var user = {
            user_name:$result[item].name,
            user_email:$result[item].email
        }
        newResult.push(user)
       }
       return newResult; 
    })()
  JS
}
 
 
  • 說明
    官方demo 的databases 是一個,usersinfo 是我本身寫的一個簡單demo,進行查詢數據的處理

啓動&&測試

  • 啓動
 
docker-compose up -d
 
  • 添加數據
curl -X POST \
  http://localhost:8025/adduser \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: a7784ea1-9f50-46ee-92ac-1d850334f3f1' \
  -H 'cache-control: no-cache' \
  -d '{
    "user_name":"dalong",
    "user_email":"1141591465@qq.com",
    "user_password":"dalongdemo"
}'
 
 
  • 查詢效果
curl -i http://localhost:8025/usersinfo
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: Accept-Encoding
Date: Fri, 11 Jan 2019 03:35:44 GMT
Content-Length: 137
{"data":[{"user_name":"dalong","user_email":"1141591465@qq.com"},{"user_name":"dalong","user_email":"1141591465@qq.com"}],"success":true}% 
 
 

說明

$result 是全局定義的,從源碼也能夠看出來github

if transformer == "" {
        return data, nil
    }
    vm := goja.New()
    vm.Set("$result", data)
    v, err := vm.RunString(transformer)
    if err != nil {
        return nil, err
    }
    return v, nil

參考資料

https://github.com/alash3al/sqler/blob/master/macro.go
https://github.com/rongfengliang/sqler-docker-composeredis

相關文章
相關標籤/搜索