Предыдущая статьяВ среде разработки, которую мы используем, мы добавилиMySQL
контейнер, затем вводит использованиеdatabase/sql
Стандартная библиотека в сочетании с пакетом драйверов базы данных для выполнения операций с базой данных. Но это относительно низкоуровневые пакеты. Реальная разработка часто использует некоторые пакеты, инкапсулированные на его основе.ORM
библиотека.ORM
Запрос проще в использовании, а синтаксис более выразительный. В этой статье мы в основном исследуем следующее содержание.
-
gorm
основное использование - как управлять
ORM
использование - Как разумно спланировать структуру каталогов проекта
Установить горм-пакет
gorm
отличный, удобный для разработчиковGolang
ORM
Библиотеки, которые поддерживают функции, включают:
- Полнофункциональный ORM (почти все функции)
- Ассоциации моделей (один к одному, один ко многим, один ко многим (обратные), многие ко многим, полиморфные ассоциации)
- Хуки (до/после создания/сохранения/обновления/удаления/поиска)
- Предварительная загрузка
- дела
- составной первичный ключ
- конструктор SQL
- Автоматическая миграция
- журнал
Установите с помощью следующей команды:
go get -u github.com/jinzhu/gorm
Добавить горм в проект
Планирование структуры каталогов модели данных
Мы создаем следующий каталог в корневом каталоге проекта:
http_demo
|
└───model
│ └───dao
│ │ init.go
│ └───────table
│ │ user.go
Пакеты в Go организованы в виде каталогов, поэтомуmodel
Все модели данных хранятся в пакете,dao
Представляет объект доступа к данным, в котором хранится база данныхCRUD
инкапсуляция метода, гдеinit.go
хранитьdao
Функция инициализации пакета в основном используется для подключения к базе данных после загрузки пакета.table
Определение модели, соответствующее таблице данных, помещается в пакет (перед использованием ORM модель должна быть определена в соответствии с таблицей в базе данных).В примере мы определимUser
модель наuser.go
в файле.
После планирования каталога вы можете написать соответствующий код в каждой части.Во-первых, давайте посмотрим на использованиеgorm
Подключиться к базе данных.
Подключиться к базе данных
мы вdao
упаковкаinit.go
Добавьте логику инициализации пакета для подключения к базе данных, и функция инициализации будет вdao
выполняется при первом импорте пакета из-заgorm
Пример подключения документа к базе данных слишком прост и имеет мало справочной ценности, поэтому мы делаем простую инкапсуляцию в соответствии с потребностями проекта.init.go
Код в следующем:
package dao
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"time"
)
var _DB *gorm.DB
func DB() *gorm.DB {
return _DB
}
func init() {
_DB = initDB()
}
func initDB() *gorm.DB {
// In our docker dev environment use
// db, err := gorm.Open("mysql", "go_web:go_web@tcp(database:3306)/go_web?charset=utf8&parseTime=True&loc=Local")
db, err := gorm.Open("mysql", "go_web:go_web@tcp(localhost:33063)/go_web?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
db.DB().SetMaxOpenConns(100)
db.DB().SetMaxIdleConns(10)
db.DB().SetConnMaxLifetime(time.Second * 300)
if err = db.DB().Ping(); err != nil {
panic(err)
}
return db
}
Код очень прост, когда вы практикуете его в соответствии со своими собственнымиMySQL
Конфигурация изменяет конфигурацию в коде. Дело в том, что если вы используетеDocker
среде, при подключении к базе данныхhost
изменить наdatabase:3306
, потому что я помещаю в среду контейнераMySQL
Имя службы контейнера определяется какdatabase
, БегGo
изapp
Контейнерам нужны имена служб для доступа к другим контейнерам в сети контейнеров. Пожалуйста, ознакомьтесь с подробной конфигурацией среды контейнера.Перейти к веб-программированию — База данных приложенийописание в .
Определить модель
Прежде чем использовать модель для доступа к таблице базы данных, нам необходимо определить соответствующую модель. В нашем примере теперь только одинusers
стол, следующий мы вtable
пакет добавленusers
Модель таблицы определена и помещена вuser.go
в файле.
package table
import "time"
type User struct {
Id int64 `gorm:"column:id;primary_key"`
UserName string `gorm:"column:username"`
Secret string `gorm:"column:secret;type:varchar(1000)"`
CreatedAt time.Time `gorm:"column:created_at"`
UpdatedAt time.Time `gorm:"column:updated_at"`
}
// TableName sets the insert table name for this struct type
func (m *User) TableName() string {
return "users"
}
Модель CRUD
Что касается CRUD модели, рекомендуется, чтобы CRUD отдельной моделиCRUD
ставитьdao
В одном файле пакета это удобно для дальнейшего управления кодом. Позвольте мне сказать немного больше здесь, рекомендуется не использовать его напрямуюcontroller
или позвоните по телефонуhandler
пакет прямого доступаdao
пакет, но добавьте слой посерединеlogic
package, поместите логику в этот слой. Это полезно для управления кодом и повторного использования.
Поскольку в базе данных существует множество операций CRUD, цель этой статьи — помочь вам быстро приступить к работе.gorm
Поэтому я просто поставил простой CRUD для демонстрации. Следуйте инструкциям здесь, чтобы импортироватьgorm
После использования других операций с базой данных перейдите непосредственно к официальной документации, чтобы проверить ее.
существуетdao
новый в упаковкеuser.go
используется для храненияUser
Как работает модель.
package dao
import "example.com/http_demo/model/dao/table"
func CreateUser(user *table.User) (err error) {
err = DB().Create(user).Error
return
}
func GetUserById(userId int64) (user *table.User, err error) {
user = new(table.User)
err = DB().Where("id = ?", userId).First(user).Error
return
}
func GetAllUser() (users []*table.User, err error) {
err = DB().Find(&users).Error
return
}
func UpdateUserNameById(userName string, userId int64) (err error) {
user := new(table.User)
err = DB().Where("id = ?", userId).First(user).Error
if err != nil {
return
}
user.UserName = userName
err = DB().Save(user).Error
return
}
func DeleteUserById(userId int64) (err error) {
user := new(table.User)
err = DB().Where("id = ?", userId).First(user).Error
if err != nil {
return
}
err = DB().Delete(user).Error
return
}
Проверить метод ORM
После вышеперечисленных шагов мы можем использовать его в проектеgorm
доступ к базе данных, благодаря нашему проектуmain goroutine
вбегаетhttp
сервис, поэтому мы используем тестовый пример для вышеуказанногоdao
Тестируются несколько методов, определенных в пакете.
Из соображений экономии места я опубликую только одинGetAllUsers
Тестовый пример для метода:
func TestGetAllUser(t *testing.T) {
tests := []struct {
name string
wantErr bool
}{
{
name: "test",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotUsers, err := GetAllUser()
if (err != nil) != tt.wantErr {
t.Errorf("GetAllUser() error = %v, wantErr %v", err, tt.wantErr)
return
}
for _, user := range gotUsers {
log.Info("user: %v", user)
}
})
}
}
После запуска теста вы можете увидеть результаты:
INFO user: &{1 2020-02-15 14:14:46 +0800 CST 2020-02-15 06:44:17 +0800 CST}
--- PASS: TestGetAllUsers (0.00s)
--- PASS: TestGetAllUsers/test (0.00s)
PASS
Process finished with exit code 0
Обратите внимание на публичный ответ в конце статьиgohttp05
Полный код тестового примера можно получить, рекомендуетсяCRUD
Все тест-кейсы должны быть написаны для самотестирования с использованиемGoLand
Легко создавать тестовые функции и запускать тесты.
Перепланировка каталога проекта
представлятьORM
После этого в нашем проекте есть еще коды, и все они размещены в корневом каталоге.main
Пакет немного беспорядочный, поэтому мы просто делим каталог проекта в соответствии с функциями и обязанностями каждой части.Структура разделенных каталогов выглядит следующим образом:
http_demo
|
└───handler//route handler
|
└───logic//business logic
|
└───middleware
│
└───model
│ └───dao
│ │ init.go
│ └───table
│ │ user.go
└───router// router
|
| main.go
Я чувствую, что сегодня еще много контента, особенно для тех, кто только начинает.Go
Студенты должны загрузить сегодняшний код и попрактиковаться, чтобы освоить его.gorm
Предусмотрено еще много функций, и каждая функция объясняется в официальной документации, поэтому мы не будем вводить здесь слишком много. Цель этой статьи в основном состоит в том, чтобы позволить всем быстро приступить к работе и в то же времяORM
Соответствующие процессы управления кодом и инициализации стандартизированы, и эти организационные методы могут быть полностью применены к проектам производственного уровня.
Обратите внимание на публичный ответ в конце статьи
gohttp05
Получите полный исходный код в статье.Если вам понравилась моя статья, пожалуйста, поставьте лайк и добавьте ее в закладки.
Предыдущий отзыв
Глубокое погружение в написание HTTP-серверов в Go
Быстро создайте среду разработки Go с помощью Docker
Научитесь писать промежуточное программное обеспечение для веб-приложений на Go за десять минут