Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик аккаунт, просьба указывать источник перепечатываемой статьи.
В прошлой статье мы рассмотрели использование стандартной библиотеки языка Go.sql/database
процесс манипулирования базой данных, хотя и с использованиемsql/database
Также очень удобно манипулировать данными по пакетам, но нам нужно самим писать каждое выражение SQL, поэтому мы можем сами переупаковать его для лучшего использования и использовать существующий язык Go для открытого исходного кода.ORM
Фреймворк — лучший способ заменить собственную инкапсуляцию.
ORM
, объектно-реляционное отображение (Object Relational Mapping
), который может быть просто понят как关系型数据库
середина数据表
Сопоставляется с определенными типами данных в языке программирования (например,struct
),иGORM
Библиотека представляет собой очень полную и простую в использовании библиотеку, реализованную на языке Go.ORM
Рамка.
Давайте рассмотрим, как использоватьGORM
Кадр это!
характеристика
- Ассоциация (имеет один, имеет много, принадлежит, многие ко многим, полиморфизм)
- Хуки (до или после создания/сохранения/обновления/удаления/поиска)
- Предварительная загрузка
- дела
- составной первичный ключ
- Генератор SQL
- Автоматическая миграция базы данных
- пользовательский журнал
- Возможность расширения для написания плагинов на основе обратных вызовов GORM
Как установить
УстановитьGORM
очень просто, используйтеgo get -u
ты сможешьGOPATH
Установите последнюю из каталогаGROM
Рамка.
go get -u github.com/jinzhu/gorm
После установки вы можете использоватьimport
импорт ключевых словGORM
Библиотека, начни пользоваться!
import "github.com/jinzhu/gorm"
поддерживаемые базы данных
GORM
Поддержка фреймворкаMySQL
,SQL Server
,Sqlite3
,PostgreSQL
Четыре драйвера базы данных, если мы хотим подключиться к этим базам данных, нам нужно импортировать разные пакеты драйверов и определить разные форматы.DSN
(Data 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
Чтобы подключить DSN базы данных Sqlite3, вам нужно только указать путь к файлу базы данных Sqlite3, например:
//数据库路径
/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
Подключиться к базе данных
Выше мы определили DSN, которые подключаются к разным базам данных.Следующее демонстрирует, что если вы подключаетесь к базе данных, используйтеgorm.Open()
метод может инициализировать и возвращатьgorm.DB
Структура, эта структура инкапсулирует все методы работы с базой данных фреймворка GORM.gorm.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执行具体的逻辑
}
В приведенном выше примере мы инициализируем в методе initgorm.DB
структура, так что переменные могут быть использованы непосредственно в следующих примерахdb
Прямые операции с базой данных.
Основная операция
использоватьgorm.Open()
функция возвращаетgorm.DB
После структуры мы можем использоватьgorm.DB
Методы, предоставляемые структурой, управляют базой данных.Ниже мы покажем, как использоватьgorm.DB
Выполнение самых основных операций, таких как создание, запрос, обновление и удаление.
фактическиgorm.DB
на языке гоdatabase/sql
в библиотекеsql.DB
переупаковка в структуре, потому чтоgorm.DB
обеспечивает множество иsql.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.DB
в структуреDB()
метод, который возвращаетsql.DB
объекта следующим образом:
func (s *DB) DB() *sql.DB
Далее демонстрируется использованиеgorm.DB
В структуре есть несколько более простых методов для выполнения основных операций с базой данных, но перед демонстрацией нам нужно определить модель следующим образом:
type User struct {
Id int //对应数据表的自增id
Username string
Password string
Email string
Phone string
}
Мы определяем имя какUser
структура,GROM
Он поддерживает сопоставление структуры со строкой таблицы данных в соответствии с правилами.Каждое поле структуры представляет собой столбец таблицы данных.Первая буква поля структуры должна быть заглавной.
Создайте
использоватьgorm.DB
серединаCreate()
метод,GORM
будет переданоCreate()
метод модели для вставки строки в таблицу данных.
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("写入成功")
}
}
Запрос
GROM
кадр вsql/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.DB
изSave()
или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.DB
изDelete()
Этот метод может быть очень простым для удаления записей, соответствующих условиям.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")//根据额外条件删除
}
резюме
В этой статье мы просто объясним, как использоватьGROM
Как фреймворк подключается и просто управляет базой данных, на самом делеGROM
Фреймворк также имеет много более продвинутых функций, которые могут сделать нашу разработку более лаконичной, и в следующих статьях мы объясним это подробно.
Ваше внимание — самое большое поощрение на моем писательском пути!