原创做者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。mysql

sql/databasesql/databaseORM
ORMObject Relational Mapping关系型数据库数据表structGORMORM
GORM

特性

  • 关联 (Has One, Has Many, Belongs To, Many To Many, 多态)
  • 钩子 (在建立/保存/更新/删除/查找以前或以后)
  • 预加载
  • 事务
  • 复合主键
  • SQL 生成器
  • 数据库自动迁移
  • 自定义日志
  • 可扩展性, 可基于 GORM 回调编写插件

如何安装

GORMgo get -uGOPATHGROM
go get -u github.com/jinzhu/gorm
复制代码
importGORM
import "github.com/jinzhu/gorm"
复制代码

支持的数据库

GORMMySQLSQL ServerSqlite3PostgreSQLDSNData Source Name

MySQL

1. 导入
import _ "github.com/jinzhu/gorm/dialects/mysql"
//或者//import _ "github.com/go-sql-driver/mysql"
复制代码
2. DSN
//user指用户名,password指密码,dbname指数据库名
"user:password@/dbname?charset=utf8&parseTime=True&loc=Local"
复制代码

SQL Server

1. 导入
import _ "github.com/jinzhu/gorm/dialects/mssql"
复制代码
2. DSN
//username指用户名,password指密码,host指主机地址,port指端口号,database指数据库名
"sqlserver://username:password@host:port?database=dbname"
复制代码

Sqlite3

1. 导入
import _ "github.com/jinzhu/gorm/dialects/sqlite"
复制代码
2. DSN

链接Sqlite3数据库的DSN只须要指定Sqlite3的数据库文件的路径便可,如:bash

//数据库路径
/tmp/gorm.db
复制代码

PostgreSQL

1. 导入
import _ "github.com/jinzhu/gorm/dialects/postgres"
复制代码
2. DSN
//host指主机地址,port指端口号,user指用户名,dbname指数据库名,password指密码
host=myhost port=myport user=gorm dbname=gorm password=mypassword
复制代码

链接数据库

gorm.Open()gorm.DBgorm.Open()
func Open(dialect string, args ...interface{}) (db *DB, err error)
复制代码

示例代码:框架

package main

import "github.com/jinzhu/gorm"
import _ "github.com/jinzhu/gorm/dialects/mysql"//导入链接MySQL数据库的驱动包

//DSN
const DSN = "root:123456@tcp(localhost:3306)/test?charset=utf8&parseTime=True&loc=Local"
//指定驱动
const DRIVER = "mysql"

var db *gorm.DB

func init() {
    var err error
    db,err = gorm.Open(DRIVER,DSN)
    if err != nil{
        panic(err)
    }
}

func main(){
    defer db.Close()//退出前执行关闭
    //调用db执行具体的逻辑
}
复制代码
gorm.DBdb

基本操做

gorm.Open()gorm.DBgorm.DBgorm.DB
gorm.DBdatabase/sqlsql.DBgorm.DBsql.DB
func (s *DB) Exec(sql string, values ...interface{}) *DB
func (s *DB) Row() *sql.Row
func (s *DB) Rows() (*sql.Rows, error)
func (s *DB) Scan(dest interface{}) *DB
复制代码
gorm.DBDB()sql.DB
func (s *DB) DB() *sql.DB
复制代码
gorm.DB
type User struct {
    Id       int   //对应数据表的自增id
    Username string
    Password string
    Email    string
    Phone    string
}
复制代码
UserGROM

建立

gorm.DBCreate()GORMCreate()
func (s *DB) Create(value interface{}) *DB  //建立一行
func (s *DB) NewRecord(value interface{}) bool //根据自增id判断主键是否存在
复制代码

示例

func main() {
    defer db.Close()
    //具体的逻辑
    u := &User{Username: "test_one", Password: "testOne123456", Email: "test_one@163.com", Phone: "13711112222"}
    db.Create(u)
    if db.NewRecord(u){
        fmt.Println("写入失败")
    }else{
    	fmt.Println("写入成功")
    }
}
复制代码

查询

GROMsql/database
//返回第一条
func (s *DB) First(out interface{}, where ...interface{}) *DB
//返回最后一条
func (s *DB) Last(out interface{}, where ...interface{}) *DB
//返回符合条件的内容
func (s *DB) Find(out interface{}, where ...interface{}) *DB
//返回Count(*)结果
func (s *DB) Count(value interface{}) *DB
复制代码

示例代码

//Find方法示例
func find() {
    var users = make([]*User, 0)
    db.Model(&User2{}).Find(&users)
    fmt.Println(users)
}

//First方法示例
func first()  {
    var user1,user2 User
    db.First(&user1)
    fmt.Println(user1)
    db.First(&user2,"id = ?",20)
    fmt.Println(user2)
}

//Last方法示例
func last()  {
    var user1,user2 User
    db.Last(&user1)
    fmt.Println(user1)
    db.First(&user2,"id = ?",19)
    fmt.Println(user2)
}

//Count方法示例
func count()  {
    var count int
    db.Model(&User{}).Count(&count)
    fmt.Println(count)
}
复制代码

更新

gorm.DBSave()Update()UpdateColumn()UpdateColumns()Updates()Model()
func (s *DB) Save(value interface{}) *DB

func (s *DB) Model(value interface{}) *DB
//下面的方法须要与Model方法一块儿使用,经过Model方法指定更新数据的条件
func (s *DB) Update(attrs ...interface{}) *DB
func (s *DB) UpdateColumn(attrs ...interface{}) *DB
func (s *DB) UpdateColumns(values interface{}) *DB
func (s *DB) Updates(values interface{}, ignoreProtectedAttrs ...bool) *DB
复制代码

代码示例

//Save()方法示例
func save(){
    u := &User{}
    db.First(u)
    u.Email = "test@163.com"
    db.Save(u)
    fmt.Println(u)
}

//Update方法示例
func update() {
    u := &User{}
    db.First(u)
    db.Model(u).Update("username", "hello")
}

//Updates方法示例
func updates() {
    u := &User{}
    db.First(u)
    db.Model(&u).Updates(map[string]interface{}{"username": "hello2"})
}
复制代码

删除

gorm.DBDelete()Delete()
//value若是有主键id,则包含在判断条件内,经过where能够指定其余条件
func (s *DB) Delete(value interface{}, where ...interface{}) *DB
复制代码

示例代码

func delete(){
    defer db.Close()
    u := &User{Id: 16}
    db.Delete(u)//根据id
    db.Delete(&User{},"username = ? ","test_one")//根据额外条件删除
}
复制代码

小结

GROMGROM

你的关注,是我写做路上最大的鼓励!