必要なパッケージをインポートし、データベース内の tb_student テーブルの例と同じスキーマを持つ構造体を準備します。後で、この構造体はクエリ結果のコンテナーとして使用されます。データ・タイプ。
package main import "fmt" import "database/sql" import _ "github.com/go-sql-driver/mysql" type student struct { id string, name string, age int, grade int, }
使用するデータベース ドライバーは、_ 記号を使用してインポートする必要があります。これは、database/sql パッケージで必要であっても、ドライバーと直接対話しないためです。
次に、データベースに接続する関数を作成します。
func connect() (*sql.DB, error) { db, err := sql.Open("mysql","root:@tcp(127.0.0.1:3306)/db_learn_go") if err != nil { return nil, err } return db, nil }
私たちが使用する mysql ドライバーの接続文字列スキームは非常に独特です。以下の root@tcp(127.0.0.1:3306)/db_learn_go は、外出先の MYSQL ドライバー ドライバーで使用できる接続文字列スキームです。別の mysql では、使用するドライバーによって接続スキームが異なる場合があります。
user:password@tcp(host:port)/dbname user@tcp(host:port)/dbname
以下は、connect() 関数で使用される接続文字列の説明です。
root@tcp(127.0.0.1:3306)/db_learn_go // user => root // password => // host => 127.0.0.1 atau localhost // port => 3306 // dbname => db_learn_go
データベースとの接続機能が作成できたら、次はデータベースサーバーからデータを読み取る処理を練習します。関数の準備
sqlQuery() と次のコード。
func sqlQuery() { db, err := connect() if err != nil { fmt.Println(err.Error()) return } defer db.Close() var age = 27 rows, err := db.Query("select id, name, grade from tb_student where age = ? if err != nil { fmt.Println(err.Error()) return } defer rows.Close() var result []student for rows.Next() { var each = student{} var err = rows.Scan(&each.id, &each.name, &each.grade) if err != nil { fmt.Println(err.Error()) return } result = append(result, each) } if err = rows.Err(); err != nil { fmt.Println(err.Error()) return } for _, each := range result { fmt.Println(each.name) } }
新しい接続が作成されるたびに、必ず接続インスタンスを閉じることを忘れないでください。上記のコードのように defer キーワードを使用できます (defer
)
db.Close() .
db.Query() 関数は、SQL クエリを実行するために使用されます。関数の 2 番目のパラメーターは可変長であるため、空白のままにすることができます。上記のコードでは、where 句の 1 つの値が疑問符 (?) であることがわかります。
記号はその後のパラメーターの値 (年齢変数の値) に置き換えられます。 SQL インジェクションを防ぐために、このタイプのクエリ作成手法を強くお勧めします。この関数は、 sql.*Rows 型のインスタンスを生成します。これも、使用されなくなったら閉じる必要があります ( defer rows.Close() )。次に、要素タイプが struct Student の配列が、 result という名前で準備されます。後でクエリ結果が変数に保存されます。次に、条件参照を rows.Next() としてループが実行されます。このループを最初のレコードから最後まで1レコードずつ順番に総レコード数分実行します。 sql.Rows 関数の Scan() メソッドは、反復されているレコードの値を取得し、ポインター変数に格納します。レコード フィールドの格納に使用される変数は、クエリで選択されたフィールドに従って、可変個引数パラメーターとして順番に書き込まれます。詳細については、以下の比較を参照してください。 // クエリ
ID、名前、グレードを選択...
// スキャン
rows.Scan(&each.id, &each.name, &each.grade ...
取得されたレコード データは、ステートメント
を介して結果スライスに追加されます。
result = append(result, each) .
OK、あとは main で sqlQuery() 関数を呼び出して、プログラムを実行するだけです。
func main() {
SQLQuery()
}
私は普通のブログライターです。まだ至らない点が多々あるかもしれませんが、ご容赦ください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3