2015-10-01 7 views
0

Я пытался использовать функцию «Объединения» в golang orm (https://github.com/jinzhu/gorm/) и не могу создать довольно простую связь. В приведенном ниже примере таблица пользователя содержит данные, но в таблице электронной почты нет. Я пробовал кучу вещей, и я, вероятно, пропустил что-то основное, но не смог найти правильный ответ в github/stackoverflow.Невозможно создать ассоциации через библиотеку orm of golang

Код:

package main 

import (
    "database/sql" 
    "log" 

    "github.com/jinzhu/gorm" 
    "github.com/mattn/go-sqlite3" 
) 

var db gorm.DB 

type User struct { 
    Name string 
    Mail Email 
} 

type Email struct { 
    Address string 
} 

//Initialize DB . 
func InitDB() { 
    var DB_DRIVER string 
    sql.Register(DB_DRIVER, &sqlite3.SQLiteDriver{}) 
    log.Printf("Initializing Database with ", DB_DRIVER) 
    dbSql, _ := sql.Open(DB_DRIVER, "simple-sqlite") 

    var err error 
    db, err = gorm.Open("sqlite3", dbSql) 

    if err != nil { 
     log.Fatalf("Got error when connecting to the database, the error is '%v'", err) 
    } 

    db.LogMode(true) 
    // Then you could invoke `*sql.DB`'s functions with it 
    db.DB().Ping() 
    db.DB().SetMaxIdleConns(10) 
    db.DB().SetMaxOpenConns(100) 

    // Disable table name's pluralization 
    db.SingularTable(true) 
} 

func InitSchema() { 
    db.CreateTable(&User{}, &Email{}) 
} 

func DoStuff() { 
    user := User{Name: "Jinzhu", Mail: Email{Address: "[email protected]"}} 
    db.Create(&user) 
} 

func main() { 
    InitDB() 
    InitSchema() 
    DoStuff() 
} 

идут работать main.go печатает следующие выходные 2015/09/30 17:25:04 Инициализация базы данных с% (EXTRA строка =)

[2015-! 09-30 17:25:04] [3.21ms] CREATE TABLE «пользователь» («имя» varchar (255))

[2015-09-30 17:25:04] [4.01ms] CREATE TABLE " адрес электронной почты "(" адрес "varchar (255))

[2015-09-30 17:25:04] [0.54ms] INSERT INTO «пользователь» («имя») ЦЕННОСТИ («Jinzhu»)

Не уверен, что я здесь отсутствует - оцените любой ответ!

ответ

0

Вы упускаете свои первичные/внешние ключевые ссылки для каждого из ваших моделей, вот обновленный код:

package main 

import (
    "database/sql" 
    "log" 

    "github.com/jinzhu/gorm" 
    "github.com/mattn/go-sqlite3" 
) 

var db gorm.DB 

type User struct { 
    ID  uint `gorm:"primary_key"` 
    Name string 
    Mail Email 
    MailID sql.NullInt64 
} 

type Email struct { 
    ID  uint `gorm:"primary_key"` 
    Address string 
} 

//Initialize DB . 
func InitDB() { 
    var DB_DRIVER string 
    sql.Register(DB_DRIVER, &sqlite3.SQLiteDriver{}) 
    log.Printf("Initializing Database with ", DB_DRIVER) 
    dbSql, _ := sql.Open(DB_DRIVER, "simple-sqlite") 

    var err error 
    db, err = gorm.Open("sqlite3", dbSql) 

    if err != nil { 
     log.Fatalf("Got error when connecting to the database, the error is '%v'", err) 
    } 

    db.LogMode(true) 
    // Then you could invoke `*sql.DB`'s functions with it 
    db.DB().Ping() 
    db.DB().SetMaxIdleConns(10) 
    db.DB().SetMaxOpenConns(100) 

    // Disable table name's pluralization 
    db.SingularTable(true) 
} 

func InitSchema() { 
    db.CreateTable(&User{}, &Email{}) 
} 

func DoStuff() { 
    user := User{Name: "Jinzhu", Mail: Email{Address: "[email protected]"}} 
    db.Create(&user) 
} 

func main() { 
    InitDB() 
    InitSchema() 
    DoStuff() 
} 

уведомления первичных ключей на User и Email структуры, а также внешний ключ ссылки на User