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("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 = "[email protected]"
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 Answers 2

1

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 { /* ... */ }
Sign up to request clarification or add additional context in comments.

Comments

0

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 = "[email protected]"
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

2 Comments

I'm glad you solved your problem, this doesn't provide enough explanation for anyone but you to get any value out of it. Can you detail this so that the broader community might find some use in it?
pay me and I will consider it

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.