我正在开发一个 CRUD 应用程序。我正在从 api 读取 JSON,我想在具有“database/sql”的数据库中写入此 JSON,并在特定模式中使用 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 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
}
要在创建语句中指定特定模式,请像这样修改代码:
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"
}
在自动迁移之前做
gorm.DefaultTableNameHandler = func(dbVeiculosGorm *gorm.DB, defaultTableName string) string {
return "your schema name." + defaultTableName
}
dbVeiculosGorm.AutoMigrate(&model.Veiculo{})
@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()
}
除了 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 的帖子。值得一提的是,奇异化比砍掉最后一个字符要复杂得多。幸运的是,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)
}
我发布了一个专门处理 gorm 中多租户的包。请参阅https://github.com/bartventer/gorm-multitenancy。
如果您使用的是最新版本的 gorm,这将不起作用:
gorm.DefaultTableNameHandler = func(dbVeiculosGorm *gorm.DB, defaultTableName string) string {
return "your schema name." + defaultTableName
}
dbVeiculosGorm.AutoMigrate(&model.Veiculo{})
而是在 gorm 配置中定义命名约定。示例:
dsn := "host=localhost user=myuser dbname=golang_tutorial port=5432"
db,err := gorm.Open(postgres.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "golang_crud.", // schema name
SingularTable: true,
},
})
请使用此代码检查我的测试是否已开启
包主
导入( “github.com/jinzhu/gorm” _“github.com/jinzhu/gorm/dialects/postgres” )
类型用户结构体{ ID 整数 用户名字符串 }
函数主(){ db, err := gorm.Open("postgres", "host=localhost port=5432 sslmode=disable dbname=aman") 如果错误!= nil { 恐慌(错误) } 延迟 db.Close() db.LogMode(true)
// set schema here.
gorm.DefaultTableNameHandler = func(db *gorm.DB, tableName string) string {
return "s1." + tableName
}
db.CreateTable(&User{})
}
这是一个基本示例,几乎涵盖了通过
gorm 将一些简单数据插入到 PostgreSQL 数据库中所需的一切。
main.go
package main
import (
"log"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres" // Don't forget the dialect
)
// Simple Example model
type FuelType struct {
gorm.Model // Gorm default columns (id, created_at, updated_at, deleted_at)
Name string
}
func main() {
// Database initialization
db, err := gorm.Open(
"postgres",
"host=localhost port=5432 user=postgres dbname=foo password=bar sslmode=disable",
)
if err != nil {
log.Fatalln("Can't connect to the db: ", err)
}
defer func() {
if err := db.Close(); err != nil {
log.Fatalln("Can't close the db connection: ", err)
}
}()
// Migration
db.AutoMigrate(&FuelType{})
// Insertion
fuelType := FuelType{Name: "100 GFuel"}
db.Create(&fuelType)
}