Golang通用方法从数据库中获取数据
Golang generic method to fetch data from database
我正在尝试在 Golang 中实现 jquery datatables server side processing。其中一部分需要一个通用方法来 select 来自数据库的数据。我已经发布了我在下面所做的简化版本。
package main
import (
"gopkg.in/gorp.v1"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
TenantId int `db:"tenantid"json:"tenantid"`
Username string `db:"username"json:"username"`
Password string `json:"password"`
}
func GenericSelect(database string, table string, columns []string, result interface{})interface{} {
dbMap := getDBConnection(database);
defer dbMap.Db.Close()
var err error
query := "SELECT "
for index,element := range columns {
query += element
if(index+1 != len(columns)){
query += ","
}
}
query += " FROM " + table + " LIMIT 1,100"
_, err = dbMap.Select(&result, query)
if err != nil {
panic(err.Error()) // Just for example purpose.
}
return result
}
func getDBConnection(dbname string) *gorp.DbMap {
var connectionUrl string
connectionUrl = "root:root@tcp(localhost:3306)/" + dbname
db, err := sql.Open("mysql", connectionUrl)
if err != nil {
panic(err.Error()) // Just for example purpose.
}
dbmap := &gorp.DbMap{Db: db, Dialect:gorp.MySQLDialect{"InnoDB", "UTF8"}}
return dbmap
}
func main(){
var users []User
columns := []string{"tenantid", "username", "password"}
result := GenericSelect("portal","accounting",columns, &users)
//make result in to a json instead of print
print(result)
}
一旦我运行这个,它抛出以下错误,
panic: gorp: Cannot SELECT into this type: *interface {}
goroutine 1 [running]:
main.GenericSelect(0x6b1c30, 0x6, 0x6bd490, 0xa, 0xc208073f60, 0x3, 0x3, 0x5e8e60, 0xc20801e260, 0x0, ...)
/home/anuruddha/Desktop/go-lang/main.go:30 +0x37f
根据错误,Select() 不接受接口。有没有可能在golang中达到这种通用性?如果您能指导我完成这项工作,我将不胜感激?
在这种情况下,result 已经是一个指针(users 作为 &users 传递),因此您不需要再次获取它的地址。
替换行:
_, err = dbMap.Select(&result, query)
和
_, err = dbMap.Select(result, query)
我正在尝试在 Golang 中实现 jquery datatables server side processing。其中一部分需要一个通用方法来 select 来自数据库的数据。我已经发布了我在下面所做的简化版本。
package main
import (
"gopkg.in/gorp.v1"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
TenantId int `db:"tenantid"json:"tenantid"`
Username string `db:"username"json:"username"`
Password string `json:"password"`
}
func GenericSelect(database string, table string, columns []string, result interface{})interface{} {
dbMap := getDBConnection(database);
defer dbMap.Db.Close()
var err error
query := "SELECT "
for index,element := range columns {
query += element
if(index+1 != len(columns)){
query += ","
}
}
query += " FROM " + table + " LIMIT 1,100"
_, err = dbMap.Select(&result, query)
if err != nil {
panic(err.Error()) // Just for example purpose.
}
return result
}
func getDBConnection(dbname string) *gorp.DbMap {
var connectionUrl string
connectionUrl = "root:root@tcp(localhost:3306)/" + dbname
db, err := sql.Open("mysql", connectionUrl)
if err != nil {
panic(err.Error()) // Just for example purpose.
}
dbmap := &gorp.DbMap{Db: db, Dialect:gorp.MySQLDialect{"InnoDB", "UTF8"}}
return dbmap
}
func main(){
var users []User
columns := []string{"tenantid", "username", "password"}
result := GenericSelect("portal","accounting",columns, &users)
//make result in to a json instead of print
print(result)
}
一旦我运行这个,它抛出以下错误,
panic: gorp: Cannot SELECT into this type: *interface {}
goroutine 1 [running]:
main.GenericSelect(0x6b1c30, 0x6, 0x6bd490, 0xa, 0xc208073f60, 0x3, 0x3, 0x5e8e60, 0xc20801e260, 0x0, ...)
/home/anuruddha/Desktop/go-lang/main.go:30 +0x37f
根据错误,Select() 不接受接口。有没有可能在golang中达到这种通用性?如果您能指导我完成这项工作,我将不胜感激?
在这种情况下,result 已经是一个指针(users 作为 &users 传递),因此您不需要再次获取它的地址。
替换行:
_, err = dbMap.Select(&result, query)
和
_, err = dbMap.Select(result, query)