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

我正在开发一个 CRUD 应用程序。我正在从一个 api 读取一个 JSON,我想将这个 JSON 写入一个数据库中,其中包含“database/sql”和 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}

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


慕侠2389804
浏览 186回答 6
6回答

慕码人2483693

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

慕容森

要在 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"}

幕布斯7119047

在自动迁移之前做gorm.DefaultTableNameHandler = func(dbVeiculosGorm *gorm.DB, defaultTableName string) string {    return "your schema name." + defaultTableName}dbVeiculosGorm.AutoMigrate(&model.Veiculo{})

慕娘9325324

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

森栏

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

慕姐4208626

值得一提的是,单数化比砍掉最后一个字符要复杂得多。幸运的是,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)}
打开App,查看更多内容
随时随地看视频慕课网APP