golang - データベース/ SQLの学習パッケージ

1、データベース/ SQLパッケージ

SQLパッケージは、汎用インタフェースの保証SQLまたはSQLのようなデータベースを提供します。

注入されなければならない(少なくとも)データベース、SQLパッケージを使用して駆動されます。

(1)mysqlのドライバを入手します。get -v github.com/go-sql-driver/mysqlを行きます

(2)コードの例:

メインパッケージ

のインポート(
	"データベース/ SQL" 
	"FMT"は
	、 "ログ" 
	"時間" 

	_ "" github.com/go-sql-driver/mysql 

//エラーをチェック
FUNC checkErr(ERRエラー){ 
	IF ERR!= {nilの
		log.Fatalln(ERR)
	} 
} 

//トランザクションエラー
FUNC checkTxErr(ERRエラー、TX * sql.Tx){ 
	IF ERR!= nilの{ 
		log.Println(ERR)
		ERR = tx.Rollback()
		checkErr(ERR)
	} 
} 

//データベースエンティティ
タイプstruct {ユーザー
	INT ID 
	名文字列
	年齢INTの
	セックスINT 
	AddDate time.time 
} 

FUNCメイン(){ 
	// 1、データベース接続
	ERR、DB:= sql.Open( "MySQLの"、 "123456 TCP(127.0.0.1:3306)@ルート:?/ =テストをtrueにparseTime")
	checkErr(ERR)
	延期db.Close()
	fmt.Println(「データベース接続成功")
	// 2は、決定するかどうか、有効な接続
	ERR = db.Ping()
	checkErr(ERR)
	fmt.Println("有効なデータベース接続「)
	// 3、CREATE TABLEの
	SQL:= ` 
		NOTユーザーが存在する場合はテーブルを作成します(
			INT AUTO_INCREMENT NOT NULL ID、
			名前VARCHAR(100)NOT NULL、
			年齢INT NOT NULL、
			セックスTINYINT、
			add_date DATETIME、
			PRIMARY KEY(ID) 
	` 
	_、ERR = db.Exec(SQL)
	checkErr(ERR)

	//。4、データの追加 
	// SQL = "ユーザー(INSERT INTO名前、年齢、性別、add_date)VALUES(?、?、?、?)"
	//解像度を、ERR:= db.Exec( SQL、 " ジョー・スミス"、18、1、時間。今、()) 
	// checkErr(ERR)
	// fmt.Println(res.LastInsertId())

	// 5、查询数据の
	SQL = "IDを選択し、名前、年齢、性別、add_dateユーザーからの" 
	行、ERR:= db.Query(SQL)
	checkErr(ERR)
	延期rows.Close()
	ユーザー:=ユーザー{} 
	rows.Next用(){ 
		ERR = rows.Scan(&user.ID、&user.Name、&user.Age、&user.Sex、&user.AddDate)
		checkErr(ERR)
		FMT。 println(ユーザ、user.AddDate.Format( "2006年1月2日15時04分05秒"))
	} 
	ERR = rows.Err()
	checkErr(ERR)

	// 6、查询一行 
	checkErr(ERR)
	stmt.Closeを(延期) 
	SQL = "IDを選択し、名前、年齢、性別、ユーザからadd_date" 
	行:= db.QueryRow(SQL)
	ERR = row.Scan (&user.ID、&user.Name、&user.Age、&user.Sex、&user.AddDate)
	checkErr(ERR)
	fmt.Println(ユーザー)

	// 7、命令
	SQL = "UPDATEユーザーが設定した名前=?WHERE ID = ?;" 
	STMT、ERR = db.Prepare(SQL)
	結果、ERR = stmt.Exec( "李四"、1)
	checkErr(ERR)
	fmt.Println(result.RowsAffected())

	// 8、查询
	SQL =「SELECTユーザーからのID、名前、年齢、性別、add_date WHERE ID =?」
	stmt2、ERR = db.Prepare(SQL)
	checkErr(ERR)
	延期stmt2.Close()
	行= stmt2.QueryRow(1)
	ERR = row.Scan(&user.ID、&user.Name、&user.Age、&user.Sex 、&​​user.AddDate)
	checkErr(ERR)
	fmt.Println(ユーザ)

	// 9、事务
	TX、ERR = db.Begin()
	checkErr(ERR)
	_、ERR = tx.Exec(」UPDATEユーザーは=年齢を設定しますか?WHERE ID =?」、20、1) 
	checkTxErr(ERR、TX)
	_、ERR = tx.Exec( "UPDATEユーザーは、性別を設定=?ID =?"、1、1)
	checkTxErr(ERR、
	checkTxErr(ERR、TX)

	// 10、查询一行
	SQL = "SELECT ID、名前、年齢、性別、ユーザーからのadd_date" 
	行= db.QueryRow(SQL)
	ERR = row.Scan(&user.ID、&user.Name、 &user.Age、&user.Sex、&user.AddDate)
	checkErr(ERR)
	fmt.Println(ユーザ)

}

2、データベース

2.1型DB構造体{}

DBは、基礎となる接続にゼロを複数有する接続プールを表す、データベース・ハンドルです。

これは、安全に離れて行く複数で同時に使用することができます。

プールのサイズはSetMaxIdleConns方法で制御することができます。

2.2一般的な方法

(1)オープン(DRIVERNAME、datasourcenameに列)FUNC(* DB、エラー)

データベースを開き、データベースのハンドルを返し、DBは、安全に離れて行く複数で同時に使用することができ、かつ、自身のアイドル接続のプールを維持します。

一度だけ呼ばれるOpen関数は、めったにDBをクローズする必要はありません。

(2)FUNC(DB *のDB)ドライバ()driver.Driver

下位ドライバは、データベースを返します。

(3)FUNC(DB * DB)のPing()エラー

データベースへの接続がまだ有効である、との接続を作成するために必要な場合かどうかをチェックします。

(4)FUNC(DB * DB)を閉じる()エラー

データベース、開いているすべてのリソースの解放を閉じます。

DBは、一般的に離れて行く、と長期的なアクティブDBハンドルは、多くの場合、複数で共有されているので、近くにはありません。

(5)FUNC(DB *のDB)SetMaxOpenConnsを(N INT)

データベースとの接続を確立するための最大数を設定します。

nは0より大きく、アイドル接続の最大数よりも少ない場合、アイドル接続の最大数は、接続数が最大開度と一致するように減少される制限されます。

N <= 0、最大値はオープン接続の数を制限しない場合、デフォルトは(無制限に)0です。

(6)FUNC(DB *のDB)SetMaxIdleConnsを(N INT)

アイドル状態の接続プールの最大数を設定します。

nがオープン接続の最大数よりも大きい場合に、アイドル接続の新しい最大数は、オープン接続の最大数の制限に適合するように低減されます。

N場合<= 0、アイドル状態の接続は保持されません。

(7)FUNC(DB * DB)Execの(クエリ文字列、引数...インターフェイス{})(結果、エラー)

(クエリを含む、削除、更新、挿入、など)コマンドを実行し、実行結果を返しません。

引数パラメータは、クエリのパラメータプレースホルダを表します。

(8)FUNC(DB * DB)クエリ(クエリ文字列、引数...インターフェイス{})(*行エラー)

クエリを実行すると、複数の行が一般的にselectコマンドを実行するのに使用される、(行)結果を返します。

(9)FUNC(デシベル*のDB)QueryRow(クエリ文字列、引数...インターフェイス{})*行

クエリを実行し、最大1つの行の結果(すなわち、行)を返すように期待。

常にnil以外の値を返し、戻り値が呼び出されるスキャン方法まで、それが遅れてエラーを返します。

(10)FUNC(デシベルの*のDB)(クエリ文字列)を準備(*のstmt、エラー)

後続の問合せやコマンドのための準備状態を作成します。

戻り値は、同時に複数のクエリやコマンドを実行することができます。

(11)FUNC(デシベル*のDB)(開始)(*送信、エラー)

ビジネスを開始します。

データベースの分離レベルの決定によって駆動。

3、データシート

3.1、タイプ行{}

行は、クエリの結果です。

次に方法は、行を結果、結果セットのゼロ番目の行にカーソルポイント。

3.2、一般的な方法

(1)FUNC(RS *行)カラム()([]の文字列、エラー)

カラム名を返します。

行が閉鎖されている場合はエラーを返します。

(2)FUNC(RS *行)スキャン(DEST ...インターフェイス{})エラー

規定値DESTのそれぞれの列の結果に充填され、現在の行をスキャンします。

パラメータタイプは* []バイトである場合、スキャンは呼び出し側にコピーの対応するデータのコピーを保存し、安全で、変更、または無期限に保存されます。

引数はコピーを回避* RAWBYTESであれば、RAWBYTESのドキュメントは、その使用を制約ご覧ください。

*インターフェース{}のパラメータのタイプ場合、スキャン変換が提供底ドライブの値をコピーしないであろう。

タイプの値が[]バイト、データがコピーされた場合、呼び出し側は、セキュリティ値を使用することができます。

(3)FUNC(RS *行)次()BOOL

結果スキャン方法の次の行の次の準備。

成功した場合、何の次の行がない場合には、trueを返しますかエラーがfalseを返します。

スキャンメソッド呼び出したびに、この方法にも、最初の呼び出しは、あなたが最初の前に次のメソッドを呼び出す必要があります。

(4)FUNC(RS *行)閉じる()エラー

閉じる行は、そのリストをさらに防ぎます。

次のメソッドがfalseを返した場合、行が自動的にシャットダウンします。

メソッドのErr条件の結果を確認してください。

Closeメソッドは、結果のErr方法には影響を与えません冪等(複数の呼び出し無効成功)です。

(5)FUNC(RS *行)のErr()エラー

ERRエラーが時に反復を発生し、可能な戻り。

明示的または暗黙的な呼び出しCloseメソッドの後に呼び出されるERR。

4、データ線

4.1、タイプ行{}

QueryRow方法は、単一行のクエリ結果の代わりに、行を返します。

4.2一般的な方法

(1)FUNC(R *行)スキャン(DEST ...インターフェイス{})エラー

走査線クエリ結果は、パラメータ値DEST指定した列に格納されます。

クエリが複数の行と一致する場合、スキャン結果の最初の行を使用し、残りの行を廃棄します。

一致する行のクエリがない場合、スキャンはErrNoRowsを返します。

5、SQLコマンドのステータス

5.1型のstmt構造体{}

stmtはレディ状態です。

stmtは安全に離れて行く、同時に複数使用することができます。

5.2、一般的な方法

(1)FUNC(S *のstmt)Execの(引数...インターフェイス{})(結果、エラー)

結果の状態エグゼクティブ・サマリーの良い状態、戻り値の結果の型を提供されたパラメータを使用してコマンドを実行する準備ができました。

(2)FUNC(S *のstmt)クエリ(引数...インターフェイス{})(*行エラー)

準備されたクエリの状態を実行してパラメータを使用して、タイプの行は、クエリの結果を返します。

(3)FUNC(S *のstmt)QueryRow(引数...インターフェイス{})*行

準備されたクエリの実行状態を提供されたパラメータを使用します。

あなたは実装でエラーが発生した場合、戻り値までスキャン法と呼ばれて放出された場合、エラーは、遅延されます。

常に非nilを返します。

クエリは結果ではない場合、*方式の走査列の戻り型がErrNoRowsが返され、そうでない場合、スキャン方法、スキャン結果と残りの行の最初の行を廃棄します。

(4)FUNC(S *のstmt)閉じる()エラー

オフ。

6、業務

6.1種類のTxのstruct {}

進行中のデータベースのトランザクションのためのTX。

トランザクションがコミットまたはロールバックへの呼び出しで終了する必要があります。

トランザクションが失敗し、エラー値を返しますErrTxDoneにコミットまたはロールバック呼び出した後、すべての操作が可能になります。

6.2、一般的な方法

(1)FUNC(TX *のTx)Execの(クエリ文字列、引数...インターフェイス{})(結果、エラー)

コマンドを実行し、結果を返しません。このような挿入および更新の実装として。

(2)FUNC(TX *のTx)クエリ(クエリ文字列、引数...インターフェイス{})(*行エラー)

一般SELECTコマンドを実行する、クエリを実行し、複数の行(行)にはゼロの結果を返します。

(3)FUNC(TX *のTx)QueryRow(クエリ文字列、引数...インターフェイス{})*行

クエリと最大1つの行(行)を返すように期待される結果を実行します。

常にnil以外の結果を返す、クエリが失敗したエラーがスキャン方法で解放するために遅れることになると、その結果を呼び出します。

(4)FUNC(TX *のTx)(クエリ文字列)を準備(*のstmt、エラー)

国政に専用のを準備します。

操作後のトランザクション排他状態の戻り値は、送信に使用することはできませんロールバックを提出します。

(5)FUNC(TX *のTx)のstmt(STMT *のstmt)*のstmt

すでにトランザクションの特定の状態を存在する状態を使用してください。

(6)FUNC(TX *のTx)(コミット)エラー

トランザクションをコミットします。

(7)FUNC(TX *のTx)ロールバック()エラー

トランザクションをロールバックします。

おすすめ

転載: www.cnblogs.com/dzhy/p/11065300.html