Go·链接PostGresSQL 操作增删查改

Go·链接PostGresSQL 操作增删查改

共性:sql语句使用反斜杠 “包裹 里面语句即可使用双引号来查询,实现PgSQL字段的大小区分

报错无效地址或无效指针:解决方式 在可能报错的 结构体属性字段 使用(*)星号指针

例如:

type User struct { //用户结构体
    Id     *int    `json:"id"`     // 用户id
    Name   *string `json:"name"`   // 用户名称
    Img    string `json:"img"`    // 用户头像图片
}

Golang·链接PostGresSQL 操作数据库
0】项目下确保存在 go.mod 和 go.sum 文件没有则运行 go mod init test 生成(test为项目文件夹名)
1】项目下终端载入数据库连接驱动 go get github.com/lib/pq
2】项目里引入驱动

import (
    "database/sql"
    _ "github.com/lib/pq"
)

3】链接数据库 例子

var DB *sql.DB

func DbOpen() { //数据库链接
    var err error

    sqlinfo := "host=127.0.0.1 port=5432 user=数据库名称 password=数据库密码 dbname=数据表名 sslmode=disable"
    // sqlinfo数据库信息 host=数据库iP地址 port=端口号 user=数据库用户名 password=数据库密码 dbname=数据库表名 sslmode=安全模式disable (disable/verify-full/verify-ca)
    // 以上配置 PgSQL数据库 表 必须在 默认模式的 public中,github.com/lib/pq 驱动无指定模式,解决办法是在sql语句中使用 schemaName.tableName 来指定要访问的模式
    // 模式访问如: SELECT id, name, text FROM xx数据库名.xx模式名称.xx表名 或 SELECT id, name, text FROM xx模式名称.xx表名

    DB, err = sql.Open("postgres", sqlinfo)
    if err != nil {
        log.Panicln("PgSQL链接失败")
        panic(err)
    } else {
        fmt.Println("链接成功")
    }
    defer DB.Close() //延伸关闭数据库 必须关闭Db.Close关闭数据库 否则并发连接池过大,请求超50次会导致数据库宕机404或502

///查询 多条
    rows, err := DB.Query("SELECT id, blok, name, text FROM weixin.life_menu ") // SQL语句:查询 id blok name text 在weixin模式的life_menu表
    if err != nil {                                                                    //异常打印
        panic(err)
    }

    var ArrMenu []Life_Menu
    for rows.Next() { //循环存储列表
        var menu Life_Menu
        err := rows.Scan(&menu.Id, &menu.Blok, &menu.Name, &menu.Text)
        if err != nil { //异常处理
            fmt.Println("异常处理:", err.Error())
        }
        fmt.Println(menu)               //打印结果
        ArrMenu = append(ArrMenu, menu) //存入数组
    }
    
}

type Life_Menu struct { //菜单结构
    Id         int
    Type       string //类型
    Name       string //名称
    Text       string //提示内容
}

封装数据库接口方法涵

// 封装数据库接口方法涵 //引用方式:var DB = DBsql()
func DBsql() *sql.DB {
    sqlinfo := "host=127.0.0.1 port=5432 user=数据库名称 password=数据库密码 dbname=数据表名 sslmode=disable"
    DB, err := sql.Open("postgres", sqlinfo)
    if err != nil {
        log.Panicln("PgSQL链接失败")
        panic(err)
    }
    //引用方式:var DB = DBsql() rows := DB.QueryRow(sql语句)
    return DB
}

4】查询多条

func QueryMenu() string { //查询数据
    sql := "SELECT id, name, text FROM weixin.life_menu" //SELECT * FROM 模式名.表名
    var DB = DBsql()
    rows, err := DB.Query(sql) // SQL语句:查询 id name text 在weixin模式的life_menu表
    if err != nil {            //异常打印
        panic(err)
    }
    defer DB.Close() //关闭数据库

    /*  */

    var ArrMenu []Life_Menu
    for rows.Next() { //循环存储列表
        var menu Life_Menu
        err := rows.Scan(&menu.Id, &menu.Blok, &menu.Name, &menu.Text)
        if err != nil { //异常处理
            log.Println("异常处理:", err.Error())
        }
        fmt.Println(menu)               //打印结果
        ArrMenu = append(ArrMenu, menu) //存入数组
    }

    rows.Close() //关闭
    return "ArrMenu"
}

5】查询单条

 var menu Life_Menu
   err := DB.QueryRow("SELECT id,name, text FROM weixin.life_menu WHERE id='1' ").Scan(&menu.Id, &menu.Name, &menu.Text)  // SQL语句
    if err != nil { //异常打印
        panic(err)
    } 

   //Scan 存储结果, 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
    fmt.Println(menu) //打印结果

6】更新数据

 rows, err := DB.Exec("UPDATE weixin.life_menu SET blok= '111', name= '222', text= '333' WHERE id='1' ") // SQL语句:查询 id blok name text 在weixin模式的life_menu表
    if err != nil {  //异常打印                                                                                        //异常打印
        panic(err)
    }
    
    fmt.Println("执行结果:", rows) //打印结果

7】插入数据

//rows, err := DB.Exec("INSERT INTO weixin.life_menu (blok,name,text)VALUES('box','name11','text1') ") // SQL语句:查询 id blok name text 在weixin模式的life_menu表
   //方式二
     var id string
    err = DB.QueryRow("INSERT INTO weixin.life_menu (blok,name,text)VALUES('box11','name11','text11') RETURNING id ").Scan(&id) // SQL语句 Scan 接收返回id
    if err != nil { //异常打印
        panic(err)
    }
    fmt.Println("执行结果:", id) //打印返回id结果

8】删除数据

rows, err := DB.Exec("DELETE FROM weixin.life_menu WHERE id=21 ") // SQL语句说明:weixin模式的life_menu表
    if err != nil { //异常打印
        panic(err)
    }
    fmt.Println("执行结果:", rows) //打印结果

最后 多个地方调用 需要自行封装成方法涵

无法做夸 DB *sql.DB 模式 只能封装成方法涵

//引用方式:var DB = DBsql()

//rows := DB.QueryRow(sql语句)

317 Views
分享你的喜爱
linwute
linwute

我要像梦一样自由,像大地一样宽容;
在艰辛放逐的路上,点亮生命的光芒;
我要像梦一样自由,像天空一样坚强;
在曲折蜿蜒的路上,体验生命的意义;

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注