go连接oracle数据库操作(godror)
注入数据库驱动 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() //提交