Add Get user

This commit is contained in:
Nicolas Duhamel 2016-02-08 00:17:45 +01:00
parent 2aeb634287
commit 1a43dd6ba4
2 changed files with 48 additions and 6 deletions

View File

@ -5,10 +5,13 @@ import "github.com/jmoiron/sqlx"
const usersCreate = ` const usersCreate = `
CREATE TABLE users ( CREATE TABLE users (
id SERIAL, id SERIAL,
name text NOT NULL name text NOT NULL UNIQUE
); );
` `
const addUserQuery = `INSERT INTO users (name) VALUES ($1);` const (
addUserQuery = `INSERT INTO users (name) VALUES ($1) RETURNING id;`
getUserQuery = `SELECT * FROM users WHERE name=$1;`
)
// User represents an user // User represents an user
type User struct { type User struct {
@ -16,10 +19,25 @@ type User struct {
Name string Name string
} }
// Get returns user with specified name
func Get(q sqlx.Queryer, name string) (*User, error) {
u := &User{}
err := q.QueryRowx(getUserQuery, name).StructScan(u)
if err != nil {
return nil, err
}
return u, nil
}
// Add user to database or raises an error // Add user to database or raises an error
func (u *User) Add(ex sqlx.Execer) error { func (u *User) Add(q sqlx.Queryer) error {
_, err := ex.Exec(addUserQuery, u.Name) var id int
err := q.QueryRowx(addUserQuery, u.Name).Scan(&id)
if err != nil {
return err return err
}
u.ID = id
return nil
} }
// Update user on database or raise an error // Update user on database or raise an error

View File

@ -8,7 +8,8 @@ import (
"gitlab.quimbo.fr/odwrtw/canape-sql/sqltest" "gitlab.quimbo.fr/odwrtw/canape-sql/sqltest"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
_ "github.com/lib/pq" "github.com/kr/pretty"
"github.com/lib/pq"
) )
const drop = `DROP TABLE users;` const drop = `DROP TABLE users;`
@ -30,5 +31,28 @@ func init() {
func TestAdd(t *testing.T) { func TestAdd(t *testing.T) {
sqltest.RunWithSchema(db, usersCreate, drop, t, func(db *sqlx.DB, t *testing.T) { sqltest.RunWithSchema(db, usersCreate, drop, t, func(db *sqlx.DB, t *testing.T) {
// Add a new user
u := &User{Name: "plop"}
err := u.Add(db)
if err != nil {
t.Fatal(err)
}
// Try add it twice
err = u.Add(db)
if err != nil {
if err, ok := err.(*pq.Error); ok {
if err.Code.Name() != "unique_violation" {
t.Fatal(err)
}
}
} else {
t.Fatal(err)
}
u, err = Get(db, "plop")
pretty.Println(err)
pretty.Println(u)
}) })
} }