V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
buseni
V2EX  ›  问与答

golang 的数据库操作感觉不怎么好,哎, PHP 直接 mysql_query mysql_fetch_array()简单粗暴多好

  •  
  •   buseni · 2017-03-02 18:34:02 +08:00 · 3695 次点击
    这是一个创建于 2817 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用的这个 github.com/go-sql-driver/mysql 我用 select * from tablename,查询出来, Scan 函数呢,还需要自己定义所查询的变量,然后存储结果集,另外一种方法,还需要自己定义中转


    //循环输出结果集
    //for rows.Next() {
    // var id int
    // var username string
    // err = rows.Scan(&id, &username) //Scan 此函数真的很不爽
    // checkErr(err)
    // fmt.Println(id)
    // fmt.Println(username)
    //
    //}

    //字典类型
    //构造 scanArgs 、 values 两个数组, scanArgs 的每个值指向 values 相应值的地址
    columns, _ := rows.Columns()
    scanArgs := make([]interface{}, len(columns))
    values := make([]interface{}, len(columns))
    for i := range values {
    scanArgs[i] = &values[i]
    }

    for rows.Next() {
    //将行数据保存到 record 字典
    err = rows.Scan(scanArgs...)
    record := make(map[string]string)
    for i, col := range values {
    if col != nil {
    record[columns[i]] = string(col.([]byte))
    }
    }
    fmt.Println(record)
    }
    21 条回复    2017-03-03 09:23:43 +08:00
    twm
        1
    twm  
       2017-03-02 19:19:35 +08:00 via iPhone   ❤️ 1
    每个语言都有游戏规则 遵从或放弃
    loading
        2
    loading  
       2017-03-02 19:31:48 +08:00 via Android
    希望能帮到你:

    stmt, err := db.Prepare(qStr) if err != nil { return err } defer stmt.Close() rows, err := stmt.Query() if err != nil { return err } defer rows.Close() columns, err := rows.Columns() if err != nil { return err } count := len(columns) tableData := make([]map[string]interface{}, 0) values := make([]interface{}, count) valuePtrs := make([]interface{}, count) for rows.Next() { for i := 0; i < count; i++ { valuePtrs[i] = &values[i] } rows.Scan(valuePtrs...) entry := make(map[string]interface{}) for i, col := range columns { var v interface{} val := values[i] b, ok := val.([]byte) if ok { v = string(b) } else { v = val } entry[col] = v } tableData = append(tableData, entry)
    loading
        3
    loading  
       2017-03-02 19:32:11 +08:00 via Android
    卧槽
    scnace
        4
    scnace  
       2017-03-02 19:45:12 +08:00 via Android
    @loading 哈哈哈哈!
    scnace
        5
    scnace  
       2017-03-02 19:45:57 +08:00 via Android
    可以考虑下 ORM🐸
    loading
        6
    loading  
       2017-03-02 19:50:31 +08:00   ❤️ 1
    https://gist.github.com/YCF/e8519c39f9dd83e383f7c38a16f38890

    感觉还能用,希望楼主不会像我刚开始那样 Scan 里面一个一个地写。。。
    Muninn
        7
    Muninn  
       2017-03-02 20:35:05 +08:00 via Android
    静态强类型语言这方面完全没法和动态弱类型比

    业务逻辑不复杂只把数据库当存储的话 考虑下 gorm
    ikaros
        8
    ikaros  
       2017-03-02 20:58:30 +08:00
    请使用 orm

    http://jinzhu.me/gorm

    user := User{ID: 1}
    err := DB.First(&user).Error
    ykrl089
        9
    ykrl089  
       2017-03-02 21:06:20 +08:00
    你需要一个 orm
    Zzzzzzzzz
        10
    Zzzzzzzzz  
       2017-03-02 21:14:11 +08:00
    sqlx
    fuxiaohei
        11
    fuxiaohei  
       2017-03-02 21:29:54 +08:00
    sqlx + 1
    buseni
        12
    buseni  
    OP
       2017-03-02 22:03:43 +08:00 via Android
    @twm 难道我用 golang 开发 web 场景不太合适吗
    buseni
        13
    buseni  
    OP
       2017-03-02 22:06:16 +08:00 via Android
    @loading 就是今天学习,写了一个数据库操作,感觉这样 scan 用着不爽,吐槽下,一会看看你的代码,多谢指导
    jarlyyn
        14
    jarlyyn  
       2017-03-02 22:15:16 +08:00
    ……

    type User struct{

    ID int

    username string

    salt string

    password string

    }

    ...

    user=User{}

    stmt,err:=tx.prepare(`select
    id ,username,salt,password
    from ....`)

    err!=row.scan(&user.id,&userd.username,&username.salt,&user.password)

    if err!=nil{

    return err

    }
    err:=user.auth()

    大概这样吧,我觉得还行啊。

    用反射的话, join 查询是不是会很蛋疼?

    再不行就上 orm 呗
    jarlyyn
        15
    jarlyyn  
       2017-03-02 22:17:22 +08:00
    这格式……
    总之我是

    stmt,err:=tx.prepare(`select
    id , username, salt, password
    from ....`)


    err!=row.scan(
    &user.id, &userd.username, &username.salt, &user.password)
    一个对一个,感觉还行
    loading
        16
    loading  
       2017-03-02 22:59:28 +08:00 via Android
    @jarlyyn 一个一个写……服,不知道你写过有十几个的没
    mingyun
        17
    mingyun  
       2017-03-02 22:59:48 +08:00
    毕竟 php 是最好的语言
    jarlyyn
        18
    jarlyyn  
       2017-03-03 01:18:33 +08:00
    @loading

    var params, countParams []interface{}
    querySelect := `select
    node.id,node.title,node.created_time,node.updated_time,node.url,node.picture,node.category,node.nodetype,node.keyword,node.content,
    nodecategory.id,nodecategory.keyword,nodecategory.title,nodecategory.nodetype,nodecategory.comment
    FROM node,nodecategory `
    queryWhere := "where node.category=nodecategory.id "
    if catalog > -1 {
    queryWhere = queryWhere + " AND node.category= ? "
    params = append(params, catalog)
    countParams = params
    }
    queryOther := " ORDER by node.created_time DESC LIMIT ? OFFSET ?"
    offset := pagesize * (page - 1)
    params = append(params, pagesize, offset)
    stmt, err := tx.Prepare(querySelect + queryWhere + queryOther)
    if err != nil {
    return nil, 0, err
    }
    defer stmt.Close()
    var rows *sql.Rows
    rows, err = stmt.Query(params...)
    if err != nil {
    return nil, 0, err
    }
    defer rows.Close()
    for rows.Next() {
    nm := NodeModel{}
    nm.CategoryModel = CategoryModel{}
    err = rows.Scan(
    &nm.Id, &nm.Title, &nm.CreatedTime, &nm.UpdatedTime, &nm.Url, &nm.Picture, &nm.Category, &nm.Nodetype, &nm.Keyword, &nm.Content,
    &nm.CategoryModel.Id, &nm.CategoryModel.Keyword, &nm.CategoryModel.Title, &nm.CategoryModel.Nodetype, &nm.CategoryModel.Comment)
    if err != nil {
    return nil, 0, err
    }
    result = append(result, nm)
    }


    这样?
    l1093178
        20
    l1093178  
       2017-03-03 09:02:52 +08:00
    @Muninn 这个锅静态语言不背...主要是 Golang 表达力太弱鸡
    像 Scala 的 Slick 表达力就强多了
    Muninn
        21
    Muninn  
       2017-03-03 09:23:43 +08:00
    @l1093178 好吧,我看大家讨论 json 库为何必须要定好 struct 才能解析的时候,甩锅给静态语言。。。用反射的话, golang 的反射又死慢。 貌似 1.9 想改善呀。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6101 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:11 · PVG 14:11 · LAX 22:11 · JFK 01:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.