Add Get user
This commit is contained in:
parent
2aeb634287
commit
1a43dd6ba4
26
users.go
26
users.go
@ -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,11 +19,26 @@ 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
|
||||||
func (u *User) Update(ex *sqlx.Execer) error {
|
func (u *User) Update(ex *sqlx.Execer) error {
|
||||||
|
@ -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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user