Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 绑定结构并在Golang中创建数据库_Sql_Go - Fatal编程技术网

Sql 绑定结构并在Golang中创建数据库

Sql 绑定结构并在Golang中创建数据库,sql,go,Sql,Go,如何在Golang中将data struct与其标记/标志绑定到数据库创建中 例如,我有以下代码: 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

如何在Golang中将data struct与其标记/标志绑定到数据库创建中

例如,我有以下代码:

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等)的最佳实践?

您可以使用它来检查结构并使用它来构造数据库查询

例如:

如果要读取结构的名称以将其用作表名,请执行以下操作:

tableName := reflect.TypeOf(your-struct).Name()
如果要读取结构的属性,请使用以下命令循环并读取它:

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)
}
val:=reflect.ValueOf(您的结构)
对于i:=0;i
请注意,struct的标记位于back tick->`


这就是您需要从结构中获得的全部内容。您应该在文档中进行更多探索。

您似乎想做的是将一个类型映射到a db关系,如果这是您想要的,您可以使用现有的ORM或自己实现一个ORM。从不喜欢使用ORM的人的角度来看,您应该在不使用Go、使用.sql文件和shell脚本初始化数据库的情况下创建db。哪一个更好,ORM还是no-ORM,与Vim vs-Emacs属于同一类,因为它是基于观点的,因此不需要在此基础上提问。。。。如果您决定自己实现某种ORM,请使用
reflect
包读取结构的字段标记并使用这些标记构建查询。在您知道之前,您将手工创建自己的ORM!为自己省去很多麻烦,如果你真的不需要的话,也不要重新发明轮子。有一种方法似乎可以在没有orm位的情况下进行结构标记迁移(虽然没有经过测试),也没有理由你不能仅在迁移时使用gorm或类似的方法