Начало работы с библиотекой GORM для программирования баз данных Golang

Go

Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик аккаунт, просьба указывать источник перепечатываемой статьи.

В прошлой статье мы рассмотрели использование стандартной библиотеки языка 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Фреймворк также имеет много более продвинутых функций, которые могут сделать нашу разработку более лаконичной, и в следующих статьях мы объясним это подробно.


Ваше внимание — самое большое поощрение на моем писательском пути!