ksql/examples/logging_queries/main.go

102 lines
2.7 KiB
Go

package main
import (
"context"
"github.com/vingarcia/ksql"
"github.com/vingarcia/ksql/adapters/ksqlite3"
)
type User struct {
ID int `ksql:"id"`
Name string `ksql:"name"`
Age int `ksql:"age"`
}
// UsersTable informs KSQL the name of the table and that it can
// use the default value for the primary key column name: "id"
var UsersTable = ksql.NewTable("users")
func main() {
ctx := context.Background()
db, err := ksqlite3.New(ctx, "/tmp/hello.sqlite", ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
panic(err.Error())
}
defer db.Close()
// After we inject a logger, all subsequent queries
// will use this logger.
//
// You can also inject the ksql.ErrorLogger if you only
// care about these logs when a query error happens.
ctx = ksql.InjectLogger(ctx, ksql.Logger)
// This logs: {"query":"CREATE TABLE IF NOT EXISTS users (\n\t id INTEGER PRIMARY KEY,\n\t\tage INTEGER,\n\t\tname TEXT\n\t)","params":null}
_, err = db.Exec(ctx, `CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
age INTEGER,
name TEXT
)`)
if err != nil {
panic(err.Error())
}
// This logs: {"query":"INSERT INTO `users` (`name`, `age`) VALUES (?, ?)","params":["Alison",22]}
var alison = User{
Name: "Alison",
Age: 22,
}
err = db.Insert(ctx, UsersTable, &alison)
if err != nil {
panic(err.Error())
}
// This logs: {"query":"SELECT `id`, `name`, `age` FROM users LIMIT 10","params":null}
var users []User
err = db.Query(ctx, &users, "FROM users LIMIT 10")
if err != nil {
panic(err.Error())
}
// This logs: {"query":"SELECT `id`, `name`, `age` FROM users WHERE age < ?","params":[42]}
err = db.QueryChunks(ctx, ksql.ChunkParser{
Query: "FROM users WHERE age < ?",
Params: []interface{}{42},
ChunkSize: 100,
ForEachChunk: func(chunk []User) error {
// Do nothing, since this is just an example
return nil
},
})
if err != nil {
panic(err.Error())
}
// This logs: {"query":"SELECT `id`, `name`, `age` FROM users WHERE name = ?","params":["Alison"]}
err = db.QueryOne(ctx, &alison, "FROM users WHERE name = ?", "Alison")
if err != nil {
panic(err.Error())
}
// This logs: {"query":"UPDATE `users` SET `name` = ?, `age` = ? WHERE `id` = ?","params":["Alison",23,1]}
alison.Age++
err = db.Patch(ctx, UsersTable, alison)
if err != nil {
panic(err.Error())
}
// This logs: {"query":"DELETE FROM `users` WHERE `id` = ?","params":[1]}
err = db.Delete(ctx, UsersTable, alison.ID)
if err != nil {
panic(err.Error())
}
// Here we are provoking an error, so we can see an error on the log:
_ = db.QueryOne(ctx, &alison, "not a valid query", "someFakeParams")
// This logs: {"query":"not a valid query","params":["someFakeParams"],"error":"error running query: near \"not\": syntax error"}
}