package db import ( "context" "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "gitlink.org.cn/cloudream/storage/common/pkgs/db/config" ) type DB struct { d *sqlx.DB } type SQLContext interface { sqlx.Queryer sqlx.Execer sqlx.Ext sqlx.Preparer NamedQuery(query string, arg interface{}) (*sqlx.Rows, error) NamedExec(query string, arg interface{}) (sql.Result, error) PrepareNamed(query string) (*sqlx.NamedStmt, error) } func NewDB(cfg *config.Config) (*DB, error) { db, err := sqlx.Open("mysql", cfg.MakeSourceString()) if err != nil { return nil, fmt.Errorf("open database connection failed, err: %w", err) } // 尝试连接一下数据库,如果数据库配置有错误在这里就能报出来 err = db.Ping() if err != nil { return nil, err } return &DB{ d: db, }, nil } func (db *DB) DoTx(isolation sql.IsolationLevel, fn func(tx *sqlx.Tx) error) error { tx, err := db.d.BeginTxx(context.Background(), &sql.TxOptions{Isolation: isolation}) if err != nil { return err } if err := fn(tx); err != nil { tx.Rollback() return err } if err := tx.Commit(); err != nil { tx.Rollback() return err } return nil } func (db *DB) SQLCtx() SQLContext { return db.d }