如何使用 gorm 设置特定的数据库模式?

问题描述 投票:0回答:11

我正在开发一个 CRUD 应用程序。我正在从 api 读取 JSON,我想在具有“database/sql”的数据库中写入此 JSON,并在特定模式中使用 GORM 结构:

type Veiculo struct {
gorm.Model
Codigo                int       `json:"vei_codigo"`
Placa                 string    `json:"vei_placa"`
Nome                  string    `json:"vei_nome"`
}

端点函数:

func CreateVeiculo(c *gin.Context) {

var veiculo model.Veiculo
//id := c.Params.ByName("id")

c.BindJSON(&veiculo)
c.JSON(200, veiculo)

psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+" password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
dbVeiculosGorm, err := gorm.Open("postgres", psqlInfo)
if err != nil {
    panic(err)
}
defer dbVeiculosGorm.Close()

dbVeiculosGorm.AutoMigrate(&model.Veiculo{})

//t := time.Now()
//ts := t.Format("2006-01-02 15:04:05")

dbVeiculosGorm.Create(&model.Veiculo{Placa: veiculo.Placa, Nome: veiculo.Nome}

但是数据库是不可触及的。有多种模式。我必须设置特定的模式吗?我做错了什么?

database go database-connection go-gorm
11个回答
6
投票

使用 GORM 2.0 这将起作用。请注意,必须为

.
添加
TablePrefix

func ConnectDB() (db *gorm.DB, err error) {
    db, err = gorm.Open(postgres.New(postgres.Config{
        DSN:                  `user=test password=test dbname=DB-NAME port=5432 sslmode=disable`,
        PreferSimpleProtocol: true,
    }), &gorm.Config{
        NamingStrategy: schema.NamingStrategy{
            TablePrefix:   "YOUR_SCHEMA_NAME.", // schema name
            SingularTable: false,
        }})
    return
}

4
投票

要在创建语句中指定特定模式,请像这样修改代码:

dbVeiculosGorm.Table("schema.tablename").Create(&model.Veiculo{Placa: veiculo.Placa, Nome: veiculo.Nome}

要为迁移操作指定架构,请添加以下方法:

type Veiculo struct {
    gorm.Model
    Codigo int    `json:"vei_codigo"`
    Placa  string `json:"vei_placa"`
    Nome   string `json:"vei_nome"`
}

func (u *Veiculo) TableName() string {
    // custom table name, this is default
    return "schema.veiculo"
}

3
投票

在自动迁移之前做

gorm.DefaultTableNameHandler = func(dbVeiculosGorm *gorm.DB, defaultTableName string) string {
    return "your schema name." + defaultTableName
}

dbVeiculosGorm.AutoMigrate(&model.Veiculo{})

2
投票

@hbswift的答案也对我有用,但我之前尝试过一些受最新 gorm Close 想法启发的有点不同的东西。

func ConnectDB() (db *gorm.DB, err error) {
    db, err = gorm.Open(postgres.New(postgres.Config{
        DSN:                  `user=postgres password=a12345 dbname=YOUR-DB-NAME port=5432 sslmode=disable`,
        PreferSimpleProtocol: true, // disables implicit prepared statement usage. By default pgx automatically uses the extended protocol
    }), &gorm.Config{})
    return
}


func main() {
    var sqlDB *sql.DB
    var db *gorm.DB
    {
        var err error
        db, err = ConnectDB()
        if err != nil {
            os.Exit(-1)
        }
        sqlDB, _ = db.DB()
        sqlDB.Exec(`set search_path='Schema-Name'`)
    }
    defer sqlDB.Close()

}

1
投票

除了 Alan.WCR 将表名称大写之外,

gorm.DefaultTableNameHandler = func(db *gorm.DB, table string) string {
    var tableName string
    names := strings.Split(table, "_")
    for _, name := range names {
        tableName = tableName + strings.Title(name)
    }
    return "Users." + tableName
}

0
投票

我将此配置与具有单数名称的 postgresql 数据库一起使用。

gorm.DefaultTableNameHandler = func(db *gorm.DB, table string) string {
    fmt.Printf(table)
    return "schema_name." + table[:len(table)-1]
}

0
投票

我还没有评论的声誉,否则我会评论 Yurifull 的帖子。值得一提的是,奇异化比砍掉最后一个字符要复杂得多。幸运的是,jinzhu 已将奇异化逻辑拆分到自己的包中,因此我们可以将 Yurifull 的代码更新为如下所示:

import (
    "github.com/jinzhu/inflection"
)

...

gorm.DefaultTableNameHandler = func(db *gorm.DB, table string) string {
    fmt.Printf(table)
    return "schema_name." + inflection.Singular(table)
}

0
投票

我发布了一个专门处理 gorm 中多租户的包。请参阅https://github.com/bartventer/gorm-multitenancy


-1
投票

如果您使用的是最新版本的 gorm,这将不起作用:

gorm.DefaultTableNameHandler = func(dbVeiculosGorm *gorm.DB, defaultTableName string) string {
    return "your schema name." + defaultTableName
}

dbVeiculosGorm.AutoMigrate(&model.Veiculo{})

而是在 gorm 配置中定义命名约定。示例:

    dsn := "host=localhost user=myuser dbname=golang_tutorial port=5432"
    db,err := gorm.Open(postgres.Open(dsn), &gorm.Config{
            NamingStrategy: schema.NamingStrategy{
                TablePrefix: "golang_crud.", // schema name  
                SingularTable: true,
            },
    })

-1
投票

请使用此代码检查我的测试是否已开启

包主

导入( “github.com/jinzhu/gorm” _“github.com/jinzhu/gorm/dialects/postgres” )

类型用户结构体{ ID 整数 用户名字符串 }

函数主(){ db, err := gorm.Open("postgres", "host=localhost port=5432 sslmode=disable dbname=aman") 如果错误!= nil { 恐慌(错误) } 延迟 db.Close() db.LogMode(true)

// set schema here.
gorm.DefaultTableNameHandler = func(db *gorm.DB, tableName string) string {
    return "s1." + tableName
}

db.CreateTable(&User{})

}


-3
投票

这是一个基本示例,几乎涵盖了通过
gorm 将一些简单数据插入到 PostgreSQL 数据库中所需的一切。

main.go

package main

import (
    "log"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres" // Don't forget the dialect
)

// Simple Example model
type FuelType struct {
    gorm.Model // Gorm default columns (id, created_at, updated_at, deleted_at)
    Name string
}

func main() {
    // Database initialization
    db, err := gorm.Open(
        "postgres",
        "host=localhost port=5432 user=postgres dbname=foo password=bar sslmode=disable",
    )
    if err != nil {
        log.Fatalln("Can't connect to the db: ", err)
    }
    defer func() {
        if err := db.Close(); err != nil {
            log.Fatalln("Can't close the db connection: ", err)
        }
    }()

    // Migration
    db.AutoMigrate(&FuelType{})

    // Insertion
    fuelType := FuelType{Name: "100 GFuel"}
    db.Create(&fuelType)
}
© www.soinside.com 2019 - 2024. All rights reserved.