ZBLOG

golang 生成 postgresql 的动态表结构

在 Go 中可以使用 database/sqlgithub.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 表结构。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1582

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?