Налаштування GORM для Go веб-застосунку

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування GORM для Go веб-застосунку
Середня
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Настройка GORM для Go веб-застосунку

GORM — найпопулярніший ORM для Go. Не намагається цілком приховати SQL, надаючи прямий доступ до raw запитів де це потрібно. Версія v2 несумісна з v1 за API.

go get gorm.io/gorm
go get gorm.io/driver/postgres

Ініціалізація

package db

import (
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
    "log"
    "time"
)

func New(dsn string) (*gorm.DB, error) {
    db, err := gorm.Open(postgres.New(postgres.Config{
        DSN:                  dsn,
        PreferSimpleProtocol: true,
    }), &gorm.Config{
        Logger:      logger.Default.LogMode(logger.Warn),
        NowFunc:    func() time.Time { return time.Now().UTC() },
    })

    sqlDB, _ := db.DB()
    sqlDB.SetMaxOpenConns(25)
    sqlDB.SetMaxIdleConns(10)
    sqlDB.SetConnMaxLifetime(5 * time.Minute)

    return db, err
}

Моделі

type Product struct {
    ID         uint           `gorm:"primarykey"`
    CreatedAt  time.Time
    UpdatedAt  time.Time
    DeletedAt  gorm.DeletedAt `gorm:"index"`

    Title      string        `gorm:"type:varchar(500);not null"`
    Slug       string        `gorm:"type:varchar(520);uniqueIndex"`
    Price      float64       `gorm:"type:decimal(12,2)"`
    Status     ProductStatus `gorm:"type:varchar(20);default:draft"`
    CategoryID uint          `gorm:"not null;index"`
    Category   Category      `gorm:"foreignKey:CategoryID;constraint:OnDelete:RESTRICT"`
    Tags       []Tag         `gorm:"many2many:product_tags;"`
}

func (Product) TableName() string {
    return "products"
}

Запити

type ProductRepository struct {
    db *gorm.DB
}

func (r *ProductRepository) GetPublished(
    ctx context.Context,
    categoryID uint,
    limit, offset int,
) ([]Product, error) {
    var products []Product
    err := r.db.WithContext(ctx).
        Preload("Category").
        Preload("Tags").
        Where("category_id = ? AND status = ?", categoryID, "published").
        Order("created_at DESC").
        Limit(limit).
        Offset(offset).
        Find(&products).Error
    return products, err
}

Міграції

Використовуємо golang-migrate для production:

go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
migrate create -ext sql -dir migrations -seq create_products

Терміни

Первісна настройка GORM з golang-migrate: 1 день.