Dialects allow goqu the build the correct SQL for each database. There are four dialects that come packaged with goqu
- mysql -
import _ "github.com/doug-martin/goqu/v9/dialect/mysql"
- postgres -
import _ "github.com/doug-martin/goqu/v9/dialect/postgres"
- sqlite3 -
import _ "github.com/doug-martin/goqu/v9/dialect/sqlite3"
- sqlserver -
import _ "github.com/doug-martin/goqu/v9/dialect/sqlserver"
NOTE Dialects work like drivers in go where they are not registered until you import the package.
Below are examples for each dialect. Notice how the dialect is imported and then looked up using goqu.Dialect
import (
"fmt"
"github.com/doug-martin/goqu/v9"
// import the dialect
_ "github.com/doug-martin/goqu/v9/dialect/postgres"
)
// look up the dialect
dialect := goqu.Dialect("postgres")
// use dialect.From to get a dataset to build your SQL
ds := dialect.From("test").Where(goqu.Ex{"id": 10})
sql, args, err := ds.ToSQL()
if err != nil{
fmt.Println("An error occurred while generating the SQL", err.Error())
}else{
fmt.Println(sql, args)
}
Output:
SELECT * FROM "test" WHERE "id" = 10 []
import (
"fmt"
"github.com/doug-martin/goqu/v9"
// import the dialect
_ "github.com/doug-martin/goqu/v9/dialect/mysql"
)
// look up the dialect
dialect := goqu.Dialect("mysql")
// use dialect.From to get a dataset to build your SQL
ds := dialect.From("test").Where(goqu.Ex{"id": 10})
sql, args, err := ds.ToSQL()
if err != nil{
fmt.Println("An error occurred while generating the SQL", err.Error())
}else{
fmt.Println(sql, args)
}
Output:
SELECT * FROM `test` WHERE `id` = 10 []
import (
"fmt"
"github.com/doug-martin/goqu/v9"
// import the dialect
_ "github.com/doug-martin/goqu/v9/dialect/sqlite3"
)
// look up the dialect
dialect := goqu.Dialect("sqlite3")
// use dialect.From to get a dataset to build your SQL
ds := dialect.From("test").Where(goqu.Ex{"id": 10})
sql, args, err := ds.ToSQL()
if err != nil{
fmt.Println("An error occurred while generating the SQL", err.Error())
}else{
fmt.Println(sql, args)
}
Output:
SELECT * FROM `test` WHERE `id` = 10 []
import (
"fmt"
"github.com/doug-martin/goqu/v9"
// import the dialect
_ "github.com/doug-martin/goqu/v9/dialect/sqlserver"
)
// look up the dialect
dialect := goqu.Dialect("sqlserver")
// use dialect.From to get a dataset to build your SQL
ds := dialect.From("test").Where(goqu.Ex{"id": 10})
sql, args, err := ds.ToSQL()
if err != nil{
fmt.Println("An error occurred while generating the SQL", err.Error())
}else{
fmt.Println(sql, args)
}
Output:
SELECT * FROM "test" WHERE "id" = 10 []
You can also create a goqu.Database
instance to query records.
In the example below notice that we imported the dialect and driver for side effect only.
import (
"database/sql"
"github.com/doug-martin/goqu/v9"
_ "github.com/doug-martin/goqu/v9/dialect/postgres"
_ "github.com/lib/pq"
)
dialect := goqu.Dialect("postgres")
pgDb, err := sql.Open("postgres", "user=postgres dbname=goqupostgres sslmode=disable ")
if err != nil {
panic(err.Error())
}
db := dialect.DB(pgDb)
// "SELECT COUNT(*) FROM "user";
if count, err := db.From("user").Count(); err != nil {
fmt.Println(err.Error())
}else{
fmt.Printf("User count = %d", count)
}
Dialects in goqu are the foundation of building the correct SQL for each DB dialect.
Most SQL dialects share a majority of their syntax, for this reason goqu
has a default set of dialect options that can be used as a base for any new Dialect.
When creating a new SQLDialect
you just need to override the default values that are documented in SQLDialectOptions
.
Take a look at postgres
, mysql
and sqlite3
for examples.
When creating a new dialect you must register it using RegisterDialect
. This method requires 2 arguments.
dialect string
- The name of your dialectopts SQLDialectOptions
- The custom options for your dialect
For example you could create a custom dialect that replaced the default quote '"'
with a backtick `
opts := goqu.DefaultDialectOptions()
opts.QuoteRune = '`'
goqu.RegisterDialect("custom-dialect", opts)
dialect := goqu.Dialect("custom-dialect")
ds := dialect.From("test")
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
Output:
SELECT * FROM `test` []
For more examples look at postgres
, mysql
and sqlite3
for examples.