dongwen7730
dongwen7730
2017-08-01 15:22

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

已采纳

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

with the models being

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
}

The output:

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • doudi2520 doudi2520 4年前

    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 { /* ... */ }
    
    点赞 评论 复制链接分享
  • dongying2112 dongying2112 4年前

    Also, additionally,

    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 = ""
    customer.PrimaryEmail.Address = "my@mail.come"
    customer.PrimaryEmail.Verified = true
    tx := db.Begin()
    
    if e := tx.Create(customer).Error; e != nil {
        tx.Rollback()
        log.Fatal("create customer", 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 ;)

    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
        CustomerID uint
        First      string `json:"first"`
        Middle     string `json:"middle"`
        Last       string `json:"last"`
    }
    
    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

    点赞 评论 复制链接分享

相关推荐