美文网首页
go操作数据库

go操作数据库

作者: 小安静子 | 来源:发表于2022-03-21 12:51 被阅读0次

    对于许多Web应用程序而言,数据库都是其核心所在,数据库几乎可以用来存储你想查询和修改的任何信息。

    但是Go本身没有内置任何的驱动来操作数据库,但是 Go 内置 database/sql,里面定义了一些接口,用于可以根据接口开发相应数据库的驱动。比如:MySQL、PostgreSQL是不同的数据库,但是我们都可以使用 database/sql 进行操作。常见的数据库驱动如下:

    Mysql: https://github.com/go-sql-driver/mysql
    MyMysql: https://github.com/ziutek/mymysql
    Postgres: https://github.com/lib/pq
    Tidb: https://github.com/pingcap/tidb
    SQLite: https://github.com/mattn/go-sqlite3
    MsSql: https://github.com/denisenkom/go-mssqldb
    Oracle: https://github.com/mattn/go-oci8
    这里我们就使用PostgreSQL进行演示。
    连接数据库
    要想使用Go操作PostgreSQL,那么首先要和数据库之间建立连接,得到DB对象。

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

    database/sql 是 Go 的标准库之一,它提供了一系列接口方法,用于访问关系数据库。它并不会提供数据库特有的方法,那些特有的方法会交给具体的数据库驱动去实现。

    我们正在加载的驱动是匿名的,导入之后该驱动会自行初始化并注册到 Go 的 database/sql 上下文中,因此我们就可以 database/sql 包提供的方法去访问数据库了.
    下面是建立连接,建立连接的话使用 sql.Open 函数:

    func Open(driverName, dataSourceName string) (*DB, error) {
        /*
        driverName: 这个名字就是数据库驱动注册到 database/sql 时所使用的名字
                   如果是MySQL数据库的话, 那么就是"mysql"; 如果是PostgreSQL数据库的话, 那么就是"postgres";
        dataSourceName: 数据库的连接信息, 这个连接包括了数据库的用户名、密码、数据库主机以及连接的数据库名等信息
                       用户名:密码@协议(地址:端口)/数据库?参数=参数值
                       
        db, err := sql.Open("postgres", "postgres:zgghyys123@tcp(localhost:5432)/postgres")
        */
    }
    

    代码演示一下:

    package main
    
    import (
        "database/sql"
        "fmt"
        _ "github.com/lib/pq"
    )
    
    func main() {
        // 这里的open函数只是验证参数是否合法, 不会创建和数据库的连接; 得到的仅仅是一个sql.DB对象, 当进行数据库查询的时候才会建立网络连接
        // sql.DB 表示操作数据库的抽象接口, 但不是所谓的数据库连接对象, 它只有在需要使用时才会创建连接
        // 注意: dataSourceName结尾的 sslmode=disable, 如果没有的话会报错: pq: SSL is not enabled on the server
        db, err := sql.Open("postgres", "postgres://postgres:zgghyys123@127.0.0.1:5432/postgres?sslmode=disable")
        if err != nil {
            panic(err)
        }
        // 记得关闭连接, 这里使用defer, 由于该函数返回一个error, 所以我们放在匿名函数中
        defer func() {_ = db.Close()}()
    
        // 如果要立刻检测数据库源是否能连接到指定的数据库, 需要调用返回值的Ping方法
        fmt.Println(db.Ping()) // <nil>
        // 打印nil证明没有错误
    }
    

    现在来看看go是如何操作mysql的

    1. 安装驱动
    go get github.com/go-sql-driver/mysql
    
    1. 导入需要的库
    import (
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
    )
    
    1. 连接数据库
    func main() {
        //"用户名:密码@[连接方式](主机名:端口号)/数据库名"
        db, _ := sql.Open("mysql", "root:123456@(localhost)/world") // 设置连接数据库的参数
        defer db.Close()                                            //关闭数据库
        err := db.Ping()                                            //连接数据库
        if err != nil {
            fmt.Println("数据库连接失败")                             //连接失败
            return
        } else {
            fmt.Println("数据库连接成功")                             //连接成功
        }
    
    
    1. 查询表
    rows, _ := db.Query("select * from city") //获取city表所有数据
        var ID, Population int
        var Name, CountryCode, District string
        for rows.Next() { //循环显示所有的数据
            rows.Scan(&ID, &Name, &CountryCode, &District, &Population)
            fmt.Println(ID, "--", Name, "--", CountryCode, "--", District, "--", Population)
        }
    
    1. 全部代码:
    package main
    
    import (
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
    )
    
    func main() {
        //"用户名:密码@[连接方式](主机名:端口号)/数据库名"
        db, _ := sql.Open("mysql", "root:123456@(localhost)/world") // 设置连接数据库的参数
        defer db.Close()                                            //关闭数据库
        err := db.Ping()                                            //连接数据库
        if err != nil {
            fmt.Println("数据库连接失败")
            return
        } else {
            fmt.Println("数据库连接成功")
        }
    
        //多行查询
        rows, _ := db.Query("select * from city") //获取所有数据
        var ID, Population int
        var Name, CountryCode, District string
        for rows.Next() { //循环显示所有的数据
            rows.Scan(&ID, &Name, &CountryCode, &District, &Population)
            fmt.Println(ID, "--", Name, "--", CountryCode, "--", District, "--", Population)
        }
    }
    
    1. 拓展
    //操作一:执行数据操作语句
    
        sql:="insert into stu values (2,'berry')"
        result,_:=db.Exec(sql)      //执行SQL语句
        n,_:=result.RowsAffected(); //获取受影响的记录数
        fmt.Println("受影响的记录数是",n)
    
    //操作二:执行预处理
    
        stu:=[2][2] string{{"3","ketty"},{"4","rose"}}
        stmt,_:=db.Prepare("insert into stu values (?,?)")      //获取预处理语句对象
        for _,s:=range stu{
            stmt.Exec(s[0],s[1])            //调用预处理语句
        }
    
    //操作三:单行查询
    
        var id,name string
        rows:=db.QueryRow("select * from stu where id=4")   //获取一行数据
        rows.Scan(&id,&name)        //将rows中的数据存到id,name中
        fmt.Println(id,"--",name)
    

    相关文章

      网友评论

          本文标题:go操作数据库

          本文链接:https://www.haomeiwen.com/subject/eiigdrtx.html