ホームページ >バックエンド開発 >Golang >MySQL の前処理を操作するための Go 言語を学ぶ

MySQL の前処理を操作するための Go 言語を学ぶ

coldplay.xixi
coldplay.xixi転載
2020-07-02 17:42:203953ブラウズ

MySQL の前処理を操作するための Go 言語を学ぶ

フレンドリマインダー: この記事を読むのに約 6 分 41 秒かかります。欠点があればアドバイスをお願いします。読んでいただきありがとうございます。 このサイトを購読する

前処理

前処理は、頻繁なクライアント要求を防ぐために MySQL で使用されるテクノロジです。 MySQL にプリロードされている操作変数データはプレースホルダーに置き換えられるため、MySQL への頻繁なリクエストが減り、サーバーが効率的に実行されます。

ここでクライアントとはフロントエンドとバックエンドの間のC/Sアーキテクチャではなく、バックグラウンドプログラムがデータベースサーバを動作させるC/Sアーキテクチャを指します。クライアントから MySQL へ、サーバーは結果をリクエストして処理します。

#関連する学習の推奨事項:

GO 言語チュートリアル

通常の SQL 実行処理プロセス:

    クライアントで SQL ステートメントを準備します;
  1. SQL ステートメントを MySQL サーバーに送信します;
  2. MySQL サーバーで SQL ステートメントを実行します;
  3. サーバーは、実行結果をクライアントに送信します。

前処理実行プロセス:

    SQL を
  1. 構造部分とデータ部分に分割します;
  2. When SQL ステートメントを実行する場合、まず同じコマンドと構造部分を MySQL サーバーに送信し、MySQL サーバーに事前に前処理を実行させます (この時点では SQL ステートメントは実際には実行されません);
  3. SQL ステートメントの構造的整合性。SQL ステートメントが初めて送信されるとき、可変データ部分はデータ プレースホルダーで表されます。
  4. その後、データ部分は MySQL サーバー (MySQL サーバー) に送信されます。 SQL ステートメントのプレースホルダーを置き換えます;
  5. MySQL サーバーは完全な SQL ステートメントを実行し、結果をクライアントに返します。

前処理の利点

    ステートメントを前処理すると、分析時間が大幅に短縮されます。
  • クエリは 1 つだけ作成されます (ただし、ステートメントは複数存在します)。実行); バインド パラメータ
  • サーバー帯域幅を削減します
  • 、ステートメント全体ではなくクエリのパラメータのみが送信されます;前処理されたステートメントは **SQL インジェクションの対象となります** は、パラメーター値の送信後にさまざまなプロトコルが使用され、データの合法性が保証されるため、非常に便利です。

Go 言語の実装Go 言語では、

db.Prepare()

メソッドを使用して前処理を実装します。

func (db *DB) Prepare(query string) (*Stmt, error)
Prepare は、前処理された SQL ステートメントを実行し、データ バインディング操作の Stmt 構造体ポインターを返します。

クエリ操作では、

db.Prepare()

メソッドを使用して前処理 SQL を宣言し、

stmt.Query() を使用してデータをクエリ、更新用のプレースホルダーに置き換えます。 、挿入。 の場合は、stmt.Exec() を使用して削除操作を実行します。

クエリの前処理の例

// 预处理查询数据func prepareQuery() {
    sqlStr := "SELECT id,name,age FROM user WHERE id > ?"
    stmt, err := db.Prepare(sqlStr)
    if err != nil {
        fmt.Printf("prepare sql failed, err:%v\n", err)
        return
    }
    rows, err := stmt.Query(1)
    if err != nil {
        fmt.Printf("exec failed, err:%v\n", err)
        return
    }
    defer rows.Close()

    for rows.Next() {
        var u user
        err := rows.Scan(&u.id, &u.name, &u.age)
        if err != nil {
            fmt.Printf("scan data failed, err:%v\n", err)
            return
        }
        fmt.Printf("id:%d, name:%s, age:%d\n", u.id, u.name, u.age)
    }}

更新の前処理の例

// 预处理更新数据func prepareUpdate() {
    sqlStr := "UPDATE user SET age = ? WHERE id = ?"
    stmt, err := db.Prepare(sqlStr)
    if err != nil {
        fmt.Printf("prepare sql failed, err:%v\n", err)
        return
    }
    _, err = stmt.Exec(18, 2)
    if err != nil {
        fmt.Printf("exec failed, err:%v\n", err)
        return
    }
    fmt.Printf("prepare update data success")}

挿入の前処理の例

// 预处理更新数据func prepareUpdate() {
    sqlStr := "UPDATE user SET age = ? WHERE id = ?"
    stmt, err := db.Prepare(sqlStr)
    if err != nil {
        fmt.Printf("prepare sql failed, err:%v\n", err)
        return
    }
    _, err = stmt.Exec(18, 2)
    if err != nil {
        fmt.Printf("exec failed, err:%v\n", err)
        return
    }
    fmt.Printf("prepare update data success")}

前処理削除の例

// 预处理删除数据func prepareDelete() {
    sqlStr := "DELETE FROM user WHERE id = ?"
    stmt, err := db.Prepare(sqlStr)
    if err != nil {
        fmt.Printf("prepare sql failed, err:%v\n", err)
        return
    }
    result, err := stmt.Exec(3)
    n, err := result.RowsAffected()
    if err != nil {
        fmt.Printf("delete rows failed, err:%v\n", err)
        return
    }
    if n > 0 {
        fmt.Printf("delete data success")
    } else {
        fmt.Printf("delete data error")
    }

以上がMySQL の前処理を操作するための Go 言語を学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。