How to bind data struct with database creation in Golang along with its tags/flags.
For example I have this code:
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)"`
}
When creating the database which should be based on this struct, I instead manually create it like this:
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",
),
)
}
How to bind the struct and its tags(primary key, NULL, etc) in database creation?. Is there best practice for it without using ORM libraries(gorm,etc)?
You can use reflect to examine the struct and use it to construct your database query.
For example:
If you want to read struct's name to use it as table name:
tableName := reflect.TypeOf(your-struct).Name()
If you want to read struct's properties, loop and read it by using:
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)
}
Note that struct's tags are the one inside back tick -> `
That's all you need to get from a struct. You should explore more in the documentation.