2016-11-05 85 views
0

我正在实施数据库API。我有模特。我需要对每个模型实施CRUD操作。现在我为每个模型创建一个单独的GetAllModels函数和Get方法。我怎么能为所有模型做一次,如果需要的话只是传递一些变量?如何在Golang中为任何模型实现基本的CRUD动作?

下面我用每个模型的模式:

type City struct { 
    Attr1 string 
    Attr2 string 
} 

type Country struct { 
    Attr1 string 
    Attr2 string 
} 

func GetAllCities(db *sqlx.DB) ([]*City, error) { 
    items := []*City{} 
    err := db.Select(&items, "SELECT * FROM cities") 
    // check err 
    return items, nil 
} 

func (m *City) Get(db *sqlx.DB, id string) error { 
    if err := db.Get(m, "SELECT FROM cities WHERE id = ?", id); err != nil { 
     return err 
    } 
    return nil 
} 

func GetAllCountries(db *sqlx.DB) ([]*Country, error) { 
    items := []*Country{} 
    err := db.Select(&items, "SELECT * FROM countries") 
    // check err 
    return items, nil 
} 

func (m *Country) Get(db *sqlx.DB, id string) error { 
    if err := db.Get(m, "SELECT FROM countries WHERE id = ?", id); err != nil { 
     return err 
    } 
    return nil 
} 

但是从模型实际上变成模型是查询字符串和切片对象的类型。

如何为所有未来的模型制作一个通用的GetAll函数和Get方法?

+0

我看到的问题是downvoted。有人可以解释为什么吗? – hsrv

+0

我没有低调,但我想知道模特在这里的角色是什么。我可以看到它在面向对象的语言中用作抽象类,但我不认为它会像其他任何东西一样有用。模型究竟做了什么? –

+0

@ChronoKitsune,也许我还不够清楚。我不想创建一个抽象类。我已经更新了问题中的代码示例,请仔细阅读。我有几个结构。并有非常相似的功能和方法从数据库中获取数据。每个这样的函数具有相同的结构,但是不同的*查询字符串*和不同的*类型*。所以我认为这些funcs不必是不同的funcs,它们可能是唯一一套CRUD funcs,但有不同的变量。但我坚持实施这个。 – hsrv

回答

0

我没有测试过这个,但它应该工作。如果您收到每个请求的表名和列名(或者您知道它们),您可以从db中获取interface作为变量传递表和列。

包主要

import (
    "errors" 
    "fmt" 

    "github.com/jmoiron/sqlx" 
) 

func selectAll(table string) string { 
    return fmt.Sprintf("SELECT * FROM %s", table) 
} 

func selectWhere(table string, column string) string { 
    return fmt.Sprintf("SELECT * FROM %s WHERE %s = ?", table, column) 
} 

func validTableStr(table string) bool { 
    // real validation here 
    return true 
} 

func validColumnStr(table string, column string) bool { 
    // real validation here 
    return true 
} 

func GetAll(db *sqlx.DB, table string) ([]interface{}, error) { 

    if !validTableStr(table) { 
     return nil, errors.New("invalid table name") 
    } 

    items := []interface{}{} 
    err := db.Select(&items, selectAll(table)) 
    return items, err 
} 

func GetWhere(db *sqlx.DB, table string, column string, value interface{}) ([]interface{}, error) { 

    if !validTableStr(table) { 
     return nil, errors.New("invalid table name") 
    } 

    if !validColumnStr(table, column) { 
     return nil, errors.New("invalid column name") 
    } 

    items := []interface{}{} 
    err := db.Select(&items, selectWhere(table, column), value) 
    return items, err 
} 
相关问题