为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕侠2389804 2023-06-01 15:18:17
我正在开发一个 CRUD 应用程序。我正在从一个 api 读取一个 JSON,我想将这个 JSON 写入一个数据库中,其中包含“database/sql”和 GORM 的特定模式结构:type Veiculo struct {gorm.ModelCodigo                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}但数据库是不可触及的。有多个模式。我必须设置特定的架构吗?我究竟做错了什么?
查看完整描述

6 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

使用 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

}


查看完整回答
反对 回复 2023-06-01
?
慕容森

TA贡献1853条经验 获得超18个赞

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


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"

}


查看完整回答
反对 回复 2023-06-01
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

在自动迁移之前做


gorm.DefaultTableNameHandler = func(dbVeiculosGorm *gorm.DB, defaultTableName string) string {

    return "your schema name." + defaultTableName

}


dbVeiculosGorm.AutoMigrate(&model.Veiculo{})


查看完整回答
反对 回复 2023-06-01
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

我之前尝试了一些与最新的 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()


}


查看完整回答
反对 回复 2023-06-01
?
森栏

TA贡献1810条经验 获得超5个赞

除了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

}


查看完整回答
反对 回复 2023-06-01
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

值得一提的是,单数化比砍掉最后一个字符要复杂得多。幸运的是,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)

}


查看完整回答
反对 回复 2023-06-01
  • 6 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信