gpt4 book ai didi

rest - 在 Golang 中获取动态 sql

转载 作者:IT王子 更新时间:2023-10-29 02:21:10 29 4
gpt4 key购买 nike

我正在尝试在 Golang 中创建一个 REST API。问题是我有超过 1000 个复杂的 SQL 脚本需要执行并从数据库中获取。

是否可以获取网址 /get/job/23 并从基本仅包含文本的包、模板或文本文档中动态抓取 sql = sql脚本?然后在 main.go 中触发准备和执行?

main.go 中导入 1000 个包并存储 1000 条复杂的 SQL 语句似乎是不可能的。

这是一个新手伪代码,显示了我正在寻找的内容:

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))
}

当然,我不知道这是否可能,但我很感谢您为我指明了正确的方向。

已添加

我认为这是要解决的 4 个问题:

  1. 如何在 Golang 中将纯 sql 存储在文档(模板?)中
  2. 如何根据url动态设置此文档的路径。
  3. 如何将参数发送到文档(id)​​
  4. 如何读取内容并执行sql

最佳答案

我建议您找到您喜欢的设计模式并围绕它构建。例如,你可以使用MVC,或者Clean Architecture

MVC 中做你想做的事情的一个简单方法是创建映射到每个路径的 Controller , Controller 可以访问特定的数据库存储库函数,并且该特定的数据库存储库函数可以有你的里面有 SQL。

这会给你一个很好的关注点分离。您不希望最终在同一个文件中有 1000 个不同的 SQL 查询和 1000 个请求处理程序,那将无法维护。使用 MVC,您可以将此逻辑抽象出来以解耦事物。

但是,即使是 MVC 也会在您开始拥有包含 1000 个文件的目录等一段时间后有其局限性。但是,我认为这对于您的用例来说是一个非常好的开始,因为您只需要 REST 端点映射到请求处理程序,然后请求处理程序查询数据库。

这是一个例子(注意我在底部留下了一堆链接供你引用)。

ma​​in.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
}

请记住,这是一个非常简单的答案,它使用无法编译、无法处理错误等的代码。但它应该让您大致了解如何构建架构来实现您想要的.

希望对您有所帮助!

以下是您可能会发现有助于在 Golang 中构建 RESTful API 的一些资源:

这里有一些用于 REST API 的路由器:

这里有一些数据库包可以帮助简化您的 SQL 查询:

关于rest - 在 Golang 中获取动态 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48991771/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com