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

Database 如何使用gorm设置特定的数据库模式?,database,go,database-connection,go-gorm,Database,Go,Database Connection,Go Gorm,我正在开发一个CRUD应用程序。我从一个api中读取一个JSON,我想将这个JSON写在一个带有“database/sql”的数据库中,并将GORM写在一个特定的模式中 结构: type Veiculo struct { gorm.Model Codigo int `json:"vei_codigo"` Placa string `json:"vei_placa"` Nome str

我正在开发一个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}

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

这是一个基本示例,说明了通过gorm将一些简单数据
插入PostgreSQL数据库所需的一切

梅因,加油

在自动迁移之前,请执行以下操作:

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

dbVeiculosGorm.AutoMigrate(&model.Veiculo{})

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

我使用postgresql将此配置用于具有单数名称的数据库

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

我还没有评论的名声,否则我会在尤里福的帖子上发表评论。值得一提的是,奇点化比切掉最后一个角色要复杂得多。幸运的是,金珠已经将奇点化逻辑拆分为自己的包,因此我们可以将Yurifull的代码更新为:

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

...

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

要在create语句中指定特定架构,请按如下方式修改代码:

dbVeiculosGorm.Table(“schema.tablename”).Create(&model.Veiculo{Placa:Veiculo.Placa,Nome:Veiculo.Nome}
要为迁移操作指定架构,请添加以下方法:

类型Veiculo结构{
戈姆模型
Codigo int`json:“vei_Codigo”`
Placa字符串`json:“vei_Placa”`
Nome string`json:“vei_Nome”`
}
func(u*Veiculo)TableName()字符串{
//自定义表名,这是默认值
返回“schema.veiculo”
}

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

gorm.DefaultTableNameHandler=func(dbVeiculosGorm*gorm.DB,defaultTableName字符串)字符串{
返回“您的架构名称”。+defaultTableName
}
dbVeiculosGorm.AutoMigrate(&model.Veiculo{})
而是在gorm配置中定义命名约定。示例:

dsn:=“主机=localhost用户=myuser数据库名=golang\u教程端口=5432”
db,err:=gorm.Open(postgres.Open(dsn),&gorm.Config{
NamingStrategy:schema.NamingStrategy{
TablePrefix:“golang_crud.”,//模式名称
奇点表:是的,
},
})

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()

}

你试过制作一个超级简单的模型,迁移它并向其中插入一些数据吗?@Mihailo是的。我试过一个简单的get并返回一个错误:column''columnName"你是否迁移了你的模型?它们是否存在于数据库中?是的。它们存在你可以从中读取。如果表不存在,你的数据将无处保存。我像你的示例一样尝试过,但没有效果。我的数据库有多个模式。我如何设置要插入数据的特定模式?你的操作系统是什么?你有吗将您的用户身份验证设置为使用密码而不是标识?有多个模式是正常的,默认情况下它们都会出现。它是w10。我已经创建、更新、删除并从数据库中获取数据。现在我尝试使用gorm包来简化事情…好的,那么您确定您的用户通过密码而不是标识进行身份验证吗?如果您opy将我的代码粘贴到一个新文件中,更改凭据并运行它。它是否插入数据库?它运行,但不插入数据库!!我收到以下错误
DefaultTableNameHandler未由包gorm声明

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()

}