在 Go 中可以使用 database/sql
和 github.com/lib/pq
库连接 PostgreSQL 数据库,并且使用 Go 的 struct 和 tag 来定义表结构,然后通过执行 SQL 语句来创建表。
以下是一个示例代码:
package main
import (
"database/sql"
"fmt"
"github.com/lib/pq"
)
type User struct {
ID int `db:"id"`
Username string `db:"username"`
Email string `db:"email"`
}
func main() {
db, err := sql.Open("postgres", "user=postgres dbname=test sslmode=disable")
if err != nil {
panic(err)
}
defer db.Close()
createTable(db, User{})
}
func createTable(db *sql.DB, model interface{}) {
tableName := pq.QuoteIdentifier("users")
fields := parseFields(model)
query := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s (%s)", tableName, fields)
_, err := db.Exec(query)
if err != nil {
panic(err)
}
}
func parseFields(model interface{}) string {
var fields []string
t := reflect.TypeOf(model)
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
dbTag := f.Tag.Get("db")
fields = append(fields, fmt.Sprintf("%s %s", pq.QuoteIdentifier(dbTag), getColumnType(f)))
}
return strings.Join(fields, ",")
}
func getColumnType(field reflect.StructField) string {
switch field.Type.Kind() {
case reflect.Int:
return "INTEGER"
case reflect.String:
return "VARCHAR(255)"
default:
panic(fmt.Sprintf("Unsupported column type: %v", field.Type.Kind()))
}
}
在上面的代码中,我们定义了一个 User
结构体,然后使用 parseFields()
函数来解析 struct 中的字段并生成对应的表结构语句。在 createTable()
函数中,我们将表名和字段的 SQL 语句拼接起来,最后执行 db.Exec()
方法来创建表。
通过这种方式,我们可以根据 Go struct 的定义动态地生成相应的 PostgreSQL 表结构。