go提供了一些标准库让我们和数据库交互, database/sql是golang的标准库之一,它提供了一系列接口方法,用于访问关系数据库。 不同的数据库驱动,需要去实现各种方法
func main(){
db,err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/htadmin")
}
此时会报错,说mysql 驱动不存在。安装mysql驱动
go get github.com/go-sql-driver/mysql
---------------------------------
import(
"database/sql"
_ "github.com/go-sql-driver/mysql" //需要引入这个包
)
获取到db对象,查询用db.Query(sql), DDL操作用db.Exec(sql),用Scan方法把结果赋值给模型实例
模型结构(和表对应)
type User struct {
ID int64 `db:"id"`
UserId int64 `db:"user_id"`
}
func main(){
s := new(User);
db,err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/htadmin")
rows,err := db.Query("select id,user_id from user_addresses") //返回的字段数要和scan接受的参数一致
results,err:=db.Exec("UPDATE message SET salary=? where id=?",8900,3)//这是更新语句
for rows.Next(){
rows.Scan(&s.UserId, &s.ID) //把查询出来的字段赋值给模型实例
fmt.Println(s)
}
}
网上找的封装的db操作方法
import (
"database/sql"
"fmt"
"search/config"
"strings"
)
type DbRow map[string]interface{}
type Dblib struct {
db *sql.DB
}
func NewDblib() (*Dblib, error) {
db, err := sql.Open("mysql", config.USERNAME+":"+config.PASSWORD+"@tcp("+config.MYSQL_SERVER+")/"+config.DATABASE)
if err != nil {
return nil, err
}
err = db.Ping()
if err != nil {
return nil, err
}
p := new(Dblib)
p.db = db
return p, nil
}
func scanRow(rows *sql.Rows) (DbRow, error) {
columns, _ := rows.Columns()
vals := make([]interface{}, len(columns))
valsPtr := make([]interface{}, len(columns))
for i := range vals {
valsPtr[i] = &vals[i]
}
err := rows.Scan(valsPtr...)
if err != nil {
return nil ,err
}
r := make(DbRow)
for i, v := range columns {
if va, ok := vals[i].([]byte); ok {
r[v] = string(va)
} else {
r[v] = vals[i]
}
}
return r, nil
}
// 获取一行记录
func (d *Dblib) GetOne(sql string, args ...interface{}) (DbRow, error) {
rows, err := d.db.Query(sql, args...)
if err != nil {
return nil, err
}
defer rows.Close()
rows.Next()
result, err := scanRow(rows)
return result, err
}
// 获取多行记录
func (d *Dblib) GetAll(sql string, args ...interface{}) ([]DbRow, error) {
rows, err := d.db.Query(sql, args...)
if err != nil {
return nil, err
}
defer rows.Close()
result := make([]DbRow, 0)
for rows.Next() {
r, err := scanRow(rows)
if err != nil {
continue
}
result = append(result, r)
}
return result, nil
}
// 写入记录
func (d *Dblib) Insert(table string, data DbRow) (int64, error) {
fields := make([]string, 0)
vals := make([]interface{}, 0)
placeHolder := make([]string, 0)
for f, v := range data {
fields = append(fields, f)
vals = append(vals, v)
placeHolder = append(placeHolder, "?")
}
sql := fmt.Sprintf("INSERT INTO %s(%s) VALUES(%s) ", table, strings.Join(fields, ","), strings.Join(placeHolder, ","))
result, err := d.db.Exec(sql, vals...)
if err != nil {
return 0, err
}
lID, err := result.LastInsertId()
if err != nil {
return 0, err
}
return lID, nil
}
// 更新记录
func (d *Dblib) Update(table, condition string, data DbRow, args ...interface{}) (int64, error) {
params := make([]string, 0)
vals := make([]interface{}, 0)
for f, v := range data {
params = append(params, f + "=?")
vals = append(vals, v)
}
sql := "UPDATE %s SET %s"
if condition != "" {
sql += " WHERE %s"
sql = fmt.Sprintf(sql, table, strings.Join(params, ","), condition)
vals = append(vals, args...)
} else {
sql = fmt.Sprintf(sql, table, strings.Join(params, ","))
}
result, err := d.db.Exec(sql, vals...)
if err != nil {
return 0, err
}
aID, err := result.RowsAffected()
if err != nil {
return 0, err
}
return aID, nil
}
// 删除记录
func (d *Dblib) Delete(table, condition string, args ...interface{}) (int64, error) {
sql := "DELETE FROM %s "
if condition != "" {
sql += "WHERE %s"
sql = fmt.Sprintf(sql, table, condition)
} else {
sql = fmt.Sprintf(sql, table)
}
result, err := d.db.Exec(sql, args...)
if err != nil {
return 0, err
}
aID, err := result.RowsAffected()
if err != nil {
return 0, err
}
return aID, nil
}
GO还有一些第三方库,方便我们和数据库交互,比如:
gorm操作数据库
http://gorm.book.jasperxu.com/crud.html#c 中文文档链接
1.安装第三方库
go get -u github.com/jinzhu/gorm
//创建User模型
type User struct{
gorm.Model
Name string `gorm:"column:name"` //gorm:"column:name"指定表的字段
Email string `gorm:"column:email"`
Password string `gorm:"column:password"`
}
func (u User) TableName() string{
return "users" //这就是User模型绑定的表名,如果不指定,默认是模型复数
}
func main(){
db,err := gorm.Open("mysql","root:123456@tcp(127.0.0.1:3306)/htadmin")
defer db.Close()
user:=User{ //创建一个模型对象并且实例化
Name: "张三",
Email: "[email protected]",
Password: "$10$wqvwRQiHYOBCrR6dUdEzY.eYxC8XI9I6BUWPM8K.DzMEsjw66bX2K",
}
res := db.NewRecord(user)//检测主键是否存在,返回true
db.Create(&user) //执行插入操作
//查询操作,获取结果集one
var one []User
db.Table("users").Select("id,name,email,password").Where("name=?", "张三").Scan(&one)
for _,v := range one{
fmt.Println(v.ID,v.Name)
}
}
常用查询方式
查询一条
var one User //如果查询一条数据,一个模型对象存储即可
db.First(&one,5) //where id=5
db.Where("name=?", "张三").First(&one) //where name="张三"
查询所有匹配结果集
var ones []User //数组
db.Where("name=?", "张三").Find(&ones)
//多个条件链式查询
db.Where("role = ?", "admin").Or("role = ?", "super_admin").Not("name = ?", "jinzhu").Find(&ones)
//指定字段
db.Select("name, age").Find(&users)
for _,v := range ones{
fmt.Println(v.ID,v.Name)
}