2023年6月21日发(作者:)
golang——databasesql包学习1、database/sql包sql包提供了保证SQL或类SQL数据库的泛⽤接⼝。使⽤sql包时必须注⼊(⾄少)⼀个数据库驱动。(1)获取mysql driver:go get -v /go-sql-driver/mysql(2)代码⽰例:package mainimport ( "database/sql" "fmt" "log" "time" _ "/go-sql-driver/mysql")// 检查错误func checkErr(err error) { if err != nil { n(err) }}// 事务错误func checkTxErr(err error, tx *) { if err != nil { n(err) err = ck() checkErr(err) }}// 数据库实体type User struct { ID int Name string Age int Sex int AddDate }func main() { //1、获取数据库连接 db, err := ("mysql", "root:123456@tcp(127.0.0.1:3306)/test?parseTime=true") checkErr(err) defer () n("数据库连接成功") //2、判断连接是否有效 err = () checkErr(err) n("数据库连接有效") //3、创建表 sql := ` CREATE TABLE IF NOT EXISTS users( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, age INT NOT NULL, sex TINYINT, add_date DATETIME, PRIMARY KEY(id)
) ` _, err = (sql) checkErr(err) //4、添加数据 // sql = "INSERT INTO users (name,age,sex,add_date) VALUES (?,?,?,?)" // res, err := (sql, "张三", 18, 1, ()) // checkErr(err) // n(sertId()) //5、查询数据 sql = "SELECT id,name,age,sex,add_date FROM users" rows, err := (sql) checkErr(err) defer () user := User{} for () { err = (&, &, &, &, &e) checkErr(err) n(user, ("2006/01/02 15:04:05")) } err = () checkErr(err) //6、查询⼀⾏ sql = "SELECT id,name,age,sex,add_date FROM users" row := ow(sql) err = (&, &, &, &, &e) checkErr(err) n(user) //7、命令 sql = "UPDATE users SET name=? WHERE id=?;" stmt, err := e(sql) checkErr(err) defer () result, err := ("李四", 1) checkErr(err) n(fected()) //8、查询 sql = "SELECT id,name,age,sex,add_date FROM users WHERE id=?" stmt2, err := e(sql) checkErr(err) defer () row = ow(1) err = (&, &, &, &, &e) checkErr(err) n(user) //9、事务 tx, err := () checkErr(err) _, err = ("UPDATE users SET age=? WHERE id=?", 20, 1) checkTxErr(err, tx) _, err = ("UPDATE users SET sex=? WHERE id=?", 1, 1) checkTxErr(err, tx) err = () checkTxErr(err, tx) //10、查询⼀⾏ sql = "SELECT id,name,age,sex,add_date FROM users" row = ow(sql) err = (&, &, &, &, &e) checkErr(err) n(user)}2、数据库2.1、type DB struct{}DB是⼀个数据库句柄,代表⼀个具有零到多个底层连接的连接池。它可以安全的被多个go程同时使⽤。连接池的⼤⼩可以⽤SetMaxIdleConns⽅法控制。2.2、常⽤⽅法(1)func Open(driverName, dataSourceName string) (*DB, error)打开数据库,返回数据库句柄,DB可以安全的被多个go程同时使⽤,并会维护⾃⾝的闲置连接池。Open函数只需调⽤⼀次,很少需要关闭DB。(2)func (db *DB) Driver() 返回数据库下层驱动。(3)func (db *DB) Ping() error检查与数据库的连接是否仍有效,如果需要会创建连接。(4)func (db *DB) Close() error关闭数据库,释放任何打开的资源。⼀般不会关闭DB,因为DB句柄通常被多个go程共享,并长期活跃。(5)func (db *DB) SetMaxOpenConns(n int)设置与数据库建⽴连接的最⼤数⽬。如果n⼤于0且⼩于最⼤闲置连接数,会将最⼤闲置连接数减⼩到匹配最⼤开启连接数的限制。如果n <= 0,不会限制最⼤开启连接数,默认为0(⽆限制)。(6)func (db *DB) SetMaxIdleConns(n int)设置连接池中的最⼤闲置连接数。如果n⼤于最⼤开启连接数,则新的最⼤闲置连接数会减⼩到匹配最⼤开启连接数的限制。如果n <= 0,不会保留闲置连接。(7)func (db *DB) Exec(query string, args ...interface{}) (Result, error)执⾏⼀次命令(包括查询、删除、更新、插⼊等),不返回任何执⾏结果。参数args表⽰query中的占位参数。(8)func (db *DB) Query(query string, args ...interface{}) (*Rows, error)执⾏⼀次查询,返回多⾏结果(即Rows),⼀般⽤于执⾏select命令。(9)func (db *DB) QueryRow(query string, args ...interface{}) *Row执⾏⼀次查询,并期望返回最多⼀⾏结果(即Row)。总是返回⾮nil的值,直到返回值的Scan⽅法被调⽤时,才会返回被延迟的错误。(10)func (db *DB) Prepare(query string) (*Stmt, error)创建⼀个准备好的状态⽤于之后的查询和命令。返回值可以同时执⾏多个查询和命令。(11)func (db *DB) Begin() (*Tx, error)开始⼀个事务。隔离⽔平由数据库驱动决定。3、数据表3.1、type Rows{}Rows是查询的结果。它的游标指向结果集的第零⾏,使⽤Next⽅法来遍历各⾏结果。3.2、常⽤⽅法(1)func (rs *Rows) Columns() ([]string, error)返回列名。如果Rows已经关闭会返回错误。(2)func (rs *Rows) Scan(dest ...interface{}) errorScan将当前⾏各列结果填充进dest指定的各个值中。如果某个参数的类型为*[]byte,Scan会保存对应数据的拷贝,该拷贝为调⽤者所有,可以安全的,修改或⽆限期的保存。如果参数类型为*RawBytes可以避免拷贝;参见RawBytes的⽂档获取其使⽤的约束。如果某个参数的类型为*interface{},Scan会不做转换的拷贝底层驱动提供的值。如果值的类型为[]byte,会进⾏数据的拷贝,调⽤者可以安全使⽤该值。(3)func (rs *Rows) Next() boolNext准备⽤于Scan⽅法的下⼀⾏结果。如果成功会返回真,如果没有下⼀⾏或者出现错误会返回假。每⼀次调⽤Scan⽅法,甚⾄包括第⼀次调⽤该⽅法,都必须在前⾯先调⽤Next⽅法。(4)func (rs *Rows) Close() error关闭Rows,阻⽌对其更多的列举。如果Next⽅法返回假,Rows会⾃动关闭。检查Err⽅法结果的条件。Close⽅法是幂等的(多次调⽤⽆效的成功),不影响Err⽅法的结果。(5)func (rs *Rows) Err() errorErr返回可能的、在迭代时出现的错误。Err需在显式或隐式调⽤Close⽅法后调⽤。4、数据⾏4.1、type Row{}QueryRow⽅法返回Row,代表单⾏查询结果。4.2、常⽤⽅法(1)func (r *Row) Scan(dest ...interface{}) errorScan将该⾏查询结果各列分别保存进dest参数指定的值中。如果该查询匹配多⾏,Scan会使⽤第⼀⾏结果并丢弃其余各⾏。如果没有匹配查询的⾏,Scan会返回ErrNoRows。5、SQL命令状态5.1、type Stmt struct{}Stmt是准备好的状态。Stmt可以安全的被多个go程同时使⽤。5.2、常⽤⽅法(1)func (s *Stmt) Exec(args ...interface{}) (Result, error)使⽤提供的参数执⾏准备好的命令状态,返回Result类型的该状态执⾏结果的总结。(2)func (s *Stmt) Query(args ...interface{}) (*Rows, error)使⽤提供的参数执⾏准备好的查询状态,返回Rows类型查询结果。(3)func (s *Stmt) QueryRow(args ...interface{}) *Row使⽤提供的参数执⾏准备好的查询状态。如果在执⾏时遇到了错误,该错误会被延迟,直到返回值的Scan⽅法被调⽤时才释放。返回值总是⾮nil的。如果没有查询到结果,*Row类型返回值的Scan⽅法会返回ErrNoRows;否则,Scan⽅法会扫描结果第⼀⾏并丢弃其余⾏。(4)func (s *Stmt) Close() error关闭状态。6、事务6.1、type Tx struct{}Tx代表⼀个进⾏中的数据库事务。⼀次事务必须以对Commit或Rollback的调⽤结束。调⽤Commit或Rollback后,所有对事务的操作都会失败并返回错误值ErrTxDone。6.2、常⽤⽅法(1)func (tx *Tx) Exec(query string, args ...interface{}) (Result, error)执⾏命令,但不返回结果。例如执⾏insert和update。(2)func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error)执⾏查询并返回零到多⾏结果(Rows),⼀般执⾏select命令。(3)func (tx *Tx) QueryRow(query string, args ...interface{}) *Row执⾏查询并期望返回最多⼀⾏结果(Row)。总是返回⾮nil的结果,查询失败的错误会延迟到在调⽤该结果的Scan⽅法时释放。(4)func (tx *Tx) Prepare(query string) (*Stmt, error)准备⼀个专⽤于该事务的状态。返回的该事务专属状态操作在Tx递交会回滚后不能再使⽤。(5)func (tx *Tx) Stmt(stmt *Stmt) *Stmt使⽤已存在的状态⽣成⼀个该事务特定的状态。(6)func (tx *Tx) Commit() error提交事务。(7)func (tx *Tx) Rollback() error回滚事务。
2023年6月21日发(作者:)
golang——databasesql包学习1、database/sql包sql包提供了保证SQL或类SQL数据库的泛⽤接⼝。使⽤sql包时必须注⼊(⾄少)⼀个数据库驱动。(1)获取mysql driver:go get -v /go-sql-driver/mysql(2)代码⽰例:package mainimport ( "database/sql" "fmt" "log" "time" _ "/go-sql-driver/mysql")// 检查错误func checkErr(err error) { if err != nil { n(err) }}// 事务错误func checkTxErr(err error, tx *) { if err != nil { n(err) err = ck() checkErr(err) }}// 数据库实体type User struct { ID int Name string Age int Sex int AddDate }func main() { //1、获取数据库连接 db, err := ("mysql", "root:123456@tcp(127.0.0.1:3306)/test?parseTime=true") checkErr(err) defer () n("数据库连接成功") //2、判断连接是否有效 err = () checkErr(err) n("数据库连接有效") //3、创建表 sql := ` CREATE TABLE IF NOT EXISTS users( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, age INT NOT NULL, sex TINYINT, add_date DATETIME, PRIMARY KEY(id)
) ` _, err = (sql) checkErr(err) //4、添加数据 // sql = "INSERT INTO users (name,age,sex,add_date) VALUES (?,?,?,?)" // res, err := (sql, "张三", 18, 1, ()) // checkErr(err) // n(sertId()) //5、查询数据 sql = "SELECT id,name,age,sex,add_date FROM users" rows, err := (sql) checkErr(err) defer () user := User{} for () { err = (&, &, &, &, &e) checkErr(err) n(user, ("2006/01/02 15:04:05")) } err = () checkErr(err) //6、查询⼀⾏ sql = "SELECT id,name,age,sex,add_date FROM users" row := ow(sql) err = (&, &, &, &, &e) checkErr(err) n(user) //7、命令 sql = "UPDATE users SET name=? WHERE id=?;" stmt, err := e(sql) checkErr(err) defer () result, err := ("李四", 1) checkErr(err) n(fected()) //8、查询 sql = "SELECT id,name,age,sex,add_date FROM users WHERE id=?" stmt2, err := e(sql) checkErr(err) defer () row = ow(1) err = (&, &, &, &, &e) checkErr(err) n(user) //9、事务 tx, err := () checkErr(err) _, err = ("UPDATE users SET age=? WHERE id=?", 20, 1) checkTxErr(err, tx) _, err = ("UPDATE users SET sex=? WHERE id=?", 1, 1) checkTxErr(err, tx) err = () checkTxErr(err, tx) //10、查询⼀⾏ sql = "SELECT id,name,age,sex,add_date FROM users" row = ow(sql) err = (&, &, &, &, &e) checkErr(err) n(user)}2、数据库2.1、type DB struct{}DB是⼀个数据库句柄,代表⼀个具有零到多个底层连接的连接池。它可以安全的被多个go程同时使⽤。连接池的⼤⼩可以⽤SetMaxIdleConns⽅法控制。2.2、常⽤⽅法(1)func Open(driverName, dataSourceName string) (*DB, error)打开数据库,返回数据库句柄,DB可以安全的被多个go程同时使⽤,并会维护⾃⾝的闲置连接池。Open函数只需调⽤⼀次,很少需要关闭DB。(2)func (db *DB) Driver() 返回数据库下层驱动。(3)func (db *DB) Ping() error检查与数据库的连接是否仍有效,如果需要会创建连接。(4)func (db *DB) Close() error关闭数据库,释放任何打开的资源。⼀般不会关闭DB,因为DB句柄通常被多个go程共享,并长期活跃。(5)func (db *DB) SetMaxOpenConns(n int)设置与数据库建⽴连接的最⼤数⽬。如果n⼤于0且⼩于最⼤闲置连接数,会将最⼤闲置连接数减⼩到匹配最⼤开启连接数的限制。如果n <= 0,不会限制最⼤开启连接数,默认为0(⽆限制)。(6)func (db *DB) SetMaxIdleConns(n int)设置连接池中的最⼤闲置连接数。如果n⼤于最⼤开启连接数,则新的最⼤闲置连接数会减⼩到匹配最⼤开启连接数的限制。如果n <= 0,不会保留闲置连接。(7)func (db *DB) Exec(query string, args ...interface{}) (Result, error)执⾏⼀次命令(包括查询、删除、更新、插⼊等),不返回任何执⾏结果。参数args表⽰query中的占位参数。(8)func (db *DB) Query(query string, args ...interface{}) (*Rows, error)执⾏⼀次查询,返回多⾏结果(即Rows),⼀般⽤于执⾏select命令。(9)func (db *DB) QueryRow(query string, args ...interface{}) *Row执⾏⼀次查询,并期望返回最多⼀⾏结果(即Row)。总是返回⾮nil的值,直到返回值的Scan⽅法被调⽤时,才会返回被延迟的错误。(10)func (db *DB) Prepare(query string) (*Stmt, error)创建⼀个准备好的状态⽤于之后的查询和命令。返回值可以同时执⾏多个查询和命令。(11)func (db *DB) Begin() (*Tx, error)开始⼀个事务。隔离⽔平由数据库驱动决定。3、数据表3.1、type Rows{}Rows是查询的结果。它的游标指向结果集的第零⾏,使⽤Next⽅法来遍历各⾏结果。3.2、常⽤⽅法(1)func (rs *Rows) Columns() ([]string, error)返回列名。如果Rows已经关闭会返回错误。(2)func (rs *Rows) Scan(dest ...interface{}) errorScan将当前⾏各列结果填充进dest指定的各个值中。如果某个参数的类型为*[]byte,Scan会保存对应数据的拷贝,该拷贝为调⽤者所有,可以安全的,修改或⽆限期的保存。如果参数类型为*RawBytes可以避免拷贝;参见RawBytes的⽂档获取其使⽤的约束。如果某个参数的类型为*interface{},Scan会不做转换的拷贝底层驱动提供的值。如果值的类型为[]byte,会进⾏数据的拷贝,调⽤者可以安全使⽤该值。(3)func (rs *Rows) Next() boolNext准备⽤于Scan⽅法的下⼀⾏结果。如果成功会返回真,如果没有下⼀⾏或者出现错误会返回假。每⼀次调⽤Scan⽅法,甚⾄包括第⼀次调⽤该⽅法,都必须在前⾯先调⽤Next⽅法。(4)func (rs *Rows) Close() error关闭Rows,阻⽌对其更多的列举。如果Next⽅法返回假,Rows会⾃动关闭。检查Err⽅法结果的条件。Close⽅法是幂等的(多次调⽤⽆效的成功),不影响Err⽅法的结果。(5)func (rs *Rows) Err() errorErr返回可能的、在迭代时出现的错误。Err需在显式或隐式调⽤Close⽅法后调⽤。4、数据⾏4.1、type Row{}QueryRow⽅法返回Row,代表单⾏查询结果。4.2、常⽤⽅法(1)func (r *Row) Scan(dest ...interface{}) errorScan将该⾏查询结果各列分别保存进dest参数指定的值中。如果该查询匹配多⾏,Scan会使⽤第⼀⾏结果并丢弃其余各⾏。如果没有匹配查询的⾏,Scan会返回ErrNoRows。5、SQL命令状态5.1、type Stmt struct{}Stmt是准备好的状态。Stmt可以安全的被多个go程同时使⽤。5.2、常⽤⽅法(1)func (s *Stmt) Exec(args ...interface{}) (Result, error)使⽤提供的参数执⾏准备好的命令状态,返回Result类型的该状态执⾏结果的总结。(2)func (s *Stmt) Query(args ...interface{}) (*Rows, error)使⽤提供的参数执⾏准备好的查询状态,返回Rows类型查询结果。(3)func (s *Stmt) QueryRow(args ...interface{}) *Row使⽤提供的参数执⾏准备好的查询状态。如果在执⾏时遇到了错误,该错误会被延迟,直到返回值的Scan⽅法被调⽤时才释放。返回值总是⾮nil的。如果没有查询到结果,*Row类型返回值的Scan⽅法会返回ErrNoRows;否则,Scan⽅法会扫描结果第⼀⾏并丢弃其余⾏。(4)func (s *Stmt) Close() error关闭状态。6、事务6.1、type Tx struct{}Tx代表⼀个进⾏中的数据库事务。⼀次事务必须以对Commit或Rollback的调⽤结束。调⽤Commit或Rollback后,所有对事务的操作都会失败并返回错误值ErrTxDone。6.2、常⽤⽅法(1)func (tx *Tx) Exec(query string, args ...interface{}) (Result, error)执⾏命令,但不返回结果。例如执⾏insert和update。(2)func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error)执⾏查询并返回零到多⾏结果(Rows),⼀般执⾏select命令。(3)func (tx *Tx) QueryRow(query string, args ...interface{}) *Row执⾏查询并期望返回最多⼀⾏结果(Row)。总是返回⾮nil的结果,查询失败的错误会延迟到在调⽤该结果的Scan⽅法时释放。(4)func (tx *Tx) Prepare(query string) (*Stmt, error)准备⼀个专⽤于该事务的状态。返回的该事务专属状态操作在Tx递交会回滚后不能再使⽤。(5)func (tx *Tx) Stmt(stmt *Stmt) *Stmt使⽤已存在的状态⽣成⼀个该事务特定的状态。(6)func (tx *Tx) Commit() error提交事务。(7)func (tx *Tx) Rollback() error回滚事务。
发布评论