使用worm的SQL构造器访问数据库

23 篇文章 1 订阅
13 篇文章 0 订阅

SQL构造器

本问介绍使用worm的SQL构造器访问数据库。SQL构造器的使用场景与原生SQL基本一致,但是使用SQL构造器能够以一种更为简单的方式来编写SQL语句,并能够减少SQL编码过程中的错误。worm的安装命令:go get github.com/haming123/wego/worm

创建DbEngine

您可通过调用worm.NewMysql()创建一个worm.DbEngine,或者通过调用worm.InitMysql()来初始化缺省的worm.DbEngine。

package main
import (
	"database/sql"
	"log"
	_ "github.com/go-sql-driver/mysql"
	"github.com/haming123/wego/worm"
)
func main() {
	var err error
	cnnstr := "account:pwd@tcp(127.0.0.1:3306)/db?charset=utf8&parseTime=True"
	dbcnn, err := sql.Open("mysql", cnnstr)
	if err != nil {
		log.Println(err)
		return
	}
	err = dbcnn.Ping()
	if err != nil {
		log.Println(err)
		return
	}
	err = worm.InitMysql(dbcnn)
	if err != nil {
		log.Println(err)
		return
	}
}

使用SQL构造器执行数据库操作

func demoBuilderExec() {
	//插入记录
	id, err := worm.Table("users").Value("name", "name1").Value("age", 21).Insert()
	log.Println(id)
	//insert into users set name=?,age=?

	//更新记录
	affected, err := worm.Table("users").Value("name", "name2").Value("age", 22).Where("id=?", id).Update()
	log.Println(affected)
	//update users set age=22,name=? where id=?

	//删除记录
	affected, err = worm.Table("users").Where("id=?", id).Delete()
	log.Println(affected)
	//delete from users where id=?
}

说明:

  • worm占位符统一使用?,worm会根据数据库类型,自动替换占位符,例如postgresql数据库把?替换成$1,$2…

使用SQL构造器查询单条记录

func demoBuilderGet() {
	//查询单条记录到model对象
	var user User
	has, err := worm.Table("users").Select("*").Where("id=?", 1).GetModel(&ent)
	log.Println(user)
	//select * from users where id=? limit 1

	//查询单条记录
	var name string; var age int64
	has, err = worm.Table("users").Select("name", "age").Where("id=?", 1).Get(&name, &age)
	log.Println(name, age)
	//select name,age from users where id=? limit 1

	//单条记录的单个字段的查询:
	strval, err := worm.Table("users").Select("name").Where("id=?", 1).GetString()
	log.Println(strval)
	//select name from users where id=? limit 1

	//单条记录的单个字段的查询:
	intval, err := worm.Table("users").Select("age").Where("id=?", 1).GetInt()
	log.Println(intval)
	//select age from users where id=? limit 1
}

使用GetRow查询一条记录

GetRow查询一条记录,并返回map[string]string类型的结果。

func demoBuilderGetRow() {
	val, err := worm.Table("users").Select("*").Where("id=?", 1).GetRow()
	if err != nil{
		log.Println(err)
		return
	}
	log.Println(val)
}

使用SQL构造器查询多条记录

func demoBuilderFind() {
	//查询多条记录到model数组
	var users []User
	err :=  worm.Table("users").Select("*").Where("id>?", 0).FindModel(&users)
	log.Println(users)
	//select * from users where id>?

	//查询多条记录的单个字段到[]string:
	arrstr, err := worm.Table("users").Select("name").Where("id>?", 0).FindString()
	log.Println(arrstr)
	//select name from users where id>?

	//查询多条记录的单个字段到[]int64:
	arrint, err := worm.Table("users").Select("age").Where("id>?", 0).FindInt()
	log.Println(arrint)
	//select age from users where id>?
}

条件查询

worm支持链式API,可使用Where, And, Or, ID, In, Limit, GroupBy, OrderBy, Having等函数构造查询条件。

func demoBuilderWhere() {
	var users []User
	err :=  worm.Table("users").Select("*").Where("id>?", 0).FindModel(&users)
	//select * from users where id>?

	//limit
	users = []User{}
	err = worm.Table("users").Select("*").Where("age>?", 0).Offset(2).Limit(3).FindModel(&users)
	//select * from users where age>? limit 2, 3

	//OrderBy
	users = []User{}
	err = worm.Table("users").Select("*").Where("age>?", 0).OrderBy("name asc").FindModel(&users)
	//select * from users where age>? order by name asc

	//and
	users = []User{}
	err = worm.Table("users").Select("*").Where("age>?", 0).And("id<?", 10).FindModel(&users)
	//select * from users where age>? and id<?

	//like
	users = []User{}
	err = worm.Table("users").Select("*").Where("name like ?", "%name%").FindModel(&users)
	//select * from users where name like ?

	//in
	users = []User{}
	err = worm.Table("users").Select("*").Where("age>?", 0).AndIn("id", 5,6).FindModel(&users)
	//select * from users where age>0 and id in (?,?)
}

使用Rows查询多条数据

func demoBuilderRows() {
	sql := worm.Table("users").Select("*").Where("id>?", 0)
	sql.OrderBy("name desc")
	rows, err := sql.Rows()
	if err != nil{
		log.Println(err)
		return
	}
	defer rows.Close()

	for rows.Next(){
		var user User
		err = worm.ScanModel(rows, &user)
		if err != nil{
			log.Println(err)
		}
		log.Println(user)
	}
}

对于返回rows数据,您也可以使用ScanStringRow来获取map[string]string类型的结果:

func demoBuilderRows2() {
	sql := worm.Table("users").Select("*").Where("id>?", 0)
	sql.OrderBy("name desc")
	rows, err := sql.Rows()
	if err != nil{
		log.Println(err)
		return
	}
	defer rows.Close()

	for rows.Next(){
		data, err := worm.ScanStringRow(rows)
		if err != nil{
			log.Println(err)
		}
		log.Println(data)
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go lang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值