亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 317 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號