Database 如何使用gorm设置特定的数据库模式?
我正在开发一个CRUD应用程序。我从一个api中读取一个JSON,我想将这个JSON写在一个带有“database/sql”的数据库中,并将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
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()
}