Go基礎学習記録-Webアプリケーション作成-ブログ編集機能完備


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

一般的には、ブログ記事の編集を行うときにデータベースをクエリーし、編集する記事が存在するかどうかを検索し、最後にクエリーした内容をフロントエンドに伝えて展示します.

最初のステップはModelのクエリーロジックを改善する


models/blogを修正する.goファイルのQueryOne関数、コード修正は以下の通りです.
// QueryOne  
func (blog *Blog) QueryOne() (*helpers.Page, error) {
    var selectString = strings.Join(blog.Select, ", ")
    var whereString = strings.Join(blog.MergeWhere(), " AND ")

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

    rows, err := Conn.Query(sql)

    if err != nil {
        return nil, err
    }

    var res = helpers.Page{}

    for rows.Next() {
        var autokid int
        var title string
        err = rows.Scan(&autokid, &title)

        if err != nil {
            return nil, err
        }

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

        res = p
    }

    if res.ID == 0 {
        return nil, errors.New(" ")
    }

    return &res, nil
}

上記の方法から、SQLをつなぎ合わせてSQLクエリーを実行するという非常に不器用な方法が使用されていることがわかります.
Blog構造体がどのような設計であるかを見てみましょう
type Blog struct {
    Select []string
    Where  []db.Where
}

私の当初の設計のアイデアは、1つのModelがクエリー操作を行う時、唯一必要なのはselect部分とwhere部分だけで、他の複雑な部分はここではしばらく設計しないで、後で一歩一歩設計します.
dbを見てください.Where構造体の様子
type Where struct {
    Name     string
    Value    string
    Operator string
}

同時にMergeメソッドが追加され、このメソッドは主にwhere条件のフィールド名と値をつなぎ合わせてクエリーで使用できるwhere条件フィールド値を構成するために使用されます.

第二歩ルート異動方法を完備する


これらを完了すると、基本的なクエリーが完了します.次に、この操作を呼び出す方法を見てみましょう.これにより、私たちのブログはデータベースと通じ、後の編集の提出や追加などの操作が便利になります.ArticleEdit関数の修正を見てみましょう.
// ArticleEdit  
func ArticleEdit(w http.ResponseWriter, r *http.Request) {
    id := r.URL.Query().Get("id")
    if id == "" {
        http.NotFound(w, r)
        return
    }

    where := []db.Where{}

    where = append(where, db.Where{
        Name:  "autokid",
        Value: id,
    })

    blogModel := &models.Blog{
        Select: []string{"*"},
        Where:  where,
    }

    p, err := blogModel.QueryOne()

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

    crutime := time.Now().Unix()
    h := md5.New()
    io.WriteString(h, strconv.FormatInt(crutime, 10))
    token := fmt.Sprintf("%x", h.Sum(nil))

    p.Token = token
    helpers.RenderTemplate(w, "edit", p)
}

まず、転送されたパラメータidに基づいてデータベースblogテーブルをクエリーし、文章が存在する場合はテンプレートをレンダリングし、存在しない場合は存在しないページをレンダリングします.

ステップ3で再コンパイルして実行


プロジェクトディレクトリの下で実行および実行
go install && wiki

完成例を見たい場合は、以下のようにしてください.
プロジェクト更新アドレス
https://github.com/durban89/typescript_demo.git
tag: 1.1.0