在Golang中获取动态sql

By simon at 2018-02-28 • 0人收藏 • 54人看过

我正在尝试在Golang中创建一个REST API。问题是我有更多 比应该执行的1000个复杂的SQL脚本并从中取出 数据库。 是否有可能采取网址/get/job/23并动态获取 sql从一个package,仅包含文本的模板或文本文档 = sql脚本?然后开始准备并在* _ main中执行。走_? 看来,导入1000包和存储1000复杂的SQL语句 在 _ main.go _ 中是不可能的。 这是一个新手伪代码,显示了我正在寻找的内容:

package main

import (
   "encoding/json"
   "log"
    "net/http"
    "database/sql"
    "github.com/gorilla/mux"
    _ "github.com/lib/pq"
)

func Getsql (dynamic path to script with parameter) returns (string)      

/* The url /get/job/id is stored as a document/package/template       
as "getjobid" = dynamic path based on url passed */

func (db *DB) Conn(ctx context.Context) (*Conn, error)
func (db *DB) Prepare(query string) (*Stmt, error)
func (db *DB) Query(query string, args ...interface{}) (*Rows, err)

func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
当然,我不知道这是否可能,但我很感激 指着我在正确的方向。 *添加 我认为这是需要解决的四个问题:   1.如何存储在Golang中的文档(模板?)中使用普通的sql   2.如何根据url动态设置本文档的路径。   3.如何将参数发送到文档(id)   4.如何读取内容并执行sql

1 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

我会建议找到一个你喜欢和建造的设计模式 那。例如,您可以使用MVC或Clean Architecture等 在MVC中做一个简单的方法是创建控制器 映射到每条路径和控制器oller可以访问特定的数据库 存储库功能以及特定的数据库存储库功能可以具有的功能 你的SQL在里面。 这会给你一个很好的关注分离。你不想结束 有1000个不同的SQL查询和1000个请求处理程序在同一个文件中, 这是不可维护的。用MVC你可以抽象这个逻辑 去解耦事物。 乙一旦你开始,甚至MVC会在一段时间后有其局限性 具有1000个文件的目录等。但是,我认为这是非常好的 因为您只希望将REST端点映射到请求,所以请开始使用您的用例 处理程序,然后que完成数据库。 这里是一个例子(请注意,我留下了一堆链接供您参考 底端)。 * main.go:*

package main

import (
   "log"
    "net/http"

    "controllers"
)

func main() {
    http.HandleFunc("/", controllers.Index)
    http.HandleFunc("/users", controllers.AllUsers)
    http.HandleFunc("/users/:id", controllers.OneUser)

    log.Fatal(http.ListenAndServe(":8080", nil))
}
* controllers.go:*
import "repository"

func Index(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Home page")
}

func AllUsers(w http.ResponseWriter, r *http.Request) {
    users := repository.AllUsers()

    h.Write([]byte(users))
}

func OneUser(w http.ResponseWriter, r *http.Request) {
    user := repository.OneUser(r.Param("id"))

    h.Write([]byte(user))
}
* repository.go:*
func AllUsers() []User {
    var users []User
    db.Select(&users, `SELECT * FROM user`)
    return users
}

func OneUser(userId int) *User {
    user := new(User)
    db.Get(user, `SELECT * FROM user WHERE id = ?`, userId)
    return user
}
请记住,这是一个非常简单的答案,我们es代码不会 编译,不处理错误等,但它应该给你一个大致的想法 你如何建立一个架构重新实现你想要的。 希望有所帮助! 以下是您在构建RESTful API时可能会发现的一些资源 Golang: * https://www.codementor.io/codehakase/building-a-restful-api-with-golang-a6yivzqdo * https://thenewstack.io/make-a-restful-JSON-API去/   * https://hackernoon.com/build-restful-api-in-go-and-mongodb-5e7f2ec4be94 这里是一些REST的路由器蜜蜂:   * https://github.com/gin-gonic/gin   * https://github.com/go-chi/chi   * https://github.com/julienschmidt/httproutER 以下是一些数据库包,可帮助您简化SQL查询:   * https://github.com/jmoiron/sqlx

登录后方可回帖

Loading...