英文:
Golang generic method to fetch data from database
问题
我正在尝试在Golang中实现jquery datatables服务器端处理。其中一部分需要一个通用的方法从数据库中选择数据。我在下面发布了我所做的简化版本。
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中是否可能实现这种通用性?如果可以,请指导我如何使其正常工作?
英文:
I'm trying to implement the jquery datatables server side processing in Golang. Part of that needs a generic method to select data from DB. I've posted a simplified version of what I've done below.
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)
}
Once I run this, it throws the following error,
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
According to the error, Select() is not accepting interfaces. Is it possible to achieve this level of generality in golang? Appreciate if you can direct me to get this working?
答案1
得分: 2
在这种情况下,result已经是一个指针(users作为&users传递),所以你不需要再取它的地址。
将以下行:
_, err = dbMap.Select(&result, query)
替换为:
_, err = dbMap.Select(result, query)
英文:
In this case result is already a pointer (users is passed as &users), so you don't need to take the address of it again.
Replace the line:
_, err = dbMap.Select(&result, query)
with
_, err = dbMap.Select(result, query)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论