Go基礎学習記録のWeb開発のブログ編集機能のModelクエリー再構築


毎回私は自分の実践のコードをgithubの上でそしてすべて1つのtagを打って、后で使う学友に便利で、ここで私は下の分岐のコードで実践して分かち合います
https://github.com/durban89/typescript_demo.git
tag: 1.1.4

上一篇文章【Go基础学习记录-编纂Webアプリケーション-博客编辑功能的Model再构筑】,只更新了Updaet方法,今回分享下,查询相关的実现正直に言うと,この查询は简単だと思っていたが,以前PHPやPythonを书いたのと同じように,直接查询结果を返して,実际には私が使っているMySQLライブラリと関系があるかもしれないが,これはポイントではない.ポイントは私たちが問題を解決する方法を見つける前にgolangのinterfaceの知識点...interface{}これを理解して、これがどういう意味か知っています.
まず...stringを見て、これはstringパラメータ、具体的な関数の例を表します
func music(m ...string) {
    // other  
}

呼び出す時私たちはこのように呼び出す
music("a", "b", "c")

私は今3つのパラメータを入力しただけで、もっと多くのパラメータを入力することもできます.もちろん、別の呼び出し方法もあります.
var args = []string{
    "a",
    "b",
    "c",
}
music(args...)

上はよく理解できる例ですが...interface{}の使用と...stringの使用はそれほど悪くありません.次に、私がどのようにクエリー方法を最適化したのかを説明します.

最初のステップ、Modelレイヤの変更


ここでは2つのQueryとQueryOneを最適化し、まずQueryOneを見て、コードは以下の通りです.
// QueryOne  
func (p *ModelProperty) QueryOne(s SelectValues, where WhereValues) error {
    var selectString = s.MergeSelect()

    var whereString = where.MergeWhere()

    sql := fmt.Sprintf("SELECT %s FROM %s WHERE %s LIMIT 0, 1", selectString, tableName, whereString)

    rows, err := Conn.Query(sql)

    if err != nil {
        return err
    }

    selectField := make([]interface{}, len(s))

    var i = 0
    for _, v := range s {
        selectField[i] = v
        i++
    }

    for rows.Next() {
        err = rows.Scan(selectField...)

        if err != nil {
            return err
        }

        var i = 0
        for _, v := range s {
            ref := reflect.ValueOf(v)
            fmt.Println(ref.Elem())
            i++
        }
    }

    return nil
}

同時にSelectValuesの構造を修正し、以下のようにします.
// SelectValues select 
type SelectValues map[string]interface{}

ポイントの修正はこちら
selectField := make([]interface{}, len(s))

var i = 0
for _, v := range s {
    selectField[i] = v
    i++
}

関数MergeSelect
// MergeSelect   select 
func (s SelectValues) MergeSelect() string {
    value := []string{}
    for k := range s {
        v := fmt.Sprintf("`%s`", k)
        value = append(value, v)
    }

    return strings.Join(value, ", ")
}

第1部の修正はrows.Scan(selectField...)の関数呼び出しに適合するために行われるので、変換する必要があるとともに、制御層がデータを容易に取得するためには、ポインタにより、検出したデータを制御層第2部に返信する修正は、クエリ文の生成に合わせるためであるので、第2の修正はkey値を処理し、最後にSelectValuesを修正した理由でもあり、変更後、実は全体的に検索が便利になって、多くのロジックが実現したのも順調だと思っています.

ステップ2、制御層呼び出し


QueryOneクエリの呼び出しは次のとおりです.
var autokid int64
var title string
selectField := models.SelectValues{
    "autokid": &autokid,
    "title":   &title,
}

err := blogModel.QueryOne(selectField, where)

if err != nil {
    http.NotFound(w, r)
    return
}

p := helpers.Page{
    Title: title,
    ID:    autokid,
}

Queryクエリの呼び出し
var blogModel models.BlogModel

var autokid int64
var title string
selectField := models.SelectValues{
    "autokid": &autokid,
    "title":   &title,
}

where := models.WhereValues{}

qr, err := blogModel.Query(selectField, where, 1, 10)

if err != nil {
    http.NotFound(w, r)
    return
}

fmt.Println(qr)
 , QueryOne ,Query 。

 , 

 

https://github.com/durban89/t... tag: 1.1.5