Golang根据Struct生成CURD接口

597 阅读2分钟

当你需要在Go中进行数据库操作时,通常会使用struct来表示数据表中的行,并使用各种包来执行SQL查询。但是,手动编写SQL语句和使用struct进行参数绑定可能会很麻烦,尤其是在有多个数据表的情况下。

因此,自动生成CRUD代码的方案就显得非常有用。这样,我们只需要编写struct定义和简单的配置信息,就可以自动生成创建,读取,更新和删除行的代码。

要生成CRUD代码,我们需要使用Go的代码生成工具,例如stringer和go generate。

我们首先定义一个struct,其中包含数据表中的所有列。然后,我们使用go generate注释来指示代码生成工具生成CRUD代码。

例如,以下是一个简单的struct定义,用于表示数据库中的用户行:

~~~golang

//go:generate go run gen.go

 type User struct { 

 ID int64 

 Name string 

 Email string 

}

~~~

然后,我们需要编写gen.go文件,其中包含代码生成逻辑。该文件应该导入必要的包,执行必要的设置,并使用struct的信息生成CRUD代码。

下面是一个简单的gen.go文件示例,该文件生成了基于User struct的Create,Read,Update和Delete函数:

~~~golang

package main

import (

"bytes"

"fmt"

"text/template"

)

const tmpl = ` func Create{{.Type}}(db *sql.DB, u *{{.Type}}) error { q := "INSERT INTO {{.Type}} (name, email) VALUES (?, ?)" _, err := db.Exec(q, u.Name, u.Email) if err != nil { return err } return nil } func Read{{.Type}}(db *sql.DB, id int64) (*{{.Type}}, error) { q := "SELECT id, name, email FROM {{.Type}} WHERE id = ?" row := db.QueryRow(q, id) u := &{{.Type}}{} err := row.Scan(&u.ID, &u.Name, &u.Email) if err != nil { if err == sql.ErrNoRows { return nil, nil } return nil, err } return u, nil } func Update{{.Type}}(db *sql.DB, u *{{.Type}}) error { q := "UPDATE {{.Type}} SET name = ?, email = ? WHERE id = ?" _, err := db.Exec(q, u.Name, u.Email, u.ID) if err != nil { return err } return nil } func Delete{{.Type}}(db *sql.DB, id int64) error { q := "DELETE FROM {{.Type}} WHERE id = ?" _, err := db.Exec(q, id) if err != nil { return err } return nil } `

type tmplData struct{ Type string }

func main() {

t := template.Must(template.New("crud").Parse(tmpl))

data := tmplData{Type: "User"}

var buf bytes.Buffer

err := t.Execute(&buf, data)

if err != nil {

panic(err)

}

fmt.Println(buf.String())

}

~~~

在上面的代码中,我们使用了Go的text/template包来生成代码。我们定义了一个包含占位符的模板字符串,然后使用struct的信息来填充占位符。

最后,我们只需要运行gen.go文件,就可以生成CRUD代码了。

例如,我们可以在命令行中运行以下命令:

~~~

go generate

~~~