golang 操作 mysql
インストール
go get "github.com/go-sql-driver/mysql" go get "github.com/jmoiron/sqlx"
データベース接続
var Db *sqlx.DB db, err := sqlx.Open("mysql","username:password@tcp(ip:port)/database?charset=utf8") Db = db
接続 2
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var db *sql.DB //全局对象db func initDB() (err error) { db, err = sql.Open("mysql","root:admin123@tcp(127.0.0.1:3306)/dududu?charset=utf8") if err!=nil{ return err } err = db.Ping() //校验数据库连接 if err!=nil{ return err } return nil } type beautiful struct { spu_id string title string price string } func queryRowDemo() { sqlStr :="select spu_id,title,price from dududu_shops where id = ?" var u beautiful err:=db.QueryRow(sqlStr,101).Scan(&u.spu_id,&u.title,&u.price) if err!=nil{ fmt.Println("2",err) } fmt.Println(u) } func main() { err:=initDB() if err!=nil{ fmt.Println("1",err) return } queryRowDemo() }
ハンドル タイプ
SQLX の設計とデータベース/SQL の使用方法は同じです。 4 つの主要なハンドル タイプが含まれます。
sqlx.DB - sql.DB と同様、データベースを表します。
sqlx.Tx - sql.Tx と同様に、物事を表します。
sqlx.Stmt - sql.Stmt と同様に、準備されたステートメントを表します。
sqlx.NamedStmt - 準備されたステートメントを表します (名前付きパラメーターをサポート)
すべてのハンドラー タイプはデータベース/SQL との互換性を提供します。これは、次の場合を意味します。 sqlx.DB.Query を呼び出すと、それを sql.DB.Query に直接置き換えることができるため、sqlx を既存のデータベース プロジェクトに簡単に追加できます。
さらに、sqlx には 2 つのカーソル タイプがあります。
sqlx.Rows - sql.Rows と同様に、Queryx は戻ります。
sqlx.Row - sql.Row と同様に、QueryRowx は返します。
データベース/SQL メソッドと比較すると、新しい構文があり、取得したデータを構造体に直接変換できます。
- #Get(宛先インターフェイス{}, …) エラー
- Select(宛先インターフェイス{}, …) エラー
CREATE TABLE `userinfo` ( `uid` INT(10) NOT NULL AUTO_INCREMENT, `username` VARCHAR(64) DEFAULT NULL, `password` VARCHAR(32) DEFAULT NULL, `department` VARCHAR(64) DEFAULT NULL, `email` varchar(64) DEFAULT NULL, PRIMARY KEY (`uid`) )ENGINE=InnoDB DEFAULT CHARSET=utf8Exec は Exec を使用し、MustExec は接続プールから接続を取り出し、対応するクエリ操作を実行します。アドホック クエリの実行をサポートしていないドライバーの場合、準備されたステートメントは操作の実行の背後で作成されます。この接続は、結果が返される前に接続プールに返されます。 データベースの種類が異なれば、使用するプレースホルダーも異なることに注意してください。mysql は何を使用しますか?プレースホルダーシンボルとして。
- #MySQL を使用しますか?
- PostgreSQL は 1、1、2 などを使用します。
- SQLite は使用しますか?または、$1
- ##Oracle は、name
- Exec を使用して、この例を追加または削除します。
package main
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"fmt"
)
var Db *sqlx.DB
func init() {
db, err := sqlx.Open("mysql", "stu:1234qwer@tcp(10.0.0.241:3307)/test?charset=utf8")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
Db = db
}
func main() {
result, err := Db.Exec("INSERT INTO userinfo (username, password, department,email) VALUES (?, ?, ?,?)","wd","123","it","wd@163.com")
if err != nil{
fmt.Println("insert failed,error: ", err)
return
}
id,_ := result.LastInsertId()
fmt.Println("insert id is :",id)
_, err1 := Db.Exec("update userinfo set username = ? where uid = ?","jack",1)
if err1 != nil{
fmt.Println("update failed error:",err1)
} else {
fmt.Println("update success!")
}
_, err2 := Db.Exec("delete from userinfo where uid = ? ", 1)
if err2 != nil{
fmt.Println("delete error:",err2)
}else{
fmt.Println("delete success")
}
}
//insert id is : 1
//update success!
//delete success
sql プリペアド ステートメントほとんどのデータベースでは、クエリが実行されるときに、SQL ステートメント データベース内のステートメントがすでに宣言されており、そのステートメントがデータベース内にあるため、それを宣言できます。他の場所で再利用できるよう事前に準備しておきます。 stmt, err := db.Prepare(`SELECT * FROM place WHERE telcode=?`)
row = stmt.QueryRow(65)
tx, err := db.Begin()
txStmt, err := tx.Prepare(`SELECT * FROM place WHERE telcode=?`)
row = txStmt.QueryRow(852)
もちろん、sqlx は展開用の Preparex() も提供します。これは構造変換に直接使用できます。stmt, err := db.Preparex(`SELECT * FROM place WHERE telcode=?`) var p Place err = stmt.Get(&p, 852)Query行の結果は、database/ の Rows を使用して取得されます。 SQLで取得します。クエリは sql.Rows オブジェクトとエラー オブジェクトを返します。 これを使用する場合、行は一連の結果ではなくカーソルとして扱われる必要があります。データベース ドライバーのキャッシュ方法は異なりますが、Next() の繰り返しを通じて毎回 1 列の結果が取得されるため、クエリ結果が非常に大きい場合にメモリ使用量を効果的に制限できます。Scan() は SQL の各列をマップするためにリフレクトを使用します。文字列、[]byte などの言語データ型。すべての行の結果を反復処理しない場合は、接続を接続プールに返す前に必ず rows.Close() を呼び出してください。 Query によって返されるエラーは、サーバーがクエリを準備しているときに発生することも、クエリ ステートメントの実行時に発生することもあります。たとえば、データベースが使用可能な接続の検索または作成を 10 回試行したとしても、接続プールから不正な接続が取得される可能性があります。通常、エラーは主に SQL ステートメントのエラー、同様の一致エラー、ドメイン名またはテーブル名のエラーから発生します。 ほとんどの場合、Rows.Scan() は、ドライバーがキャッシュをどのように使用するかに関係なく、ドライバーから取得したデータのコピーを作成します。特殊な型 sql.RawBytes を使用すると、ドライバーから返されたデータからゼロコピー スライス バイトを取得できます。次回 Next が呼び出されるとき、値が指すメモリはドライバーによって他のデータで上書きされているため、値は無効になります。 Query で使用される接続は、Next() を介してすべての行が走査された後、または rows.Close() が呼び出された後に解放されます。 例:
package main import ( _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "fmt" ) var Db *sqlx.DB func init() { db, err := sqlx.Open("mysql", "stu:1234qwer@tcp(10.0.0.241:3307)/test?charset=utf8") if err != nil { fmt.Println("open mysql failed,", err) return } Db = db } func main() { rows, err := Db.Query("SELECT username,password,email FROM userinfo") if err != nil{ fmt.Println("query failed,error: ", err) return } for rows.Next() { //循环结果 var username,password,email string err = rows.Scan(&username, &password, &email) println(username,password,email) } } //wd 123 wd@163.com //jack 1222 jack@165.comQueryxxQueryx は Query とよく似た動作をしますが、sqlx.Rows オブジェクトを返し、拡張スキャン動作をサポートし、データを構造化できます。 。 例:
package main import ( _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "fmt" ) var Db *sqlx.DB type stu struct { Username string `db:"username"` Password string `db:"password"` Department string `db:"department"` Email string `db:"email"` } func init() { db, err := sqlx.Open("mysql", "stu:1234qwer@tcp(10.0.0.241:3307)/test?charset=utf8") if err != nil { fmt.Println("open mysql failed,", err) return } Db = db } func main() { rows, err := Db.Queryx("SELECT username,password,email FROM userinfo") if err != nil{ fmt.Println("Qeryx failed,error: ", err) return } for rows.Next() { //循环结果 var stu1 stu err = rows.StructScan(&stu1)// 转换为结构体 fmt.Println("stuct data:",stu1.Username,stu1.Password) } } //stuct data: wd 123 //stuct data: jack 1222QueryRow と QueryRowxQueryRow と QueryRowx は両方ともデータベースからデータを取得しますが、QueryRowx は結果を直接変換できるスキャン拡張機能を提供します。構造。
package main
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"fmt"
)
var Db *sqlx.DB
type stu struct {
Username string `db:"username"`
Password string `db:"password"`
Department string `db:"department"`
Email string `db:"email"`
}
func init() {
db, err := sqlx.Open("mysql", "stu:1234qwer@tcp(10.0.0.241:3307)/test?charset=utf8")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
Db = db
}
func main() {
row := Db.QueryRow("SELECT username,password,email FROM userinfo where uid = ?",1) // QueryRow返回错误,错误通过Scan返回
var username,password,email string
err :=row.Scan(&username,&password,&email)
if err != nil{
fmt.Println(err)
}
fmt.Printf("this is QueryRow res:[%s:%s:%s]\n",username,password,email)
var s stu
err1 := Db.QueryRowx("SELECT username,password,email FROM userinfo where uid = ?",2).StructScan(&s)
if err1 != nil{
fmt.Println("QueryRowx error :",err1)
}else {
fmt.Printf("this is QueryRowx res:%v",s)
}
}
//this is QueryRow res:[wd:123:wd@163.com]
//this is QueryRowx res:{jack 1222 jack@165.com}
Get and Select (非常に一般的に使用されます)Get and Select は、結果を構造体に直接割り当てることができ、変換のために StructScan を内部的にカプセル化することができる、非常に時間を節約する拡張機能です。 Get メソッドを使用して 1 つの結果を取得し、次に Scan メソッドを使用し、Select メソッドを使用して結果のスライスを取得します。 例: package main import ( _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "fmt" ) var Db *sqlx.DB type stu struct { Username string `db:"username"` Password string `db:"password"` Department string `db:"department"` Email string `db:"email"` } func init() { db, err := sqlx.Open("mysql", "stu:1234qwer@tcp(10.0.0.241:3307)/test?charset=utf8") if err != nil { fmt.Println("open mysql failed,", err) return } Db = db } func main() { var stus []stu err := Db.Select(&stus,"SELECT username,password,email FROM userinfo") if err != nil{ fmt.Println("Select error",err) } fmt.Printf("this is Select res:%v\n",stus) var s stu err1 := Db.Get(&s,"SELECT username,password,email FROM userinfo where uid = ?",2) if err1 != nil{ fmt.Println("GET error :",err1) }else { fmt.Printf("this is GET res:%v",s) } } //this is Select res:[{wd 123 wd@163.com} {jack 1222 jack@165.com}] //this is GET res:{jack 1222 jack@165.com}トランザクショントランザクション操作は 3 つのメソッドによって実装されます: Begin(): トランザクションを開きますCommit (): トランザクションのコミット(SQL実行)Rollback(): ロールバック利用プロセス:
tx, err := db.Begin() err = tx.Exec(...) err = tx.Commit() //或者使用sqlx扩展的事务 tx := db.MustBegin() tx.MustExec(...) err = tx.Commit()
为了维持一个持续的连接状态,Tx对象必须绑定和控制单个连接。在整个生命周期期间,一个Tx将保持连接,直到调用commit或Rollback()方法将其释放。必须非常谨慎地调用这些函数,否则连接将一直被占用,直到被垃圾回收。
使用示例:
package main import ( _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "fmt" ) var Db *sqlx.DB func init() { db, err := sqlx.Open("mysql", "stu:1234qwer@tcp(10.0.0.241:3307)/test?charset=utf8") if err != nil { fmt.Println("open mysql failed,", err) return } Db = db } func main() { tx, err := Db.Beginx() _, err = tx.Exec("insert into userinfo(username,password) values(?,?)", "Rose","2223") if err != nil { tx.Rollback() } _, err = tx.Exec("insert into userinfo(username,password) values(?,?)", "Mick",222) if err != nil { fmt.Println("exec sql error:",err) tx.Rollback() } err = tx.Commit() if err != nil { fmt.Println("commit error") } }
连接池设置
当连接池中没有可用空闲连接时,连接池会自动创建连接,并且其增长是无限制的。最大连接数可以通过调用DB.SetMaxOpenConns来设置。未使用的连接标记为空闲,如果不需要则关闭。为了减少连接的开启和关闭次数,可以利用DB.SetMaxIdleConns方法来设定最大的空闲连接数。
注意:该设置方法golang版本至少为1.2
DB.SetMaxIdleConns(n int) 设置最大空闲连接数
DB.SetMaxOpenConns(n int) 设置最大打开的连接数
DB.SetConnMaxIdleTime(time.Second*10) 间隔时间
示例:
package main import ( _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "fmt" ) var Db *sqlx.DB func init() { db, err := sqlx.Open("mysql", "stu:1234qwer@tcp(10.0.0.241:3307)/test?charset=utf8") if err != nil { fmt.Println("open mysql failed,", err) return } Db = db Db.SetMaxOpenConns(30) Db.SetMaxIdleConns(15) }
案例使用
var Db *sqlx.DB db, err := sqlx.Open("mysql","root:admin123@tcp(127.0.0.1:3306)/dududu?charset=utf8") Db = db rows, err := Db.Query("SELECT spu_id,title,price FROM dududu_shops") if err != nil{ fmt.Println("query failed,error: ", err) return } for rows.Next() { //循环结果 var spu_id,title,price string err = rows.Scan(&spu_id, &title, &price) println(spu_id,title,price) }
以上がgolang を mysql データベースに接続する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Innodbbufferpoolは、データをキャッシュしてページをインデックス作成することにより、ディスクI/Oを削減し、データベースのパフォーマンスを改善します。その作業原則には次のものが含まれます。1。データ読み取り:Bufferpoolのデータを読む。 2。データの書き込み:データを変更した後、bufferpoolに書き込み、定期的にディスクに更新します。 3.キャッシュ管理:LRUアルゴリズムを使用して、キャッシュページを管理します。 4.読みメカニズム:隣接するデータページを事前にロードします。 BufferPoolのサイジングと複数のインスタンスを使用することにより、データベースのパフォーマンスを最適化できます。

他のプログラミング言語と比較して、MySQLは主にデータの保存と管理に使用されますが、Python、Java、Cなどの他の言語は論理処理とアプリケーション開発に使用されます。 MySQLは、データ管理のニーズに適した高性能、スケーラビリティ、およびクロスプラットフォームサポートで知られていますが、他の言語は、データ分析、エンタープライズアプリケーション、システムプログラミングなどのそれぞれの分野で利点があります。

MySQLは、データストレージ、管理、分析に適した強力なオープンソースデータベース管理システムであるため、学習する価値があります。 1)MySQLは、SQLを使用してデータを操作するリレーショナルデータベースであり、構造化されたデータ管理に適しています。 2)SQL言語はMySQLと対話するための鍵であり、CRUD操作をサポートします。 3)MySQLの作業原則には、クライアント/サーバーアーキテクチャ、ストレージエンジン、クエリオプティマイザーが含まれます。 4)基本的な使用には、データベースとテーブルの作成が含まれ、高度な使用にはJoinを使用してテーブルの参加が含まれます。 5)一般的なエラーには、構文エラーと許可の問題が含まれ、デバッグスキルには、構文のチェックと説明コマンドの使用が含まれます。 6)パフォーマンスの最適化には、インデックスの使用、SQLステートメントの最適化、およびデータベースの定期的なメンテナンスが含まれます。

MySQLは、初心者がデータベーススキルを学ぶのに適しています。 1.MySQLサーバーとクライアントツールをインストールします。 2。selectなどの基本的なSQLクエリを理解します。 3。マスターデータ操作:テーブルを作成し、データを挿入、更新、削除します。 4.高度なスキルを学ぶ:サブクエリとウィンドウの関数。 5。デバッグと最適化:構文を確認し、インデックスを使用し、選択*を避け、制限を使用します。

MySQLは、テーブル構造とSQLクエリを介して構造化されたデータを効率的に管理し、外部キーを介してテーブル間関係を実装します。 1.テーブルを作成するときにデータ形式と入力を定義します。 2。外部キーを使用して、テーブル間の関係を確立します。 3。インデックス作成とクエリの最適化により、パフォーマンスを改善します。 4.データベースを定期的にバックアップおよび監視して、データのセキュリティとパフォーマンスの最適化を確保します。

MySQLは、Web開発で広く使用されているオープンソースリレーショナルデータベース管理システムです。その重要な機能には、次のものが含まれます。1。さまざまなシナリオに適したInnodbやMyisamなどの複数のストレージエンジンをサポートします。 2。ロードバランスとデータバックアップを容易にするために、マスタースレーブレプリケーション機能を提供します。 3.クエリの最適化とインデックスの使用により、クエリ効率を改善します。

SQLは、MySQLデータベースと対話して、データの追加、削除、変更、検査、データベース設計を実現するために使用されます。 1)SQLは、ステートメントの選択、挿入、更新、削除を介してデータ操作を実行します。 2)データベースの設計と管理に作成、変更、ドロップステートメントを使用します。 3)複雑なクエリとデータ分析は、ビジネス上の意思決定効率を改善するためにSQLを通じて実装されます。

MySQLの基本操作には、データベース、テーブルの作成、およびSQLを使用してデータのCRUD操作を実行することが含まれます。 1.データベースの作成:createdatabasemy_first_db; 2。テーブルの作成:createTableBooks(idintauto_incrementprimarykey、titlevarchary(100)notnull、authorvarchar(100)notnull、published_yearint); 3.データの挿入:InsertIntoBooks(タイトル、著者、公開_year)VA


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

Dreamweaver Mac版
ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。
