<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## 1\. 下載依賴 ~~~ go get -u github.com/go-sql-driver/mysql ~~~ ## 2\. 使用Mysql驅動 ~~~ func Open(driverName, dataSourceName string) (*DB, error) ~~~ Open方法打開一個指定的數據庫 driverName為驅動名稱,例mysql dataSourceName為數據庫連接信息 返回DB 和 error demo1 ~~~ func main() { // dsn: Data Source Name // 用戶名為root,密碼為123456,數據庫為test dsn := "root:123456@tcp(127.0.0.1:3306)/test" ? ? ? ?// Open()方法對dsn的一個格式校驗,并沒有實際連接到數據庫 db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } defer db.Close() } ~~~ ### **Mysql Demo:** ~~~ // 定義一個全局變量 var db *sql.DB ? // 定義初始化mysql的方法 func initMysql() (err error) { // dsn: Data Source Name // 用戶名為root,密碼為123456,數據庫為test dsn := "root:123456@tcp(127.0.0.1:3306)/test" ? // Open()方法對dsn的一個格式校驗,并沒有實際連接到數據庫 db, err = sql.Open("mysql", dsn) if err != nil { panic(err) } ? // 與數據庫建立連接 err = db.Ping() if err != nil { fmt.Printf("connect to db failed, err:%v\n", err) return } return } ? func main() { if err := initMysql(); err != nil { panic(err) } defer db.Close() fmt.Println("connected to db...") } ~~~ ## 3\. 單行查詢 單行查詢`db.QueryRow()`執行一次查詢,并期望返回最多一行結果(即Row)。QueryRow總是返回非nil的值,直到返回值的Scan方法被調用時,才會返回被延遲的錯誤。 ~~~ func (db *DB) QueryRow(query string, args ...interface{}) *Row ~~~ 代碼示例: ~~~ // 單行查詢 func queryRowDemo() { // sql語句 sqlStr := "select id, name, age from user where id=?" var u user err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.name, &u.age) if err != nil { fmt.Printf("scan failed, err:%v\n", err) return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age) } ~~~ ## 4\. 多行查詢 多行查詢`db.Query()`執行一次查詢,返回多行結果(即Rows),一般用于執行select命令。參數args表示query中的占位參數。 ~~~ func (db *DB) Query(query string, args ...interface{}) (*Rows, error) ~~~ 代碼示例: ~~~ // 多行查詢 func queryMultiRowDemo() { sqlStr := "select id, name, age from user where id > ?" rows, err := db.Query(sqlStr, 0) if err != nil { fmt.Printf("query failed, err:%v\n", err) return } // 關閉rows釋放持有的數據庫鏈接 defer rows.Close() ? // 循環讀取結果集中的數據 for rows.Next() { var u user err := rows.Scan(&u.id, &u.name, &u.age) if err != nil { fmt.Printf("scan failed, err:%v\n", err) return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age) } } ~~~ ## 5\. 插入數據 插入、更新和刪除操作都使用`Exec`方法。 ~~~ func (db *DB) Exec(query string, args ...interface{}) (Result, error) ~~~ Exec執行一次命令(包括查詢、刪除、更新、插入等),返回的Result是對已執行的SQL命令的總結。參數args表示query中的占位參數。 代碼示例: ~~~ // 插入數據 func insertRowDemo(name string, age int) { sqlStr := "insert into user(name, age) values (?,?)" result, err := db.Exec(sqlStr, name, age) if err != nil { fmt.Printf("insert failed, err:%v\n", err) return } // RowsAffected()方法,表示影響的行數 // num, err := result.RowsAffected() lastId, err := result.LastInsertId() // 新插入數據的id if err != nil { fmt.Printf("get lastinsert ID failed, err:%v\n", err) return } fmt.Printf("insert successfully, the id is %d.\n", lastId) } ~~~ ## 6\. 更新數據 ~~~ // 更新數據 func updateRowDemo() { sqlStr := "update user set age=? where id = ?" result, err := db.Exec(sqlStr, 23, 1) if err != nil { fmt.Printf("update data failed, err:%v\n", err) return } // 操作影響的行數 num, err := result.RowsAffected() if err != nil { fmt.Printf("get RowsAffected failed, err:%v\n", err) return } ? fmt.Printf("update data successfully, %d rows affected\n", num) } ~~~ ## 7\. 刪除數據 ~~~ // 刪除數據 func deleteRowDemo() { sqlStr := "delete from user where id = ?" result, err := db.Exec(sqlStr, 3) if err != nil { fmt.Printf("delete failed, err:%v\n", err) return } num, err := result.RowsAffected() // 操作影響的行數 if err != nil { fmt.Printf("get RowsAffected failed, err:%v\n", err) return } fmt.Printf("delete success, affected rows:%d\n", num) } ~~~ ## 8\. Go實現Mysql預處理 為什么要預處理? 1. 優化MySQL服務器重復執行SQL的方法,可以提升服務器性能,提前讓服務器編譯,一次編譯多次執行,節省后續編譯的成本。 2. 避免SQL注入問題 `database/sql`中使用下面的`Prepare`方法來實現預處理操作。 ~~~ func (db *DB) Prepare(query string) (*Stmt, error) ~~~ ~~~ // 預處理 func prepareQueryDemo() { sqlStr := "select id, name, age from user where id > ?" stmt, err := db.Prepare(sqlStr) if err != nil { fmt.Printf("prepare failed, err:%v\n", err) return } defer stmt.Close() rows, err := stmt.Query(0) if err != nil { fmt.Printf("query 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 failed, err:%v\n", err) return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age) } } ~~~ ## 9\. Go實現Mysql事務 Go語言中使用以下三個方法實現MySQL中的事務操作。 開始事務 ~~~ func (db *DB) Begin() (*Tx, error) ~~~ 提交事務 ~~~ func (tx *Tx) Commit() error ~~~ 回滾事務 ~~~ func (tx *Tx) Rollback() error ~~~ 示例代碼 ~~~ // 事務操作 func transactionDemo() { tx, err := db.Begin() // 開啟事務 if err != nil { if tx != nil { tx.Rollback() // 回滾 } fmt.Printf("begin trans failed, err:%v\n", err) return } sqlStr1 := "update user set age=30 where id=?" result1, err := tx.Exec(sqlStr1, 1) if err != nil { tx.Rollback() // 回滾 fmt.Printf("exec sql failed, err:%v\n", err) return } num1, err := result1.RowsAffected() if err != nil { tx.Rollback() // 回滾 fmt.Printf("exec result.RowsAffected failed, err:%v\n", err) return } ? sqlStr2 := "update user set age=30 where id=?" result2, err := tx.Exec(sqlStr2, 2) if err != nil { tx.Rollback() // 回滾 fmt.Printf("exec sql failed, err:%v\n", err) return } num2, err := result2.RowsAffected() if err != nil { tx.Rollback() // 回滾 fmt.Printf("exec result.RowsAffected failed, err:%v\n", err) return } ? fmt.Println(num1, num2) if num1 == 1 && num2 == 1 { fmt.Println("事務提交啦。。。") tx.Commit() } else { tx.Rollback() fmt.Println("事務回滾啦。。。") } fmt.Println("exec trans success!") } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看