<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 執行數據庫事務接口 在處理數據庫連接服務時,測試相對困難。原因在于Go的鴨子模型導致在運行時模擬很不方便。我建議在使用數據庫時使用存儲接口,使用這樣的方式模擬數據庫事務接口同樣可行,在后續章節會討論這一點。本節將著眼于對數據庫事務的操作。 我們將改寫上一節的create和query文件,最終的輸出很類似,但是create和query操作將包含在事務中。 ### 實踐 1. 建立 transaction.go: ``` package dbinterface import "database/sql" // DB是sql.DB或sql.Transaction滿足的接口 type DB interface { Exec(query string, args ...interface{}) (sql.Result, error) Prepare(query string) (*sql.Stmt, error) Query(query string, args ...interface{}) (*sql.Rows, error) QueryRow(query string, args ...interface{}) *sql.Row } // Transaction可以執行任何 Query, Commit, Rollback, 和 Stmt 操作 type Transaction interface { DB Commit() error Rollback() error Stmt(stmt *sql.Stmt) *sql.Stmt } ``` 2. 建立 create.go: ``` package dbinterface import _ "github.com/go-sql-driver/mysql" // Create建立example表并填充數據 func Create(db DB) error { // create the database if _, err := db.Exec("CREATE TABLE example (name VARCHAR(20), created DATETIME)"); err != nil { return err } if _, err := db.Exec(`INSERT INTO example (name, created) values ("Aaron", NOW())`); err != nil { return err } return nil } ``` 3. 建立 exec.go: ``` package dbinterface func Exec(db DB) error { // 依然不推薦這么寫 因為沒有處理所返回的可能存在的錯誤 defer db.Exec("DROP TABLE example") if err := Create(db); err != nil { return err } if err := Query(db); err != nil { return err } return nil } ``` 4. 建立 main.go: ``` package main import ( "github.com/agtorre/go-cookbook/chapter5/database" "github.com/agtorre/go-cookbook/chapter5/dbinterface" _ "github.com/go-sql-driver/mysql" ) func main() { db, err := database.Setup() if err != nil { panic(err) } tx, err := db.Begin() if err != nil { panic(err) } defer tx.Rollback() if err := dbinterface.Exec(db); err != nil { panic(err) } if err := tx.Commit(); err != nil { panic(err) } } ``` 5. 這會輸出: ``` Results: Name: Aaron Created: 2017-02-16 20:00:00 +0000 UTC ``` ### 說明 本節與上一節以非常相似的方式工作,演示了使用事務并生成適用于sql.DB連接和sql.Transaction對象的通用數據庫函數。我們會在第八章看到對這些模擬接口的測試使用。 * * * * 學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。 Golang中國(211938256) beego實戰(258969317) Go實踐(386056972)
                  <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>

                              哎呀哎呀视频在线观看