go-gorm,postgres:简单插入返回错误

huangapple go评论88阅读模式
英文:

go-gorm, postgres: simple inserts return error

问题

我正在尝试进行简单的插入操作,想要评估Postgres的实用性,因为最近有点炒作。我是一个MongoDB的用户。以下是我正在尝试做的事情:

db, e := gorm.Open("postgres", fmt.Sprintf("host=%s user=%s dbname=%s password=%s sslmode=disable", pgHost, pgUser, pgDatabase, pgPass))
if e != nil {
    log.Fatal(e.Error())
}
defer db.Close()
db.AutoMigrate(&model.Customer{}, &model.Email{}, &model.Address{}, &model.Name{}, &model.Logindata{})

name := new(model.Name)
email := new(model.Email)
customer := &model.Customer{
    Name:         name,
    PrimaryEmail: email,
}
customer.Name.First = "Darko"
customer.Name.Last = "Luketic"
customer.Name.Middle = "" // also tried without this line
customer.PrimaryEmail.Address = "my@mail.come"
customer.PrimaryEmail.Verified = true
tx := db.Begin()

if e := tx.Create(name); e != nil {
    tx.Rollback()
    log.Fatal("create name", e.Error)
}

if e := tx.Create(email); e != nil {
    tx.Rollback()
    log.Fatal("create email", e.Error)
}

if e := tx.Create(customer); e != nil {
    tx.Rollback()
    log.Fatal("create customer", e.Error)
}

tx.Commit()

其中模型定义如下:

package model

import "github.com/jinzhu/gorm"

type Customer struct {
    gorm.Model
    Name            *Name
    BillingAddress  *Address
    ShippingAddress *Address
    PrimaryEmail    *Email
    AlternateEmails []*Email
    Logindata       *Logindata
}

type Name struct {
    gorm.Model
    First  string `json:"first"`
    Middle string `json:"middle"`
    Last   string `json:"last"`
}

type Logindata struct {
    gorm.Model
    Username string
    Password []byte
}

type Email struct {
    gorm.Model
    Address  string
    Verified bool
}

type Address struct {
    gorm.Model
    Address1 string
    Address2 string
    City     string
    Code     string
    Country  string
}

输出结果为:

go run main.go migrate
migrate called
2017/08/01 17:10:26 create name<nil>
exit status 1

我做错了什么?
为什么没有错误消息?
我该如何修复它?

英文:

I'm trying to do simple inserts, trying to evaluate the usefulness of Postgres because of this recent hype. I'm a mongoDB guy. And this is what I'm trying to do:

db, e := gorm.Open(&quot;postgres&quot;, fmt.Sprintf(&quot;host=%s user=%s dbname=%s password=%s sslmode=disable&quot;, pgHost, pgUser, pgDatabase, pgPass))
if e != nil {
	log.Fatal(e.Error())
}
defer db.Close()
db.AutoMigrate(&amp;model.Customer{}, &amp;model.Email{}, &amp;model.Address{}, &amp;model.Name{}, &amp;model.Logindata{})

name := new(model.Name)
email := new(model.Email)
customer := &amp;model.Customer{
	Name:         name,
	PrimaryEmail: email,
}
customer.Name.First = &quot;Darko&quot;
customer.Name.Last = &quot;Luketic&quot;
customer.Name.Middle = &quot;&quot; // also tried without this line
customer.PrimaryEmail.Address = &quot;my@mail.come&quot;
customer.PrimaryEmail.Verified = true
tx := db.Begin()

if e := tx.Create(name); e != nil {
	tx.Rollback()
	log.Fatal(&quot;create name&quot;, e.Error)
}

if e := tx.Create(email); e != nil {
	tx.Rollback()
	log.Fatal(&quot;create email&quot;, e.Error)
}

if e := tx.Create(customer); e != nil {
	tx.Rollback()
	log.Fatal(&quot;create customer&quot;, e.Error)
}

tx.Commit()

with the models being

package model

import &quot;github.com/jinzhu/gorm&quot;

type Customer struct {
	gorm.Model
	Name            *Name
	BillingAddress  *Address
	ShippingAddress *Address
	PrimaryEmail    *Email
	AlternateEmails []*Email
	Logindata       *Logindata
}

type Name struct {
	gorm.Model
	First  string `json:&quot;first&quot;`
	Middle string `json:&quot;middle&quot;`
	Last   string `json:&quot;last&quot;`
}

type Logindata struct {
	gorm.Model
	Username string
	Password []byte
}

type Email struct {
	gorm.Model
	Address  string
	Verified bool
}

type Address struct {
	gorm.Model
	Address1 string
	Address2 string
	City     string
	Code     string
	Country  string
}

The output:

go run main.go migrate
migrate called
2017/08/01 17:10:26 create name&lt;nil&gt;
exit status 1

What am I doing wrong?
Why is there no error message?
How do I fix it?

答案1

得分: 1

根据文档的说明,Create方法返回的是*DB类型,而不是错误。所以你的代码应该更像这样:

if tx = tx.Create(name); tx.Error != nil { /* ... */ }
英文:

According to the docs, Create returns a *DB, not an error. So your code should be more like

if tx = tx.Create(name); tx.Error != nil { /* ... */ }

答案2

得分: 0

此外,

db,e:= gorm.Open(“ postgres”,fmt.Sprintf(“ host =%s user =%s dbname =%s password =%s sslmode = disable”,pgHost,pgUser,pgDatabase,pgPass))
如果e!= nil {
	log.Fatal(e.Error())
}
defer db.Close()
db.AutoMigrate(&model.Customer {},&model.Email {},&model.Address {},&model.Name {},&model.Logindata {})

name:= new(model.Name)
email:= new(model.Email)
customer:=&model.Customer {
	Name:name,
	PrimaryEmail:email,
}
customer.Name.First =“ Darko”
customer.Name.Last =“ Luketic”
customer.Name.Middle =“”
customer.PrimaryEmail.Address =“ my@mail.come”
customer.PrimaryEmail.Verified = true
tx:= db.Begin()

如果e:= tx.Create(customer).Error; e!= nil {
	tx.Rollback()
	log.Fatal(“创建客户”,e)
}
tx.Commit()

我需要更改结构,使它们具有相关字段。我对orm期望更多。这就是为什么它是一个ORM对象关系管理器。
gorm在那里没有管理太多;)

包模型

import "github.com/jinzhu/gorm"

类型客户 struct {
gorm.Model
Name *Name
BillingAddress *Address
ShippingAddress *Address
PrimaryEmail *Email
AlternateEmails []*Email
Logindata *Logindata
}

类型名称 struct {
gorm.Model
CustomerID uint
First string json:"first"
Middle string json:"middle"
Last string json:"last"
}

类型Logindata struct {
gorm.Model
CustomerID uint
Username string
Password []byte
}

类型电子邮件 struct {
gorm.Model
CustomerID uint
Address string
Verified bool
}

类型地址 struct {
gorm.Model
CustomerID uint
Address1 string
Address2 string
City string
Code string
Country string
}

注意CustomerID uint

英文:

Also, additionally,

db, e := gorm.Open(&quot;postgres&quot;, fmt.Sprintf(&quot;host=%s user=%s dbname=%s password=%s sslmode=disable&quot;, pgHost, pgUser, pgDatabase, pgPass))
if e != nil {
	log.Fatal(e.Error())
}
defer db.Close()
db.AutoMigrate(&amp;model.Customer{}, &amp;model.Email{}, &amp;model.Address{}, &amp;model.Name{}, &amp;model.Logindata{})

name := new(model.Name)
email := new(model.Email)
customer := &amp;model.Customer{
	Name:         name,
	PrimaryEmail: email,
}
customer.Name.First = &quot;Darko&quot;
customer.Name.Last = &quot;Luketic&quot;
customer.Name.Middle = &quot;&quot;
customer.PrimaryEmail.Address = &quot;my@mail.come&quot;
customer.PrimaryEmail.Verified = true
tx := db.Begin()

if e := tx.Create(customer).Error; e != nil {
	tx.Rollback()
	log.Fatal(&quot;create customer&quot;, e)
}
tx.Commit()

I need to change the structs so they have a related field. I did expect more from an orm. That's why it's an ORM object relationship manager.
gorm doesn't manage much there go-gorm,postgres:简单插入返回错误

package model

import &quot;github.com/jinzhu/gorm&quot;

type Customer struct {
	gorm.Model
	Name            *Name
	BillingAddress  *Address
	ShippingAddress *Address
	PrimaryEmail    *Email
	AlternateEmails []*Email
	Logindata       *Logindata
}

type Name struct {
	gorm.Model
	CustomerID uint
	First      string `json:&quot;first&quot;`
	Middle     string `json:&quot;middle&quot;`
	Last       string `json:&quot;last&quot;`
}

type Logindata struct {
	gorm.Model
	CustomerID uint
	Username   string
	Password   []byte
}

type Email struct {
	gorm.Model
	CustomerID uint
	Address    string
	Verified   bool
}

type Address struct {
	gorm.Model
	CustomerID uint
	Address1   string
	Address2   string
	City       string
	Code       string
	Country    string
}

note the CustomerID uint

huangapple
  • 本文由 发表于 2017年8月1日 23:22:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/45441783.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定