go官方仅提供了database package,database package下有两个包sql,sql/driver。这两个包用来定义操作数据库的接口,这就保证了无论使用哪种数据库,他们的操作方式都是相同的。
其中,mysql有两个包,一个是mymysql,一个是go-sql-driver/mysql,两个package都是纯go实现。我选择了后者,因为后者的效率更高一点,benchmark在这里:https://github.com/go-sql-driver/sql-benchmark 2、基本用法 QueryRow 执行数据库至多返回1行的Query操作,返回*Row PrePare 准备一个数据库query操作,返回一个*Stmt,用于后续query或执行。这个Stmt可以被多次执行,或者并发执行 Exec 执行数不返回任何rows的据库语句,例如delete操作 Stmt的主要方法: 一段简单的测试代码: package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" "log" ) func insert(db *sql.DB) { stmt, err := db.Prepare("INSERT INTO user(username, password) VALUES(?, ?)") defer stmt.Close() if err != nil { log.Println(err) return } stmt.Exec("guotie", "guotie") stmt.Exec("testuser", "123123") } func main() { db, err := sql.Open("mysql", "root:guotie@/hello") if err != nil { log.Fatalf("Open database error: %s\n", err) } defer db.Close() err = db.Ping() if err != nil { log.Fatal(err) } insert(db) rows, err := db.Query("select id, username from user where id = ?", 1) if err != nil { log.Println(err) } defer rows.Close() var id int var name string for rows.Next() { err := rows.Scan(&id, &name) if err != nil { log.Fatal(err) } log.Println(id, name) } err = rows.Err() if err != nil { log.Fatal(err) } } |
|
来自: 昵称26620076 > 《Go语言》