Go基礎学習記録のWeb開発のブログ編集機能のModelクエリー再構築
毎回私は自分の実践のコードをgithubの上でそしてすべて1つのtagを打って、后で使う学友に便利で、ここで私は下の分岐のコードで実践して分かち合います
上一篇文章【Go基础学习记录-编纂Webアプリケーション-博客编辑功能的Model再构筑】,只更新了Updaet方法,今回分享下,查询相关的実现正直に言うと,この查询は简単だと思っていたが,以前PHPやPythonを书いたのと同じように,直接查询结果を返して,実际には私が使っているMySQLライブラリと関系があるかもしれないが,これはポイントではない.ポイントは私たちが問題を解決する方法を見つける前にgolangのinterfaceの知識点
まず
呼び出す時私たちはこのように呼び出す
私は今3つのパラメータを入力しただけで、もっと多くのパラメータを入力することもできます.もちろん、別の呼び出し方法もあります.
上はよく理解できる例ですが...interface{}の使用と...stringの使用はそれほど悪くありません.次に、私がどのようにクエリー方法を最適化したのかを説明します.
ここでは2つのQueryとQueryOneを最適化し、まずQueryOneを見て、コードは以下の通りです.
同時にSelectValuesの構造を修正し、以下のようにします.
ポイントの修正はこちら
関数MergeSelect
第1部の修正は
QueryOneクエリの呼び出しは次のとおりです.
Queryクエリの呼び出し
https://github.com/durban89/t... tag: 1.1.5
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