注入數據庫驅動 github.com/godror/godror
安裝過程:
首先在 $GOPATH/src 下新建目錄golang.org/x/,然后再cd到x下執行git clone https://github.com/golang/xerrors.git
完成后就可以執行go get github.com/godror/godror,等待一段時間就好了。
連接
package main import ( "database/sql" "fmt" _ "github.com/godror/godror" ) var db *sql.DB //數據庫配置 const ( host = "localhost" port = 1521 user = "username" sqlpassword = "password" dbname = "orcl" ) func initsql() { // 用戶名/密碼@IP:端口/實例名 osqlInfo := fmt.Sprintf("%s/%s@%s:%d/%s", user, sqlpassword, host, port, dbname) DB, err := sql.Open("godror", osqlInfo) if err != nil { panic(err) } err = DB.Ping() if err != nil { panic(err) } db = DB } func main() { initsql()
defer db.Close()
}
增刪查改
oracle的占位符是“:name”
func (db *DB) Exec(query string, args ...interface{}) (Result, error) //增刪改 func (s *Stmt) Query(args ...interface{}) (*Rows, error)//查
//增加 sqlStatement := "INSERT INTO XXXTABLE(X1, X2, X3) VALUES (:x1, :x1, :x3)" stmt, err := db.Prepare(sqlStatement) defer stmt.Close() if err != nil { panic(err) } _, err = stmt.Exec(x1, x2, x3) if err != nil { panic(err) }
//刪除 sqlStatement := "DELETE FROM XXXTABLE WHERE X1=:x1" stmt, err := db.Prepare(sqlStatement) defer stmt.Close() if err != nil { panic(err) } _, err = stmt.Exec(x1) if err != nil { panic(err) }
//更改 sqlStatement := "UPDATE XXXTABLE SET X1=:x1 WHERE X2=:x2" stmt, err := db.Prepare(sqlStatement) defer stmt.Close() if err != nil { panic(err) } _, err = stmt.Exec(x1, x2) if err != nil { panic(err) }
//查找 sqlStatement := "SELECT X2,X3 FROM XXXTABLE WHERE X1=:x1" stmt, err := db.Prepare(sqlStatement) defer stmt.Close() if err != nil { panic(err) } rows, err := stmt.Query(x1) defer rows.Close() if err != nil { panic(err) } for rows.Next() { rows.Scan(&x2, &x3) }
事務
func (db *DB) Begin() (*Tx, error)
使用這個函數開啟一個事務,返回事務對象Tx
Tx代表一個進行中的數據庫事務。
一次事務必須以對Commit或Rollback的調用結束。
調用Commit或Rollback后,所有對事務的操作都會失敗並返回錯誤值ErrTxDone。
Tx 同樣擁有 exec,query,queryRow方法,同時增加了提交事務和回滾事務的方法:
func (tx *Tx) Commit() error Commit遞交事務。
func (tx *Tx) Rollback() error Rollback放棄並回滾事務。
簡單演示
//開啟事務tx,若后續任何操作有出錯,則回滾 tx, err := db.Begin() if err != nil { panic(err) } sqlStatement := "UPDATE XXXTABLE SET X1=:x1 WHERE X2=:x2" stmt, err := tx.Prepare(sqlStatement) defer stmt.Close() if err != nil { tx.Rollback() //回滾 panic(err) } _, err = stmt.Exec(x1, x2) if err != nil { tx.Rollback() //回滾 panic(err) } tx.Commit() //提交