最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 从Mysql服务器读取数据

    从mysql服务器读取数据

    导入所需的包,然后准备一个与数据库中tb_student表的示例具有相同架构的结构体,稍后该结构体将用作查询结果数据类型的容器。

    package main
    import "fmt"
    import "database/sql"
    import _ "github.com/go-sql-driver/mysql"
    
    
    type student struct {
     id string,
     name string,
     age int,
     grade int,
    }
    
    

    使用的数据库驱动需要使用_号导入,因为尽管database/sql包需要它,但我们并不直接与驱动交互。

    接下来,创建一个连接数据库的函数。

    func connect() (*sql.db, error) {
     db, err := sql.open("mysql","root:@tcp(127.0.0.1:3306)/db_learn_go")
     if err != nil {
      return nil, err
     }
     return db, nil
    }
    

    我们使用的mysql驱动的连接字符串方案非常独特,下面的root@tcp(127.0.0.1:3306)/db_learn_go是一个可以在go mysql driver驱动上使用的连接字符串方案,如果你使用另一个mysql ,根据所使用的驱动程序,连接方案可能会有所不同。

    user:password@tcp(host:port)/dbname
    user@tcp(host:port)/dbname
    

    下面是对 connect() 函数中使用的连接字符串的解释。

    root@tcp(127.0.0.1:3306)/db_learn_go
    // user => root
    // password =>
    // host => 127.0.0.1 atau localhost
    // port => 3306
    // dbname => db_learn_go
    

    连接数据库的功能创建完成后,就可以练习从数据库服务器读取数据的过程了。准备函数
    sqlquery() 具有以下代码。

    func sqlQuery() {
     db, err := connect()
     if err != nil {
     fmt.Println(err.Error())
     return
     }
     defer db.Close()
     var age = 27
     rows, err := db.Query("select id, name, grade from tb_student where age = ?
     if err != nil {
     fmt.Println(err.Error())
     return
     }
     defer rows.Close()
     var result []student
     for rows.Next() {
     var each = student{}
     var err = rows.Scan(&each.id, &each.name, &each.grade)
     if err != nil {
     fmt.Println(err.Error())
     return
     }
     result = append(result, each)
     }
     if err = rows.Err(); err != nil {
     fmt.Println(err.Error())
     return
     }
     for _, each := range result {
     fmt.Println(each.name)
     }
    }
    

    每次创建新连接时,不要忘记始终关闭连接实例。您可以使用 defer 关键字,如上面的代码所示,defer
    db.close() .
    db.query()函数用于执行sql查询。该函数的第二个参数是可变参数,因此可以留空。在上面的代码中,您可以看到其中一个where子句的值为问号(?)。

    该符号将被其后面的参数中的值(年龄变量的值)替换。强烈推荐这种类型的查询编写技术,以防止 sql 注入。该函数生成一个 sql.*rows 类型的实例,当不再使用时也需要将其关闭( defer rows.close() )。接下来,准备一个元素类型为 struct student 且名称为 result 的数组。稍后查询结果将存储在变量中。然后执行循环,条件引用为 rows.next() 。该循环执行的次数与记录总数相同,从第一条记录到最后一条记录依次执行。 sql.rows 的 scan() 方法用于检索正在迭代的记录的值,并将其存储在指针变量中。根据查询中选择的字段,用于存储记录字段的变量被顺序写入为可变参数。请参阅下面的比较以了解更多详细信息。 // 查询
    选择id、姓名、年级…
    // 扫描
    rows.scan(&each.id, &each.name, &each.grade …
    然后将获得的记录数据通过语句附加到结果切片中
    结果 = 附加(结果,每个).
    好的,现在只需在 main 中调用 sqlquery() 函数,然后运行程序即可。

    func main() {
    sqlquery()
    }

    我只是一个普通的博客作者。如果还有太多不足之处还请见谅

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 从Mysql服务器读取数据
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情