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

2017-03-02 18:34:02 +08:00
 buseni
用的这个 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)
}
3736 次点击
所在节点    问与答
21 条回复
twm
2017-03-02 19:19:35 +08:00
每个语言都有游戏规则 遵从或放弃
loading
2017-03-02 19:31:48 +08:00
希望能帮到你:

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
2017-03-02 19:32:11 +08:00
卧槽
scnace
2017-03-02 19:45:12 +08:00
@loading 哈哈哈哈!
scnace
2017-03-02 19:45:57 +08:00
可以考虑下 ORM🐸
loading
2017-03-02 19:50:31 +08:00
https://gist.github.com/YCF/e8519c39f9dd83e383f7c38a16f38890

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

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

http://jinzhu.me/gorm

user := User{ID: 1}
err := DB.First(&user).Error
ykrl089
2017-03-02 21:06:20 +08:00
你需要一个 orm
Zzzzzzzzz
2017-03-02 21:14:11 +08:00
sqlx
fuxiaohei
2017-03-02 21:29:54 +08:00
sqlx + 1
buseni
2017-03-02 22:03:43 +08:00
@twm 难道我用 golang 开发 web 场景不太合适吗
buseni
2017-03-02 22:06:16 +08:00
@loading 就是今天学习,写了一个数据库操作,感觉这样 scan 用着不爽,吐槽下,一会看看你的代码,多谢指导
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
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
2017-03-02 22:59:28 +08:00
@jarlyyn 一个一个写……服,不知道你写过有十几个的没
mingyun
2017-03-02 22:59:48 +08:00
毕竟 php 是最好的语言
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)
}


这样?
jarlyyn
2017-03-03 01:22:21 +08:00
l1093178
2017-03-03 09:02:52 +08:00
@Muninn 这个锅静态语言不背...主要是 Golang 表达力太弱鸡
像 Scala 的 Slick 表达力就强多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/344410

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX