easydb

package module
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 21, 2026 License: MIT Imports: 10 Imported by: 1

README

简介

简单的Go数据库接口程序。对 database/sql 标准库和各数据库驱动进行封装,使用通用接口操作数据库,无需关心底层差异。

  1. 轻量极简,没有过多依赖包袱。数据驱动仅在使用时,显式声明,按需导入。
  2. 兼容性极佳,支持大多数数据库,如MySQL、PostgreSQL、SQLite、SQL Server、Oracle等。
  3. 仅在官方库基础上做轻量级封装,摆脱ORM等框架束缚,回归底层,重新找回对数据库的掌控。

各数据库驱动实现

  • MySQL:github.com/go-sql-driver/mysql
  • PostgreSQL:github.com/lib/pq
  • SQLite:github.com/mattn/go-sqlite3
  • SQL Server:github.com/denisenkom/go-mssqldb
  • Oracle: github.com/godror/godror
  1. 数据库连接:
	import (
	"github.com/iotames/easydb"
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	_ "github.com/lib/pq"
	)
func main() {
	d1 := easydb.NewEasyDb("mysql", "127.0.0.1", "root", "password", "testdb", 3306)
	d2 := easydb.NewEasyDb("postgres", "127.0.0.1", "username", "password", "testdb", 5432)
	// 测试连接d1
	if err := d1.Ping(); err != nil {
		log.Fatal(err)
	}
	// 关闭整个d1连接池
	defer d1.CloseDb()
	// 测试连接d2
	if err := d2.Ping(); err != nil {
		log.Fatal(err)
	}
	// 关闭整个d2连接池
	defer d2.CloseDb()

	// 用原始的DSN数据源字符串,创建数据库操作对象
	var sqldb *sql.DB
	var err error
	// sqldb, err := sql.Open("sqlite3", "./mydb.sqlite")
	// sqldb, err = sql.Open("postgres", "user=postgres password=secret dbname=dbname host=127.0.0.1 port=5432 sslmode=disable search_path=myschema")
	sqldb, err = sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
	if err != nil {
		panic(err)
	}
	// 创建数据库操作对象
	d := easydb.NewEasyDbBySqlDB(sqldb)
	// 测试连接d
	if err := d.Ping(); err != nil {
		log.Fatal(err)
	}
	// 关闭整个d连接池
	defer d.CloseDb()
}
  1. 执行SQL语句,写入数据
import (
	"github.com/iotames/easydb"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
	d := easydb.NewEasyDb("mysql", "127.0.0.1", "root", "password", "testdb", 3306)
	// 创建数据表
	sqlCreateTable := `CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        name VARCHAR(50),
        age INT,
		wallet_balance DECIMAL(10,2) DEFAULT 0.00
    )`
	_, err = d.Exec(sqlCreateTable)
	if err != nil {
		fmt.Println("Error creating table:", err)
	}

	// 插入数据
	for i := 1; i <= 5; i++ {
		_, err = d.Exec("INSERT INTO users (name, age, wallet_balance) VALUES ($1, $2, $3)", fmt.Sprintf("Hankin%d", i), i, float64(i*10))
		if err != nil {
			fmt.Println("Error inserting data:", err)
		}
	}
}
  1. 获取数据

type User struct {
	ID            int     `db:"id"`
	Name          string  `db:"name"`
	Age           int     `db:"age"`
	WalletBalance float64 `db:"wallet_balance"`
}

func main() {
	d := easydb.NewEasyDb("postgres", "127.0.0.1", "username", "password", "testdb", 5432)
	// 获取一条数据,传入字典或字典的指针
	data := make(map[string]interface{})
	d.GetOneData("SELECT id, name, age, wallet_balance FROM $1", data, "users")
	// 传字典的指针亦可
	// d.GetOneData("SELECT id, name, age, wallet_balance FROM $1", &data, "users")

	// 获取一条数据,传入结构体指针
	user := User{}
	d.GetOneData("SELECT id, name, age, wallet_balance FROM users ORDER BY id DESC", &user)
	
	fmt.Printf("-----GetOneData--data(%+v)--user(%+v)--\n", data, user)

	// 获取多条数据,传入字典的切片的指针
	var datalist []map[string]interface{}
	d.GetMany("SELECT id, name, age, wallet_balance FROM users", &datalist)
	fmt.Printf("-----GetMany--result(%+v)----\n", datalist)

    // 获取多条数据,传入结构体的切片的指针
	var users []User
	err := d.GetMany("SELECT id, name, age, wallet_balance FROM users", &users)
	if err != nil {
		fmt.Println("Error getting data:", err)
		return
	}
	for i, user := range users {
		fmt.Printf("---GetMany--row(%d)---result(%+v)----\n", i, user)
	}

}

Documentation

Index

Constants

View Source
const DSN_TPL_MYSQL = "DB_USER:DB_PASSWORD@tcp(DB_HOST:DB_PORT)/DB_NAME"
View Source
const DSN_TPL_POSTGRES = "user=DB_USER password=DB_PASSWORD dbname=DB_NAME host=DB_HOST port=DB_PORT sslmode=disable"
View Source
const DSN_TPL_SQLITE = "DB_NAME.db"

Variables

This section is empty.

Functions

func GetPlaceholder

func GetPlaceholder(dbType string, index int) string

getPlaceholder 生成参数占位符 mysql, sqlite 的参数占位符是?. postgres则是 $1, $2, $3 ...

func SetEasyDb

func SetEasyDb(edb *EasyDb)

SetEasyDb 设置EasyDb数据库连接单例 使用NewEasyDbBySqlDB 或 NewEasyDb方法,初始化EasyDb数据库连接实例。然后通过此函数设置单例

Types

type DsnConf added in v0.1.0

type DsnConf struct {
	DriverName                         string
	DbHost, DbUser, DbPassword, DbName string
	DbPort                             int
	// contains filtered or unexported fields
}

func NewDsnConf added in v0.1.0

func NewDsnConf(driverName, dbHost, dbUser, dbPassword, dbName string, dbPort int) *DsnConf

NewDsnConf 创建DsnConf实例,包含常用数据库的dsn模板。 If you need to add more database drivers, please use AddDsnTpl method to add dsn template after creating DsnConf instance. 示例:

import (
"github.com/iotames/easydb"
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
)
cf1 := easydb.NewDsnConf("mysql", "127.0.0.1", "root", "password", "testdb", 3306)
// 可选:cf1.UpdateDsnTpl("mysql", "DB_USER:DB_PASSWORD@tcp(DB_HOST:DB_PORT)/DB_NAME?charset=utf8mb4&parseTime=True&loc=Local")
dbmysql := easydb.NewEasyDbByConf(*cf1)
cf2 := easydb.NewDsnConf("postgres", "127.0.0.1", "username", "password", "testdb", 5432)
// 可选:cf2.UpdateDsnTpl("postgres", "user=DB_USER password=DB_PASSWORD dbname=DB_NAME host=DB_HOST port=DB_PORT sslmode=disable search_path=public")
dbpg := easydb.NewEasyDbByConf(*cf2)

func (*DsnConf) AddDsnTpl added in v0.1.0

func (cf *DsnConf) AddDsnTpl(driverName, dsnTpl string) error

AddDsnTpl 添加新的dsn模板 If the driverName already exists, it returns an error. 示例:

// test.db是dbName参数,填sqlite3的文件名,可以换成绝对路径
cf := easydb.NewDsnConf("sqlite3", "", "", "", "testdb", 0)
err := cf.AddDsnTpl("sqlite3", "DB_NAME.db")

func (DsnConf) CheckAvailable added in v0.1.0

func (cf DsnConf) CheckAvailable() bool

CheckAvailable 检查当前系统是否支持该数据库驱动

func (DsnConf) GetAvailableDsnTplMap added in v0.1.0

func (cf DsnConf) GetAvailableDsnTplMap() map[string]string

GetAvailableDsnTplMap 获取当前系统支持的数据库驱动及其对应的dsn模板

func (DsnConf) GetDsn added in v0.1.0

func (cf DsnConf) GetDsn() (string, error)

GetDsn 生成dsn字符串

func (DsnConf) GetDsnTpl added in v0.1.0

func (cf DsnConf) GetDsnTpl() (string, error)

GetDsn 获取dsn字符串模板

func (*DsnConf) UpdateDsnTpl added in v0.1.0

func (cf *DsnConf) UpdateDsnTpl(driverName, dsnTpl string) error

UpdateDsnTpl 更新已存在的dsn模板 If the driverName does not exist, it returns an error. 示例:

cf := easydb.NewDsnConf("postgres", "127.0.0.1", "username", "password", "testdb", 5432)
cf.UpdateDsnTpl("postgres", "user=DB_USER password=DB_PASSWORD dbname=DB_NAME host=DB_HOST port=DB_PORT sslmode=disable search_path=public")

type EasyDb

type EasyDb struct {
	// contains filtered or unexported fields
}

func GetEasyDb

func GetEasyDb() *EasyDb

GetEasyDb 获取EasyDb数据库连接单例

func NewEasyDb

func NewEasyDb(driverName, dbHost, dbUser, dbPassword, dbName string, dbPort int) *EasyDb

NewEasyDb 初始化EasyDb数据库连接实例。 driverName See https://golang.org/s/sqldrivers for a list of third-party drivers.

示例:

import (
"github.com/iotames/easydb"
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
)
d := easydb.NewEasyDb("mysql", "127.0.0.1", "root", "password", "testdb", 3306)
d1 := easydb.NewEasyDb("postgres", "127.0.0.1", "username", "password", "testdb", 5432)

func NewEasyDbByConf added in v0.1.0

func NewEasyDbByConf(cf DsnConf) *EasyDb

NewEasyDbByConf 使用DsnConf参数初始化EasyDb实例。 示例:

import (
"github.com/iotames/easydb"
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
)
cf := easydb.NewDsnConf("mysql", "127.0.0.1", "root", "password", "testdb", 3306)
// 可选:cf.UpdateDsnTpl("mysql", "DB_USER:DB_PASSWORD@tcp(DB_HOST:DB_PORT)/DB_NAME?charset=utf8mb4&parseTime=True&loc=Local")
dbmysql := easydb.NewEasyDbByConf(*cf)
cfpg := easydb.NewDsnConf("postgres", "127.0.0.1", "username", "password", "testdb", 5432)
// 可选:cfpg.UpdateDsnTpl("postgres", "user=DB_USER password=DB_PASSWORD dbname=DB_NAME host=DB_HOST port=DB_PORT sslmode=disable search_path=public")
dbpg := easydb.NewEasyDbByConf(*cfpg)

func NewEasyDbBySqlDB

func NewEasyDbBySqlDB(sqldb *sql.DB) *EasyDb

NewEasyDbBySqlDB 使用sqldb *sql.DB参数初始化EasyDb实例。

各数据库驱动:https://golang.org/s/sqldrivers

import (
"github.com/iotames/easydb"
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3"
)

sqldb, err = sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/debugdb")
//  sqldb, err = sql.Open("postgres", "user=postgres password=postgres dbname=postgres host=127.0.0.1 port=5432 sslmode=disable search_path=public")
//  sqldb, err := sql.Open("sqlite3", "./mydb.sqlite")
d := NewEasyDbBySqlDB(sqldb)

func (*EasyDb) CloseDb

func (d *EasyDb) CloseDb() error

CloseDb 关闭整个数据库连接池

func (EasyDb) DecodeInterface

func (d EasyDb) DecodeInterface(data map[string]interface{}) map[string]interface{}

DecodeInterface 用于解码GetOneData方法返回的结果 data 参数类型实际是 map[string][]byte 示例:

data := make(map[string]interface{}, 3)
d.GetOneData("SELECT id, name, age, wallet_balance FROM $1", &data, "users")
fmt.Printf("-----GetOneData--result(%+v)----\n", d.DecodeInterface(data))

func (*EasyDb) Exec

func (d *EasyDb) Exec(query string, args ...interface{}) (sql.Result, error)

Exec 重写Exec方法以记录SQL查询

func (*EasyDb) ExecByFile

func (d *EasyDb) ExecByFile(filepath string, args ...interface{}) (sql.Result, error)

ExecByFile 从文件执行SQL脚本

func (*EasyDb) ExecInsert

func (d *EasyDb) ExecInsert(tableName string, columns []string, values []interface{}) error

ExecInsert 执行单条插入语句

func (*EasyDb) ExecSqlWithTransaction

func (d *EasyDb) ExecSqlWithTransaction(sqlStatements []string) error

ExecSqlWithTransaction 在事务中执行多条SQL语句

func (*EasyDb) ExecUpdateByValues

func (d *EasyDb) ExecUpdateByValues(tableName string, columns []string, values []interface{}, whereClause string, whereValues []interface{}) error

ExecUpdate 执行更新语句 tableName: 表名 columns: 要更新的列名 values: 要更新的值 whereClause: WHERE子句。例如:"id = $1" whereValues: WHERE子句中的参数值。例如:[]interface{}{1}

func (*EasyDb) GetMany

func (d *EasyDb) GetMany(querySQL string, dest interface{}, args ...interface{}) error

GetMany 根据where条件查询多条数据 querySQL SQL查询语句 dest: 用于接收结果的切片的指针 args: SQL参数 示例:

var datalist []map[string]interface{}
d.GetMany("SELECT id, name, age, wallet_balance FROM users", &datalist)

func (*EasyDb) GetOne

func (d *EasyDb) GetOne(querySQL string, dest []interface{}, args ...interface{}) error

GetOne 根据where条件查询单条数据 querySQL SQL查询语句 args: SQL参数 dest: 用于接收结果的结构体指针 示例:

var qrid *int
var qrToUrl *string
GetOne("select id, to_url from qr_list where code = $1", []interface{}{qrid, qrToUrl}, "codexxx")

func (*EasyDb) GetOneData

func (d *EasyDb) GetOneData(querySQL string, dest interface{}, args ...interface{}) error

GetOneData 根据where条件查询单条数据,支持结构体指针或map接收结果 querySQL SQL查询语句 例:select field1, field2 from table1 where name = $1 and status = $2 dest: 用于接收结果的结构体指针或map[string]any, *map[string]any args: SQL参数 示例:

data := make(map[string]interface{}, 3)
d.GetOneData("SELECT id, name, age, wallet_balance FROM $1", data, "users")
// 传指针亦可 d.GetOneData("SELECT id, name, age, wallet_balance FROM $1", &data, "users")
fmt.Printf("-----GetOneData--result(%+v)----\n", data)

func (*EasyDb) GetSqlDB added in v0.4.0

func (d *EasyDb) GetSqlDB() *sql.DB

GetSqlDB 获取*sql.DB实例

func (*EasyDb) Ping

func (d *EasyDb) Ping() error

func (*EasyDb) Query

func (d *EasyDb) Query(query string, args ...interface{}) (*sql.Rows, error)

Query 重写Query方法以记录SQL查询

func (*EasyDb) QueryRow

func (d *EasyDb) QueryRow(query string, args ...interface{}) *sql.Row

QueryRow 重写QueryRow方法以记录SQL查询

func (*EasyDb) SowLog added in v0.4.0

func (d *EasyDb) SowLog(level int)

SowLog 展示运行日志。默认0为不展示。数值越大越详细。

Directories

Path Synopsis
sql

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL