文章目录
1. 知识储备2. 安装ORM包3. 创建表4. 添加数据5. 查询 & 修改 & 删除5.1查询多条数据
1. 知识储备
Go语言基础知识具备一般的SQL知识测试机器上安装了数据库服务端,我们默认使用MySql
2. 安装ORM包
ORM:对象关系映射(Object Relational Mapping,简称ORM),目的是想像操作对象一样操作数据库.因为数据库不是面向对象的,所以需要编程进行映射.
Go语言能用的ORM客户端包很多,我们依旧只看最常见的ORM包,这些ORM包在github上都能找到
包名github地址参考文档
gormhttps://github.com/jinzhu/gormhttp://gorm.ioxormhttps://github.com/go-xorm/xormhttp://gobook.io/read/github.com/go-xorm/manual-en-US/
这两个Golang的包都很常见,我们选择其中一个即可,此处我们选择gorm
go get -u github.com/jinzhu/gorm
gorm 这个包中已经包含了一些数据的驱动,通常来讲就不需要再下载数据库驱动,除非grom中没有包含的
import _ "github.com/jinzhu/gorm/dialects/mysql"
import _ "github.com/jinzhu/gorm/dialects/postgres"
import _ "github.com/jinzhu/gorm/dialects/sqlite"
import _ "github.com/jinzhu/gorm/dialects/mssql"
3. 创建表
package main
import (
"crypto/md5"
"fmt"
"github.com/jinzhu/gorm"
"math/rand"
"strconv"
"time"
)
import _ "github.com/jinzhu/gorm/dialects/mysql"
const (
USER
= "root"
PWD
= "root"
DBIP
= "127.0.0.1"
DBPORT
= "3306"
DBNAME
= "goproject"
)
type Admin
struct {
ID
int64
User
string
Password
string
}
type Finish
struct {
ID
int
Callid
string `gorm:"size:50;not null"`
Subid
string `gorm:"size:100"`
Aid
int64 `gorm:"index"`
CreateTime time
.Time
}
type Account
struct {
gorm
.Model
Appkey
string `gorm:"type:varchar(15);index:idx_appkey;not null"`
Company
string `gorm:"column:cpmpany_name;size:30"`
Status
int8 `gorm:"default:1"`
}
func (Admin
) TableName() string {
return "vn_admin"
}
func (Finish
) TableName() string {
return "vn_finish"
}
func (Account
) TableName() string {
return "vn_account"
}
func main() {
info
:= USER
+ ":" + PWD
+ "@tcp(" + DBIP
+ ":" + DBPORT
+ ")/" + DBNAME
+ "?charset=utf8&parseTime=True&loc=Local&timeout=10ms"
fmt
.Println(info
)
db
, err
:= gorm
.Open("mysql", info
)
defer db
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
if err
!= nil {
fmt
.Printf("mysql connect error %v", err
)
} else {
fmt
.Println("mysql connect success")
}
db
.DB().SetMaxIdleConns(10)
db
.DB().SetMaxOpenConns(100)
if !db
.HasTable("vn_admin") {
db
.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&Admin
{})
}
if !db
.HasTable(&Finish
{}) {
db
.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&Finish
{})
}
if !db
.HasTable(&Account
{}) {
db
.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&Account
{})
}
rand
.Seed(time
.Now().UnixNano())
use1
:= "Test" + strconv
.Itoa(rand
.Intn(99))
pwd
:= func(s
string) string {
str
:= fmt
.Sprintf("%x", md5
.Sum([]byte(s
)))
return str
}(use1
)
data
:= Admin
{User
: use1
, Password
: pwd
}
db
.Create(&data
)
}
4. 添加数据
package main
import (
"crypto/md5"
"fmt"
"github.com/jinzhu/gorm"
"math/rand"
"time"
)
import _ "github.com/jinzhu/gorm/dialects/mysql"
const (
USER
= "root"
PWD
= "root"
DBIP
= "127.0.0.1"
DBPORT
= "3306"
DBNAME
= "goproject"
)
type Admin
struct {
ID
int64
User
string
Password
string
}
type Finish
struct {
ID
int
Callid
string `gorm:"size:50;not null"`
Subid
string `gorm:"size:100"`
Aid
int64 `gorm:"index"`
CreateTime time
.Time
}
type Account
struct {
gorm
.Model
Appkey
string `gorm:"type:varchar(15);index:idx_appkey;not null"`
Company
string `gorm:"column:cpmpany_name;size:30"`
Status
int8 `gorm:"default:1"`
}
func (Admin
) TableName() string {
return "vn_admin"
}
func (Finish
) TableName() string {
return "vn_finish"
}
func (Account
) TableName() string {
return "vn_account"
}
func gainRandomString(n
int) string {
s
:= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
b
:= make([]byte, n
)
for v
:= range b
{
b
[v
] = s
[rand
.Intn(len(s
))]
}
return string(b
)
}
func gainRandomMd5String(s
string) string {
return fmt
.Sprintf("%x", md5
.Sum([]byte(s
)))
}
func gainData(d
chan Admin
) {
for i
:= 0; i
< 20; i
++ {
name
:= gainRandomString(9)
pwd
:= gainRandomMd5String(name
)
data
:= Admin
{User
: name
, Password
: pwd
}
d
<- data
}
close(d
)
}
func main() {
info
:= USER
+ ":" + PWD
+ "@tcp(" + DBIP
+ ":" + DBPORT
+ ")/" + DBNAME
+ "?charset=utf8&parseTime=True&loc=Local&timeout=10ms"
db
, err
:= gorm
.Open("mysql", info
)
defer db
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
if err
!= nil {
fmt
.Printf("mysql connect error %v", err
)
} else {
fmt
.Println("mysql connect success")
}
db
.DB().SetMaxIdleConns(10)
db
.DB().SetMaxOpenConns(100)
datas
:= make(chan Admin
, 20)
go gainData(datas
)
for v
:= range datas
{
db
.NewRecord(v
)
db
.Create(&v
)
}
}
5. 查询 & 修改 & 删除
package main
import (
"fmt"
"github.com/jinzhu/gorm"
"math/rand"
"time"
)
import _ "github.com/jinzhu/gorm/dialects/mysql"
const (
USER
= "root"
PWD
= "root"
DBIP
= "127.0.0.1"
DBPORT
= "3306"
DBNAME
= "goproject"
)
type Admin
struct {
ID
int64
User
string
Password
string
}
type Finish
struct {
ID
int
Callid
string `gorm:"size:50;not null"`
Subid
string `gorm:"size:100"`
Aid
int64 `gorm:"index"`
CreateTime time
.Time
}
type Account
struct {
gorm
.Model
Appkey
string `gorm:"type:varchar(15);index:idx_appkey;not null"`
Company
string `gorm:"column:cpmpany_name;size:30"`
Status
int8 `gorm:"default:1"`
}
func (Admin
) TableName() string {
return "vn_admin"
}
func (Finish
) TableName() string {
return "vn_finish"
}
func (Account
) TableName() string {
return "vn_account"
}
func gainRandomString(n
int) string {
s
:= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
b
:= make([]byte, n
)
for v
:= range b
{
b
[v
] = s
[rand
.Intn(len(s
))]
}
return string(b
)
}
func main() {
info
:= USER
+ ":" + PWD
+ "@tcp(" + DBIP
+ ":" + DBPORT
+ ")/" + DBNAME
+ "?charset=utf8&parseTime=True&loc=Local&timeout=10ms"
db
, err
:= gorm
.Open("mysql", info
)
defer db
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
if err
!= nil {
fmt
.Printf("mysql connect error %v", err
)
} else {
fmt
.Println("mysql connect success")
}
db
.DB().SetMaxIdleConns(10)
db
.DB().SetMaxOpenConns(100)
a1
:= Admin
{}
db
.Select([]string{"id", "user", "password"}).Where("id = ? AND user = ?", 1, "Test59").First(&a1
)
fmt
.Println(a1
)
a2
:= Admin
{}
db
.Last(&a2
)
fmt
.Println(a2
)
var admins
[]Admin
db
.Where("id > 20").Find(&admins
)
fmt
.Println(admins
)
a3
:= Admin
{}
a3
.User
= "Test-demo"
a3
.ID
= 20
a3
.Password
= a1
.Password
db
.Save(&a3
)
a4
:= Admin
{}
a4
.ID
= 69
db
.Model(&a4
).Update("user", "demo99")
a5
:= Admin
{}
a5
.ID
= 2
errs
:= db
.Delete(&a5
).Error
if errs
== nil{
fmt
.Println("delete success")
}
}
5.1查询多条数据
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
const (
USER
= "root"
PWD
= "root"
DBIP
= "127.0.0.1"
DBPORT
= "3306"
DBNAME
= "goproject"
)
var Supplier
string
type Admin
struct {
ID
int
Compid
string
Appkey
string
Secretkey
string
status
int8
}
func (Admin
) TableName() string {
return "vn_admin"
}
func mysqlConnectTest() {
info
:= USER
+ ":" + PWD
+ "@tcp(" + DBIP
+ ":" + DBPORT
+ ")/" + DBNAME
+ "?charset=utf8&parseTime=True&loc=Local&timeout=10ms"
db
, err
:= gorm
.Open("mysql", info
)
defer db
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
if err
!= nil {
fmt
.Printf("mysql connect error %v", err
)
} else {
fmt
.Println("mysql connect success")
}
db
.DB().SetMaxIdleConns(10)
db
.DB().SetMaxOpenConns(100)
var users
[]Admin
fields
:= "id,secretkey,status"
db
.Select(fields
).Where("id > ?",270).Find(&users
)
for k
,v
:= range users
{
fmt
.Println(k
,v
)
}
}
func main() {
mysqlConnectTest()
}
go run main.go
mysql connect success
0 {271 e966c75641752fcb8233517d40e47d15 0}
1 {272 bb677cd4b7e847c05e45ffe8c39fea88 0}
2 {273 194212f11979f204109401932d218a9b 0}
3 {274 99c41b93e3e18c896c63f4717d2834b4 0}
4 {275 7348332f6f51f1402ffeb45287a91519 0}
5 {276 0107cec0bf078522c0b8db0eda623b24 0}
6 {277 f6963e716f8b75ed52353c0efb5f7282 0}
7 {278 5410ca0466f4e68b05cf5f4dd4c8cfcb 0}
8 {280 d23f1c89e0dbf5c5159723940c0e8092 0}