golang强大数据检索与跨数据库查询构建插件库ozzo-dbx的使用
Golang 强大数据检索与跨数据库查询构建插件库 ozzo-dbx 的使用
ozzo-dbx 是一个增强标准 database/sql
包的 Go 包,它提供了强大的数据检索方法以及数据库无关的查询构建能力。ozzo-dbx 不是一个 ORM,它具有以下特性:
- 将数据填充到结构体和 NullString 映射中
- 命名参数绑定
- 数据库无关的查询构建方法,包括 SELECT 查询、数据操作查询和模式操作查询
- 插入、更新和删除模型结构体
- 强大的查询条件构建
- 开放架构,允许添加新数据库支持或自定义现有支持
- 记录执行的 SQL 语句
- 支持主要的关系型数据库
安装
运行以下命令安装包:
go get github.com/go-ozzo/ozzo-dbx
此外,安装要使用的特定数据库驱动包。例如,如果你使用 MySQL,可以安装以下包:
go get github.com/go-sql-driver/mysql
并在主代码中导入:
import _ "github.com/go-sql-driver/mysql"
支持的数据库
以下数据库完全支持:
- SQLite
- MySQL
- PostgreSQL
- MS SQL Server (2012 或以上)
- Oracle
快速开始
以下代码片段展示了如何使用这个包访问 MySQL 数据库:
import (
"fmt"
"github.com/go-ozzo/ozzo-dbx"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, _ := dbx.Open("mysql", "user:pass@/example")
// 创建新查询
q := db.NewQuery("SELECT id, name FROM users LIMIT 10")
// 获取所有行到结构体数组
var users []struct {
ID, Name string
}
err := q.All(&users)
// 获取单行到结构体
var user struct {
ID, Name string
}
err = q.One(&user)
// 获取单行到字符串映射
data := dbx.NullStringMap{}
err = q.One(data)
// 逐行获取
rows2, _ := q.Rows()
for rows2.Next() {
_ = rows2.ScanStruct(&user)
// rows.ScanMap(data)
// rows.Scan(&id, &name)
}
}
查询构建
以下示例展示了如何使用这个包的查询构建能力:
import (
"fmt"
"github.com/go-ozzo/ozzo-dbx"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, _ := dbx.Open("mysql", "user:pass@/example")
// 构建 SELECT 查询
// SELECT `id`, `name` FROM `users` WHERE `name` LIKE '%Charles%' ORDER BY `id`
q := db.Select("id", "name").
From("users").
Where(dbx.Like("name", "Charles")).
OrderBy("id")
// 获取所有行到结构体数组
var users []struct {
ID, Name string
}
err := q.All(&users)
// 构建 INSERT 查询
// INSERT INTO `users` (`name`) VALUES ('James')
err = db.Insert("users", dbx.Params{
"name": "James",
}).Execute()
}
CRUD 操作
虽然 ozzo-dbx 不是 ORM,但它确实提供了一种非常方便的方式来执行典型的 CRUD(创建、读取、更新、删除)操作,而无需编写普通 SQL 语句。
创建
要使用模型创建(插入)新行,调用 ModelQuery.Insert()
方法:
type Customer struct {
ID int
Name string
Email string
Status int
}
db, _ := dbx.Open("mysql", "user:pass@/example")
customer := Customer{
Name: "example",
Email: "test@example.com",
}
// INSERT INTO customer (name, email, status) VALUES ('example', 'test@example.com', 0)
err := db.Model(&customer).Insert()
读取
要通过给定的主键值读取模型,调用 SelectQuery.Model()
:
db, _ := dbx.Open("mysql", "user:pass@/example")
var customer Customer
// SELECT * FROM customer WHERE id=100
err := db.Select().Model(100, &customer)
// SELECT name, email FROM customer WHERE status=1 AND id=100
err = db.Select("name", "email").Where(dbx.HashExp{"status": 1}).Model(100, &customer)
更新
要更新模型,调用 ModelQuery.Update()
方法:
db, _ := dbx.Open("mysql", "user:pass@/example")
// 更新 customer 的所有公共字段
err := db.Model(&customer).Update()
// 只更新 Status
err = db.Model(&customer).Update("Status")
// 更新除 Status 外的所有公共字段
err = db.Model(&customer).Exclude("Status").Update()
删除
要删除模型,调用 ModelQuery.Delete()
方法:
db, _ := dbx.Open("mysql", "user:pass@/example")
err := db.Model(&customer).Delete()
事务
你可以使用所有上述查询执行和构建方法与事务一起使用:
db, _ := dbx.Open("mysql", "user:pass@/example")
tx, _ := db.Begin()
_, err1 := tx.Insert("users", dbx.Params{
"name": "user1",
}).Execute()
_, err2 := tx.Insert("users", dbx.Params{
"name": "user2",
}).Execute()
if err1 == nil && err2 == nil {
tx.Commit()
} else {
tx.Rollback()
}
日志记录
你可以通过为 DB 连接安装记录器来记录和检测 DB 查询:
import (
"fmt"
"log"
"github.com/go-ozzo/ozzo-dbx"
)
func main() {
db, _ := dbx.Open("mysql", "user:pass@/example")
// 简单日志记录
db.LogFunc = log.Printf
// 或者你可以使用以下更灵活的日志记录
db.QueryLogFunc = func(ctx context.Context, t time.Duration, sql string, rows *sql.Rows, err error) {
log.Printf("[%.2fms] Query SQL: %v", float64(t.Milliseconds()), sql)
}
db.ExecLogFunc = func(ctx context.Context, t time.Duration, sql string, result sql.Result, err error) {
log.Printf("[%.2fms] Execute SQL: %v", float64(t.Milliseconds()), sql)
}
// ...
)
ozzo-dbx 是一个功能强大且灵活的数据库操作库,特别适合需要跨数据库支持的项目。通过其丰富的功能和简洁的 API,可以大大简化 Go 语言中的数据库操作。
更多关于golang强大数据检索与跨数据库查询构建插件库ozzo-dbx的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang强大数据检索与跨数据库查询构建插件库ozzo-dbx的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
ozzo-dbx: Golang 强大的数据检索与跨数据库查询构建插件库
ozzo-dbx 是一个功能强大的 Golang 数据库扩展库,提供了丰富的查询构建功能,支持多种数据库系统,并简化了数据库操作流程。
主要特性
- 支持多种数据库:MySQL, PostgreSQL, SQLite, SQL Server 等
- 流畅的查询构建接口
- 支持关系映射和结构体绑定
- 事务支持
- 数据库连接池管理
- 轻量级且高性能
安装
go get github.com/go-ozzo/ozzo-dbx
基本使用
1. 数据库连接
import (
"github.com/go-ozzo/ozzo-dbx"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 连接MySQL数据库
db, err := dbx.Open("mysql", "user:pass@/example")
if err != nil {
panic(err)
}
defer db.Close()
// 也可以使用PostgreSQL
// db, err := dbx.Open("postgres", "user=postgres password=secret dbname=test")
}
2. 基本查询操作
// 查询单条记录
var user struct {
ID int
Name string
Email string
}
err := db.Select("id", "name", "email").
From("users").
Where(dbx.HashExp{"id": 1}).
One(&user)
// 查询多条记录
var users []struct {
ID int
Name string
}
err := db.Select("id", "name").
From("users").
Where(dbx.Like("name", "John%")).
All(&users)
// 插入数据
_, err := db.Insert("users", dbx.Params{
"name": "John",
"email": "john@example.com",
}).Execute()
// 更新数据
_, err := db.Update("users", dbx.Params{
"name": "John Doe",
}, dbx.HashExp{"id": 1}).Execute()
// 删除数据
_, err := db.Delete("users", dbx.HashExp{"id": 1}).Execute()
3. 高级查询构建
// 复杂条件查询
query := db.Select("u.id", "u.name", "p.title as post_title").
From("users u").
LeftJoin("posts p", dbx.NewExp("u.id = p.user_id")).
Where(dbx.And(
dbx.Like("u.name", "John%"),
dbx.NotIn("u.id", []int{2, 3, 5}),
dbx.Or(
dbx.HashExp{"p.status": "published"},
dbx.HashExp{"p.status": "draft"},
),
)).
OrderBy("u.name ASC", "p.created_at DESC").
Limit(10).
Offset(5)
var results []struct {
ID int
Name string
PostTitle string
}
err := query.All(&results)
4. 事务处理
err := db.Transactional(func(tx *dbx.Tx) error {
// 在事务中执行操作
_, err := tx.Insert("orders", dbx.Params{
"user_id": 1,
"amount": 100.50,
}).Execute()
if err != nil {
return err
}
_, err = tx.Update("users", dbx.Params{
"balance": dbx.NewExp("balance - 100.50"),
}, dbx.HashExp{"id": 1}).Execute()
return err
})
5. 结构体映射
ozzo-dbx 支持将查询结果直接映射到结构体:
type User struct {
ID int `db:"id"`
Name string `db:"name"`
Email string `db:"email"`
}
// 查询单个用户
var user User
err := db.Select().From("users").Where(dbx.HashExp{"id": 1}).One(&user)
// 查询多个用户
var users []User
err := db.Select().From("users").All(&users)
// 插入用户
user := User{Name: "John", Email: "john@example.com"}
_, err := db.Model(&user).Insert()
6. 跨数据库兼容性
ozzo-dbx 提供了一些方法来处理不同数据库之间的差异:
// 使用参数绑定而不是字符串拼接,防止SQL注入
query := db.Select().From("users").Where(dbx.HashExp{"name": "John"})
// 获取特定数据库的SQL
sql := query.SQL()
// 或者获取带参数的SQL
sql, params := query.Build()
// 数据库特定的表达式
if db.DriverName() == "mysql" {
query = query.Where(dbx.NewExp("DATE(created_at) = DATE(NOW())"))
} else if db.DriverName() == "postgres" {
query = query.Where(dbx.NewExp("DATE(created_at) = CURRENT_DATE"))
}
性能优化技巧
- 使用连接池:
db.DB().SetMaxOpenConns(25)
db.DB().SetMaxIdleConns(5)
db.DB().SetConnMaxLifetime(5 * time.Minute)
- 批量操作:
// 批量插入
_, err := db.Insert("users", dbx.Params{
"name": "User1",
"email": "user1@example.com",
}, dbx.Params{
"name": "User2",
"email": "user2@example.com",
}).Execute()
- 使用预处理语句:
stmt := db.NewQuery("SELECT * FROM users WHERE id={:id}")
var user User
err := stmt.Bind(dbx.Params{"id": 1}).One(&user)
ozzo-dbx 是一个功能强大且灵活的数据库工具库,特别适合需要构建复杂查询或需要支持多种数据库的应用程序。它的流畅接口设计使得代码更易读和维护,同时保持了高性能和安全性。