在Golang中使用数据库创建绑定结构

k0pti3hp  于 2023-06-27  发布在  Go
关注(0)|答案(2)|浏览(127)

如何将数据结构体与Golang中的数据库创建沿着标记/标志绑定。
例如,我有这样的代码:

type User struct {
    ID      int     `sql:"primary_key;AUTO_INCREMENT"`
    Name    string  `sql:"type:varchar(100);unique"`
    Email   string  `sql:"type:varchar(100);unique"`
    Address string  `sql:"type:varchar(100)"`
}

当创建基于此结构的数据库时,我手动创建它,如下所示:

func (db *DB) CreateUserTable() (sql.Result, error) {

    statement := "CREATE TABLE IF NOT EXISTS %s (%s int, %s varchar, %s varchar, %s varchar)"
    return db.Exec(
        fmt.Sprintf(statement,
            "user",
            "id",
            "name",
            "email",
            "address",
        ),
    )
}

如何在创建数据库时绑定结构体及其标记(主键、NULL等)?是否有不使用ORM库(gorm等)的最佳实践?

mec1mxoz

mec1mxoz1#

您可以使用reflect来检查结构体并使用它来构造数据库查询。
例如:
如果你想读取struct的名字作为表名:

tableName := reflect.TypeOf(your-struct).Name()

如果你想读取struct的属性,循环并使用以下命令读取它:

val := reflect.ValueOf(your-struct)
for i:=0; i < val.NumField(); i++ {
    field := val.Type().Field(i)
    tag := field.Tag

    fieldType := field.Type // get struct's variable type
    fieldName := field.Name //get struct variable's name
    fieldByTag1 := tag.Get("your-tag") // get struct tag's name 
    fieldByTag2 := tag.Get("your-another-tag") // get another struct tag's name(if you have more)
}

注意struct的标签是在反勾号-> `里面的
这就是您需要从结构中获得的全部内容。您应该在文档中探索更多内容。

jdgnovmf

jdgnovmf2#

我做的这个项目:https://github.com/sunary/sqlize

  • 允许创建从结构迁移
  • 检测结构和存在SQL之间的差异

相关问题