必要なパッケージをインポートし、データベース内の 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() 関数を呼び出して、プログラムを実行するだけです。
関数 main() {
sqlQuery()
}
私は普通のブログライターです。まだ至らない点が多々あるかもしれませんが、ご容赦ください。
以上がMySQLサーバーからのデータの読み取りの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。