attachments-2021-07-yf98P6Z460e2741f14f9d.png

Golang 操作常用数据库

Golang 中对数据库的操作主要通过database/sql库来实现,但实际对数据库的操作并不是该库实现的而是由实现了其接口的对应数据库驱动做的

因此需要引入对应的驱动并调用初始化方法

常用的几种数据库连接操作:

mysql:

mysql 驱动安装go get github.com/go-sql-driver/mysql

import 时调用初始化方法 _ “github.com/go-sql-driver/mysql”

//增:
func TestMysqlInsert(){
  DB, err1 := sql.Open("mysql", user:passwd@tcp(host:port)/DataBaseName)
  defer DB.Close()
  //sql.Open()接收驱动名称和一个包含连接目标的字符串,返回对应的连接对象
  check(err1)
  dbw, err2 := DB.Prepare("insert into Account(username,userid,passwd,email) values(?,?,?,?)")
  //Prepare()接收带有占位符?的sql语句,相同格式的查询只需要一次Prepare调用,能够避免SQL字符串拼接的SQL注入问题
  check(err2)
  dbr, err3 := dbw.Exec("ligs", "162721", "wasu", "ligs@163.com")//对应占位符
   //也可以直接使用DB.Exec()直接传入sql语句来执行
   //DB.Exec("insert into Account(username,userid,passwd,email) values ( "hades", "162721", "2333", "3211@qq.com"))
  check(err3)
  row, err4 := dbr.RowsAffected()//返回操作影响的记录数
  check(err4)
  log.Println(row)
  
  }
  
//添加表 
func TestMysqlTableAdd() {
  db, err := sql.Open("mysql", user:passwd@tcp(host:port)/DataBaseName)
  defer db.Close()
  check(err)
  res, err2 := db.Exec("create table if not exists Student(name varchar(20),sex char(4),age int,id varchar(15),primary key(id))")
  check(err2)
  rs, errors := res.RowsAffected()
  check(errors)
  log.Printf("%v rows were influenced", rs)
  }
//查
func TestMysqlQuery() {
  db, err := sql.Open("mysql", user:passwd@tcp(host:port)/DataBaseName)
  check(err)
  rows, _ := db.Query("select * from Account")
  defer db.Close()
  for rows.Next() {//Next()返回下一个记录是否存在
  var username string
  var userid string
  var passwd string
  var email string
  rows.Scan(&username, &userid, &passwd, &email)//Scan()方法将一条记录写入传递的参数中
  log.Println(username, userid, passwd, email)
  }
  }
  //改
func TestMysqlModify() {
  db, erro := sql.Open("mysql", user:passwd@tcp(host:port)/DataBaseName)
  if erro != nil {
  log.Println(erro)
  }
  dbw, erro2 := db.Prepare("update  Account set username=? where userid=?")
  if erro2 != nil {
  log.Println(erro2)
  }
  dbexec, erro3 := dbw.Exec("hades", "162721")
  checErro(erro3)
  rf, erro4 := dbexec.RowsAffected()
  checErro(erro4)
  log.Println(rf)
  
  }
//删除同理

Redis

安装驱动

go get github.com/go-redis/redis

*Redis使用

func TestRedis() {
cli := redis.NewClient(&redis.Options{
Addr:     "",
Password: "",
DB:       0,
})//初始化连接
errors := cli.Set("ligs", "dadada", 0).Err()
checErro(errors)
log.Println(cli.Get("ligs"))
log.Println(cli.Dump("Gopher"))
log.Println(cli.Exists("ligs"))
cli.Expire("Gopher",50)
cli.Keys("*")
//redis操作命令对应封装了同名函数,redis的操作可以说是是最简单的了,连接了以后对应的命令都有同名函数
}

Postgresql

驱动安装go get github.com/lib/pq

使用:

func TestPostgresql() {
  db, erro := sql.Open("postgres", "host= port= user= password= dbname= sslmode=disable")//建立连接
  checkErro(erro)
  rows, erro2 := db.Query("select * from account")
  checkErro(erro2)
  for rows.Next() {
    var userid int
    var username, password, email, timer string
    rows.Scan(&userid, &username, &password, &email, &timer)
    log.Printf("%v |%v |%v |%v |%v |\n", userid, username, password, email, timer)
  }
}//关系型数据库的操作类似

Mongodb:

驱动:gopkg.in/mgo.v2,直接git clone https://gopkg.in/mgo.v2 GOPATH/src/gopkg.in/mgo.v2

func TestMongo() {
  var user []map[string]string
  cli, erro := mgo.Dial(Host)//建立连接,也可以为数据库设定密码连接方式也同样是user:pass@tcp(host:port)/databasename这样的,如果未设定用户直接填ip:port即可
  defer cli.Close()
  checkErro(erro)
  collection := cli.DB("account").C("account")//获取对应的集合
  collection.Find(nil).All(&user)//查询,一般使用bson.M格式查询
  log.Println(user)
  collection.Remove(bson.M{"li": "2333"})//删除对应记录
  info := map[string]string{
    "name":     "hades",
    "password": "123456",
    "sex":      "man",
  }
  collection.Insert(info)//增,增加如果存在则更新
}

关系型数据库的操作基本都是一样的,而非关系型数据库的操作则互不相同,常用的非关系型数据库也就Redis和MongoDB了;

程序员编程交流QQ群:805358732

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-ylrtEcU762ad31594a881.jpeg