golang实现SQL、NoSQL和结构化文件数据存储连接的插件库dsc的使用
Golang实现SQL、NoSQL和结构化文件数据存储连接的插件库dsc的使用
动机
这个库是作为dsunit(数据存储单元测试库)的一部分开发的,旨在提供对SQL、NoSQL或任何其他以类似SQL方式处理结构化数据的存储的统一访问。
使用示例
以下是一个使用dsc进行CRUD操作的简单示例:
package main
import (
"github.com/viant/dsc"
"fmt"
)
// 定义Interest结构体
type Interest struct {
Id int
Name string
ExpiryTimeInSecond int
Category string
}
func main() {
// 创建MySQL配置
config := dsc.NewConfig("mysql", "[user]:[password]@[url]", "user:root,password:dev,url:tcp(127.0.0.1:3306)/mydb?parseTime=true")
factory := dsc.NewManagerFactory()
manager, err := factory.Create(config)
if err != nil {
panic(err.Error())
}
// 也可以从配置文件创建manager
// manager := factory.CreateFromURL("file:///etc/myapp/datastore.json")
// 读取单条记录
var interest Interest
id := 1
success, err := manager.ReadSingle(&interest, "SELECT id, name, expiry, category FROM interests WHERE id = ?", []interface{}{id}, nil)
if err != nil {
panic(err.Error())
}
fmt.Printf("Found interest: %v\n", interest)
// 读取所有记录
var interests = make([]Interest, 0)
err = manager.ReadAll(&interests, "SELECT id, name, expiry, category FROM interests", nil, nil)
if err != nil {
panic(err.Error())
}
fmt.Printf("All interests: %v\n", interests)
// 准备要插入/更新的数据
interests = []Interest{
{Name: "Abc", ExpiryTimeInSecond: 3600, Category: "xyz"},
{Name: "Def", ExpiryTimeInSecond: 3600, Category: "xyz"},
{Id: 20, Name: "Ghi", ExpiryTimeInSecond: 3600, Category: "xyz"},
}
// 持久化数据(插入或更新)
inserted, updated, err := manager.PersistAll(&interests, "interests", nil)
if err != nil {
panic(err.Error())
}
// 删除数据
deleted, err := manager.DeleteAll(&interests, "interests", nil)
if err != nil {
panic(err.Error())
}
fmt.Printf("Inserted %v, updated: %v, deleted: %v\n", inserted, updated, deleted)
}
安装
- 安装Go 1.5+并设置好环境
- 获取客户端库到你的GOPATH中:
go get github.com/viant/dsc
- 更新客户端库:
go get -u github.com/viant/dsc
测试
这个库包含了许多测试。运行测试前需要更新依赖:
$ go get .
运行所有测试用例(包含竞争检测):
$ go test
许可证
源代码基于Apache License, Version 2许可提供,详见LICENSE文件。
作者和贡献者
库作者: Adrian Witas
贡献者: Sudhakaran Dharmaraj
更多关于golang实现SQL、NoSQL和结构化文件数据存储连接的插件库dsc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现SQL、NoSQL和结构化文件数据存储连接的插件库dsc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 数据存储连接插件库 dsc 使用指南
dsc 是一个用于连接 SQL、NoSQL 和结构化文件数据存储的 Go 插件库,它提供了统一的接口来操作不同类型的数据库。
安装
go get github.com/viant/dsc
基本使用
1. 连接 SQL 数据库
package main
import (
"fmt"
"github.com/viant/dsc"
_ "github.com/go-sql-driver/mysql" // MySQL 驱动
)
func main() {
// 配置 MySQL 连接
config := dsc.NewConfig("mysql", "user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true", "")
// 创建管理器
manager, err := dsc.NewManagerFactory().Create(config)
if err != nil {
panic(err)
}
// 执行查询
var results []map[string]interface{}
success, err := manager.ReadAll(&results, "SELECT * FROM users WHERE id > ?", []interface{}{0}, nil)
if err != nil {
panic(err)
}
fmt.Printf("查询到 %d 条记录\n", success)
for _, row := range results {
fmt.Println(row)
}
}
2. 连接 NoSQL (MongoDB)
package main
import (
"fmt"
"github.com/viant/dsc"
"github.com/viant/dsc/mongo"
)
func main() {
// 配置 MongoDB 连接
config := dsc.NewConfigWithParameters("mongo", "mongodb://localhost:27017", "dbname", map[string]interface{}{
"collection": "users",
})
// 注册 MongoDB 驱动
dsc.Register("mongo", mongo.NewManagerFactory())
// 创建管理器
manager, err := dsc.NewManagerFactory().Create(config)
if err != nil {
panic(err)
}
// 插入文档
data := map[string]interface{}{
"name": "John Doe",
"email": "john@example.com",
}
_, err = manager.PersistSingle(data, "users", nil)
if err != nil {
panic(err)
}
// 查询文档
var results []map[string]interface{}
_, err = manager.ReadAll(&results, "SELECT * FROM users WHERE name = ?", []interface{}{"John Doe"}, nil)
if err != nil {
panic(err)
}
for _, doc := range results {
fmt.Println(doc)
}
}
3. 连接结构化文件 (CSV/JSON)
package main
import (
"fmt"
"github.com/viant/dsc"
"github.com/viant/dsc/file"
)
func main() {
// 配置 CSV 文件连接
config := dsc.NewConfigWithParameters("file", "/path/to/files", "", map[string]interface{}{
"fileFormat": "csv",
"extension": ".csv",
})
// 注册文件驱动
dsc.Register("file", file.NewManagerFactory())
// 创建管理器
manager, err := dsc.NewManagerFactory().Create(config)
if err != nil {
panic(err)
}
// 从 CSV 读取数据
var records []map[string]interface{}
_, err = manager.ReadAll(&records, "SELECT * FROM users.csv", nil, nil)
if err != nil {
panic(err)
}
for _, record := range records {
fmt.Println(record)
}
// 写入 JSON 文件
config = dsc.NewConfigWithParameters("file", "/path/to/files", "", map[string]interface{}{
"fileFormat": "json",
"extension": ".json",
})
manager, err = dsc.NewManagerFactory().Create(config)
if err != nil {
panic(err)
}
data := []map[string]interface{}{
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"},
}
_, err = manager.PersistAll(data, "output.json", nil)
if err != nil {
panic(err)
}
}
高级功能
事务处理
// 开始事务
tx, err := manager.Begin()
if err != nil {
panic(err)
}
// 执行事务操作
_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", []interface{}{100, 1})
if err != nil {
tx.Rollback()
panic(err)
}
_, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", []interface{}{100, 2})
if err != nil {
tx.Rollback()
panic(err)
}
// 提交事务
err = tx.Commit()
if err != nil {
panic(err)
}
批量操作
// 批量插入
var batchData []map[string]interface{}
for i := 0; i < 10; i++ {
batchData = append(batchData, map[string]interface{}{
"id": i,
"name": fmt.Sprintf("User%d", i),
})
}
_, err := manager.PersistAll(batchData, "users", nil)
if err != nil {
panic(err)
}
配置选项
dsc 支持多种配置选项,可以通过 map[string]interface{}
传递:
config := dsc.NewConfigWithParameters("mysql", "user:password@tcp(127.0.0.1:3306)/dbname", "", map[string]interface{}{
"maxIdleConns": 10,
"maxOpenConns": 100,
"dialect": "mysql",
})
总结
dsc 库提供了统一的接口来操作多种数据存储,包括:
- SQL 数据库 (MySQL, PostgreSQL, SQLite 等)
- NoSQL 数据库 (MongoDB)
- 结构化文件 (CSV, JSON)
通过统一的 API,开发者可以更容易地在不同数据存储之间切换,同时保持代码的一致性。dsc 还支持事务、批量操作等高级功能,适合构建复杂的数据处理应用。
注意:在实际使用时,请根据具体需求调整连接参数和错误处理逻辑。