Запрос 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))
}