Skip to content

Instantly share code, notes, and snippets.

@ardan-bkennedy
Created February 12, 2018 22:27
Show Gist options
  • Save ardan-bkennedy/681e0252480e982a7a9040ef1225f74d to your computer and use it in GitHub Desktop.
Save ardan-bkennedy/681e0252480e982a7a9040ef1225f74d to your computer and use it in GitHub Desktop.
type Query struct {
Raw string
Named *sqlx.NamedStmt
}
func (q *Query) Build(db *sqlx.DB) error {
var err error
q.Named, err = db.PrepareNamed(q.Raw)
return nil
}
func initQF(db *sqlx.DB, qf func() *Query) error {
q := qf()
return q.Build(db)
}
func defineQ(q *Query, raw string) *Query {
if q != nil {
return q
}
q = &Query{
Raw: raw,
}
return q
}
type AddUser struct {
checkUserExists *Query
insertUser *Query
}
func NewAddUser(db *sqlx.DB) (*AppQueries, error) {
var au AddUser
if err := initQF(db, au.checkUserExists); err != nil {
return nil, err
}
if err := initQF(db, au.insertUser); err != nil {
return nil, err
}
return &au, nil
}
type UserQuery interface {
CheckUserExists() Query
InsertUser() Query
}
func SignupUser(uq UserQuery) {
uq.CheckUserExists()
uq.InsertUser()
}
// Here is the nice part: You can define you queries in their methods, which seems clean and
// easily inspectable
func (au *AddUser) CheckUserExists() *Query {
return defineQ(au.checkUserExists,
`SELECT COUNT(*) FROM users ...`)
}
func (au *AddUser) InsertUser() *Query {
return defineQ(au.insertUser,
`INSERT INTO users ...`)
}
// =============================================================================
type AddUser struct {
db *sqlx.DB
checkUserExists *sqlx.NamedStmt
insertUser *sqlx.NamedStmt
}
func NewAddUser(db *sqlx.DB) (*AddUser, error) {
var err error
queryCUE := "SELECT COUNT(*) FROM users ..."
namedCUE, err := db.PrepareNamed(queryCUE)
if err != nil {
return nil, err
}
queryIU := "INSERT INTO users ..."
namedIU, err := db.PrepareNamed(queryIU)
if err != nil {
return nil, err
}
au := AddUser{
db: db,
checkUserExists: namedCUE,
insertUser: namedIU,
}
return &au, nil
}
func (au *AddUser) Execute() error {
// DO STUFF HERE
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment