Запрос gorm не возвращает ничего

Я новичок в gorm (в этом отношении, я новичок в go а также) и, как вы могли ожидать, я нашел то, что не могу обернуть головой:

n_user, err := NewUser("Vikram Durai",
        "vikramdurai", "hello", make([]Repository, 1))
    if err != nil {
        log.Fatal(err)
    }
    err = n_user.NewRepo("test", "print('Hello World')")
    if err != nil {
        log.Fatal(err)
    }
    o_user, err := LoadUser("Vikram Durai")
    if err != nil {
        log.Fatal(err)
    }
    if o_user == nil {
        log.Fatal("o_user IS NIL!")
    }

печатает:

2017/10/29 18:16:55 o_user IS NIL!

И я не могу понять почему.

Полный код (для справки):

package main

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"

    // "net/http"
    "fmt"
    "log"
    "strings"
)

var forbidden_chars = []string{
    "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "+", "{", "|",
    "\\", ";", ":", "'", "\"", "<", ">", ",", ".", "/", "?", " ",
}

func sanitize(str string, chars []string) string {
    new_string := str
    for _, s := range chars {
        strings.Replace(new_string, s, "", -1)
    }
    return new_string
}

func id(name string) string {
    return strings.ToLower(sanitize(name, forbidden_chars))
}

type User struct {
    gorm.Model
    Name         string
    Username     string
    Password     string
    Repositories []Repository
}

type Repository struct {
    gorm.Model
    Owner string
    Name  string
    Code  string
}

func NewUser(name string, username string, password string,
    repositories []Repository) (*User, error) {
    u := User{
        Name:         name,
        Username:     username,
        Password:     password,
        Repositories: repositories,
    }

    err := u.Save()
    if err != nil {
        return nil, err
    }

    return &u, nil
}

func (u *User) Save() error {
    db, err := gorm.Open("sqlite3", "data/database.db")
    if err != nil {
        return err
    }
    defer db.Close()

    db.Create(u)
    return nil
}

func (u *User) NewRepo(repo_name string, code string) error {
    r := Repository{
        Owner: u.Name,
        Name:  repo_name,
        Code:  code}
    u.Repositories = append(u.Repositories, r)

    err := r.Save()
    if err != nil {
        return err
    }

    return nil
}

func LoadUser(name string) (*User, error) {
    db, err := gorm.Open("sqlite3", "data/database.db")
    if err != nil {
        return nil, err
    }
    defer db.Close()

    var u *User
    db.Where("name", name).First(u)
    return u, nil
}

func (u *User) Delete() error {
    db, err := gorm.Open("sqlite3", "data/database.db")
    if err != nil {
        return err
    }
    defer db.Close()

    db.Delete(&u)

    return nil
}

func (r *Repository) Save() error {
    db, err := gorm.Open("sqlite3", "data/database.db")
    if err != nil {
        return err
    }
    defer db.Close()

    db.Create(r)
    return nil
}

func (r *Repository) Delete() error {
    db, err := gorm.Open("sqlite3", "data/database.db")
    if err != nil {
        return err
    }
    defer db.Close()

    db.Delete(r)
    return nil
}

func LoadRepo(name string) (*Repository, error) {
    db, err := gorm.Open("sqlite3", "data/database.db")
    if err != nil {
        return nil, err
    }
    defer db.Close()

    var r *Repository
    db.Where("Name", name).First(r)

    return r, nil
}

func make_db() {
    db, err := gorm.Open("sqlite3", "data/database.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    db.DropTableIfExists(&User{})
    db.DropTableIfExists(&Repository{})
    db.CreateTable(&User{})
    db.CreateTable(&Repository{})
}

func main() {
    make_db()
    n_user, err := NewUser("Vikram Durai",
        "vikramdurai", "hello", make([]Repository, 1))
    if err != nil {
        log.Fatal(err)
    }
    err = n_user.NewRepo("test", "print('Hello World')")
    if err != nil {
        log.Fatal(err)
    }
    o_user, err := LoadUser("Vikram Durai")
    if err != nil {
        log.Fatal(err)
    }
    if o_user == nil {
        log.Fatal("o_user IS NIL!")
    }
    fmt.Println(fmt.Sprintf(`Name: %s
        Username: %s
        Password: %s`, o_user.Name,
        o_user.Username, o_user.Password))
    fmt.Println(fmt.Sprintf(`Name: %s
        Username: %s
        Password: %s
        Repositories: %v`, n_user.Name,
        n_user.Username, n_user.Password, n_user.Repositories))
}

0 ответов

Другие вопросы по тегам