代码拉取完成,页面将自动刷新
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()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。