1 Star 0 Fork 0

jpdmd / 个人工具集

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
pg.go 2.64 KB
一键复制 编辑 原始数据 按行查看 历史
jpdmd 提交于 2024-04-08 10:08 . 1
package pg
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
type Conn struct {
*sql.DB
}
// Open(主机地址,端口号(int),用户名,密码,数据库名)
// 自带Ping()尝试连接数据库
func Open(host string, port int, user string, passwd string, dbname string) (db Conn, err error) {
constr := fmt.Sprintf("host=%s port=%d user=%s dbname=%s sslmode=disable password=%s", host, port, user, dbname, passwd)
db.DB, err = sql.Open("postgres", constr)
if err != nil {
return db, err
}
if err := db.Ping(); err != nil {
return db, err
}
return db, nil
}
// Query返回一个map[string]any的切片,[]byte已经转为string
func (db *Conn) Query(sql string, args ...any) (result []map[string]any, err error) {
// 查询
rows, err := db.DB.Query(sql, args...)
if err != nil {
return result, err
}
//获取列名
cols, err := rows.Columns()
if err != nil {
return result, err
}
// 获取一共有多少列
n := len(cols)
// 因为go的...语法的原因,使用一个切片保存另一个切片中元素的地址
row := make([]any, n)
prow := make([]any, n)
for i := range row {
prow[i] = &row[i]
}
// 将查询结果写入切片
for rows.Next() {
result_map := make(map[string]any)
if err := rows.Scan(prow...); err != nil {
return result, err
}
// 将结果写入map,固定结果的对应关系
for i := range cols {
switch v := row[i].(type) {
case []byte:
result_map[cols[i]] = string(v)
default:
result_map[cols[i]] = row[i]
}
}
// 将一行结果写入最后的结果集
result = append(result, result_map)
}
return result, nil
}
// 同Query,仅返回第一行结果。
func (db *Conn) QueryRow(sql string, args ...any) (result map[string]any, err error) {
rows, err := db.DB.Query(sql, args...)
if err != nil {
return result, nil
}
//获取列名
cols, err := rows.Columns()
if err != nil {
return result, err
}
// 获取一共有多少列
n := len(cols)
// 因为go的...语法的原因,使用一个切片保存另一个切片中元素的地址
row := make([]string, n)
prow := make([]any, n)
for i := range row {
prow[i] = &row[i]
}
result = make(map[string]any)
if rows.Next() {
rows.Scan(prow...)
for i := range cols {
result[cols[i]] = row[i]
}
}
return result, nil
}
// 直接调用的DB.Exec,未做处理。
// TODO 考虑将返回改为仅error,考虑因素,是否有时会使用到sql.Result
func (db *Conn) Exec(sql string, args ...any) (sql.Result, error) {
return db.DB.Exec(sql, args...)
}
// 可能会用到的Close
// 直接调用DB.Close(),未做处理。
func (db *Conn) Close() (err error) {
return db.DB.Close()
}
Go
1
https://gitee.com/jpdmd/goutils.git
git@gitee.com:jpdmd/goutils.git
jpdmd
goutils
个人工具集
v0.0.7

搜索帮助

53164aa7 5694891 3bd8fe86 5694891