mirror of
https://github.com/VinGarcia/ksql.git
synced 2025-09-04 19:36:56 +00:00
Created Avoiding Code Duplication with the Select Builder (markdown)
parent
9d8c5794fb
commit
92e9800594
59
Avoiding-Code-Duplication-with-the-Select-Builder.md
Normal file
59
Avoiding-Code-Duplication-with-the-Select-Builder.md
Normal file
@ -0,0 +1,59 @@
|
||||
## The Select Generator Feature
|
||||
|
||||
There are good reasons not to use `SELECT *` queries the most important
|
||||
of them is that you might end up loading more information than you are actually
|
||||
going to use putting more pressure on your database for no good reason.
|
||||
|
||||
To prevent that KSQL has a feature specifically for building the `SELECT`
|
||||
part of the query using the tags from the input struct.
|
||||
Using it is very simple and it works with all the 3 Query\* functions:
|
||||
|
||||
Querying a single user:
|
||||
|
||||
```golang
|
||||
var user User
|
||||
err = db.QueryOne(ctx, &user, "FROM users WHERE id = ?", userID)
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
```
|
||||
|
||||
Querying a page of users:
|
||||
|
||||
```golang
|
||||
var users []User
|
||||
err = db.Query(ctx, &users, "FROM users WHERE type = ? ORDER BY id LIMIT ? OFFSET ?", "Cristina", limit, offset)
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
```
|
||||
|
||||
Querying all the users, or any potentially big number of users, from the database (not usual, but supported):
|
||||
|
||||
```golang
|
||||
err = db.QueryChunks(ctx, ksql.ChunkParser{
|
||||
Query: "FROM users WHERE type = ?",
|
||||
Params: []interface{}{usersType},
|
||||
ChunkSize: 100,
|
||||
ForEachChunk: func(users []User) error {
|
||||
err := sendUsersSomewhere(users)
|
||||
if err != nil {
|
||||
// This will abort the QueryChunks loop and return this error
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
```
|
||||
|
||||
The implementation of this feature is actually simple internally:
|
||||
|
||||
First, we check if the query starts with the word `FROM`,
|
||||
if it does then we just get the KSQL tags from the struct and
|
||||
then use it for building the `SELECT` statement.
|
||||
|
||||
The `SELECT` statement is then cached so we don't have to build it again
|
||||
the next time making this process very efficient.
|
Loading…
x
Reference in New Issue
Block a user