Sign inSign up

xuybin/go-mysql-api

By xuybin

•Updated almost 9 years ago

provide restful api for mysql database from

Image
1

1.0K

xuybin/go-mysql-api repository overview

⁠go-mysql-api

Build Status provide restful api for mysql/mariadb database

Based on Echo⁠, goqu⁠, cli⁠ and go-mysql-driver⁠

⁠install

get go-mysql-api with go env

go get -u -v https://github.com/xuybin/go-mysql-api

or download binary from release page⁠ !

or see docker image⁠ instance

⁠start server

You could run go-mysql-api binary from cli directly

go-mysql-api --help
Options:

  -h, --help                        display help information
  -c, --*conn[=$API_CONN_STR]      *mysql connection str
  -l, --*listen[=$API_HOST_LS]     *listen host and port
  -n, --noinfo[=$API_NO_USE_INFO]   dont use mysql information shcema

defaultly, server will retrive metadata from mysql information schema, if there are any problem, pls use -n option

⁠start

you could start will cli args, but env var also works

go-mysql-api -c "user:pass@tcp(127.0.0.1:3306)/test" -l "0.0.0.0:80"

[INFO] 2017-07-26T15:09:48.4086821+08:00 connected to mysql with conn_str: user:pass@tcp(127.0.0.1:3306)/test
[INFO] 2017-07-26T15:09:49.7367783+08:00 retrived metadata from mysql database: test
[INFO] 2017-07-26T15:09:49.7367783+08:00 server start at :80

more information about connection str, please see here⁠

⁠docker

if you use docker, set environment vars to setup your server

docker run -d -p 8080:80 --link mysql_1:mysql -e API_CONN_STR='user:pass@tcp(mysql:3306)/test' --name mysql_api xuybin/go-mysql-api:version

please use correct connection string, or connectwith with public mysql database

⁠apis

if you have any web dev experience, apis will easy to understand

s.GET("/api/metadata/", endpointMetadata(api)).Name = "Database Metadata"
s.POST("/api/echo/", endpointEcho).Name = "Echo API"
s.GET("/api/endpoints/", endpointServerEndpoints(s)).Name = "Server Endpoints"
s.HEAD("/api/metadata/", endpointUpdateMetadata(api)).Name = "Update DB Metadata"
s.GET("/api/swagger/", endpointSwaggerJSON(api)).Name = "Swagger Infomation"
s.GET("/api/docs/", endpointSwaggerUI).Name = "Swagger UI"

s.GET("/api/:table", endpointTableGet(api)).Name = "Retrive Some Records"
s.POST("/api/:table", endpointTableCreate(api)).Name = "Create Single Record"
s.DELETE("/api/:table", endpointTableDelete(api)).Name = "Remove Some Records"

s.GET("/api/:table/:id", endpointTableGetSpecific(api)).Name = "Retrive Record By ID"
s.DELETE("/api/:table/:id", endpointTableDeleteSpecific(api)).Name = "Delete Record By ID"
s.PATCH("/api/:table/:id", endpointTableUpdateSpecific(api)).Name = "Update Record By ID"

s.POST("/api/:table/batch/", endpointBatchCreate(api)).Name = "Batch Create Records"

⁠Swagger UI Support

The go-mysql-api support swagger.json and provide swagger.html page

Open /api/docs/ to see swagger documents, the interactive documention will be helpful.

And go-mysql-api provide the swagger.json at path /api/swagger/

⁠Get DB Metadata

You could use GET /api/metadata get database metadata

⁠Operate record

  • use POST /api/user method to create new user record

body


{
    "uname":"fjdasl@fjdksalf",
    "utoken":"atoken"
}

  • use GET /api/user/31 to get our created record

{
    "status": 200,
    "message": "get table by id",
    "data": [
        {
            "create_at": "2017-07-18 03:21:16",
            "uid": "31",
            "uname": "fjdasl@fjdksalf",
            "utoken": "atoken"
        }
    ]
}
  • use DELETE /api/user/31 to delete the record, (body is not needed)

⁠Advance query

query apis could use index, size, fields, where, link and search in query param

⁠Whole table search, with low query performance

GET /api/user?search=outlook

-- SQL mapping
SELECT * FROM `user`
  WHERE
    (
      (`create_at` LIKE BINARY '%outlook%')
        OR
      (`uid` LIKE BINARY '%outlook%')
        OR
      (`uname` LIKE BINARY '%outlook%')
        OR
      (`utoken` LIKE BINARY '%outlook%')
    )

⁠Auto join and custome query

You could use in, notIn, like, is, neq, isNot and eq in where param

GET /api/monitor?link=user&link=monitor_log&size=100&where='user.uid'.in(11,22)&where='monitor_log.success'.eq(false)

-- SQL mapping
SELECT * FROM `monitor`
  INNER JOIN `user`
    ON (`user`.`uid` = `monitor`.`uid`)
  INNER JOIN `monitor_log`
    ON (`monitor_log`.`mid` = `monitor`.`mid`)
  WHERE
    (
      (`user`.`uid` IN ('11', '22'))
    AND
      (`monitor_log`.`success` = 'false')
    )
  size 100

Even if go-mysql-api has already supported simple association query, we still recommend using views for complex queries

⁠Some tests

yeah, there are some in-package tests, but not work for out-package, and based on env var

I test this project by my existed mysql schema, and it works correctly

Tag summary

Content type

Image

Digest

Size

9.4 MB

Last updated

almost 9 years ago

docker pull xuybin/go-mysql-api