db_client

package module
v1.0.0-rc1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 20, 2026 License: MIT Imports: 13 Imported by: 2

README

Compogo DB Client

Go Reference

Плагинная система для работы с базами данных в фреймворке Compogo.

Предоставляет:

  • Единый интерфейс для работы с любой БД (MySQL, PostgreSQL, SQLite)
  • Плагинную систему драйверов
  • Логирование всех SQL-запросов
  • Лимитер для защиты от ошибок соединения
  • Middleware для пагинации, сортировки и фильтрации

Установка

go get github.com/Compogo/db-client

Быстрый старт

package main

import (
    "context"
    "github.com/Compogo/compogo"
    "github.com/Compogo/db-client"
)

func main() {
    app := compogo.NewApp("myapp",
        compogo.WithComponents(&db_client.Component),
    )

    app.AddComponents(&compogo.Component{
        Name: "user_service",
        Init: compogo.StepFunc(func(container compogo.Container) error {
            return container.Invoke(func(client db_client.Client) error {
                rows, err := client.Query("SELECT * FROM users WHERE active = ?", true)
                if err != nil {
                    return err
                }
                defer rows.Close()
                // обработка rows
                return nil
            })
        }),
    })

    if err := app.Serve(); err != nil {
        panic(err)
    }
}

Использование

import (
    "github.com/Compogo/db-client"
)

func main() {
    app := compogo.NewApp("myapp",
        compogo.WithComponents(&db_client.Component),
    )
}

Конфигурация через флаги

# Выбор драйвера (автоматически подставляет доступные)
--db.driver=mysql

Логирование запросов

// Автоматически логирует все запросы на уровне Debug
// [Database][mysql] query: SELECT * FROM users; args: [true]

Лимитер ошибок соединения

// Автоматически ограничивает количество ошибок соединения
// При превышении лимита переходит в режим ожидания

Repository

Интерфейсы для работы с данными
// Постраничное получение
type Pager[T any] interface {
    Page(context.Context, *Page, []*Sort, ...*Filter) ([]T, error)
}

// Подсчёт количества
type Counter interface {
    Count(context.Context, ...*Filter) (uint64, error)
}

// Сохранение (Insert или Update)
type Saver[T any] interface {
    Save(context.Context, T) (T, error)
}

// Вставка
type Inserter[T any] interface {
    Insert(context.Context, T) (T, error)
}

// Обновление
type Updater[T any] interface {
    Update(context.Context, T) (T, error)
}

// Удаление
type Deleter interface {
    Delete(context.Context, ...*Filter) error
}

// Поиск
type Finder[T any] interface {
    Find(context.Context, ...*Filter) ([]T, error)
}

// Массовая вставка
type BulkInserter[T any] interface {
    BulkInsert(context.Context, ...T) error
}
Middleware для пагинации
import "github.com/Compogo/db-client/middleware"

// Использование в роутере
router.Use(
    middleware.NewPage(logger),      // извлекает номер страницы
    middleware.NewPaginationLimit(logger), // извлекает лимит
    middleware.NewSort(logger, defaultSort, "id", "name", "created_at"), // сортировка
    middleware.NewFilter(logger, "name", "age", "active"), // фильтрация
)

// Формат сортировки: ?sort=name:asc;created_at:desc
// Формат фильтрации: ?filter=name:john:LKE;age:18:Gt

API

Client
type Client interface {
    io.Closer
    Query(string, ...interface{}) (*sql.Rows, error)
    QueryRow(string, ...interface{}) *sql.Row
    Exec(string, ...interface{}) (sql.Result, error)
    QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error)
    QueryRowContext(context.Context, string, ...interface{}) *sql.Row
    ExecContext(context.Context, string, ...interface{}) (sql.Result, error)
    SQL() *sql.DB
    DriverName() string
}
Config
type Config struct {
    Driver string // имя драйвера БД
}
Repository
type Comparable uint8 // Eq, Neq, Gt, Gte, Lt, Lte, LIKE, IN

type SortDirection uint8 // ASC, DESC

type Page struct {
    Number uint64
    Limit  uint64
}

type Sort struct {
    ColumnName string
    Direction  SortDirection
}

type Filter struct {
    ColumnName string
    Value      string
    Comparable Comparable
}

Зависимости

Лицензия

MIT License

Copyright (c) 2026 Compogo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Documentation

Index

Constants

View Source
const DriverFieldName = "db.driver"

DriverFieldName — имя поля для драйвера БД.

Variables

View Source
var Component = compogo.Component{
	Init: compogo.StepFunc(func(container compogo.Container) error {
		return container.Provides(
			NewConfig,
			NewClient,
		)
	}),
	BindFlags: compogo.BindFlags(func(flagSet flag.FlagSet, container compogo.Container) error {
		return container.Invoke(func(config *Config) {
			allDrivers := drivers.Keys()
			if len(allDrivers) == 1 {
				DriverDefault = allDrivers[0]
			}

			flagSet.StringVar(&config.Driver, DriverFieldName, DriverDefault, fmt.Sprintf("db client driver. Available drivers: [%s]", strings.Join(allDrivers, ",")))
		})
	}),
	Configuration: compogo.StepFunc(func(container compogo.Container) error {
		return container.Invoke(Configuration)
	}),
	Stop: compogo.StepFunc(func(container compogo.Container) error {
		return container.Invoke(func(c Client) error {
			return c.Close()
		})
	}),
}

Component — компонент клиента БД для Compogo. Регистрирует конфигурацию и клиент в DI-контейнере.

Пример подключения:

app.AddComponents(&db_client.Component)

var client db_client.Client
container.Invoke(func(c db_client.Client) { client = c })
rows, err := client.Query("SELECT * FROM users")
View Source
var DriverDefault = ""

DriverDefault — драйвер по умолчанию (пустая строка, требует явного указания).

Functions

func Registration

func Registration(driverName string, getter Getter)

Registration регистрирует драйвер БД. Должна вызываться в init() каждого пакета драйвера.

Пример регистрации MySQL-драйвера:

func init() {
    db_client.Registration("mysql", func(container compogo.Container) (db_client.Client, error) {
        var config *mysql.Config
        container.Invoke(func(c *mysql.Config) { config = c })
        return mysql.NewClient(config)
    })
}

Types

type Client

type Client interface {
	io.Closer

	Query(string, ...interface{}) (*sql.Rows, error)
	QueryRow(string, ...interface{}) *sql.Row
	Exec(string, ...interface{}) (sql.Result, error)
	QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error)
	QueryRowContext(context.Context, string, ...interface{}) *sql.Row
	ExecContext(context.Context, string, ...interface{}) (sql.Result, error)
	SQL() *sql.DB
	DriverName() string
}

Client — интерфейс для работы с БД. Объединяет стандартные методы database/sql с поддержкой контекста.

Поддерживает:

  • Выполнение запросов (Query, QueryRow, Exec)
  • Контекстные версии (QueryContext, QueryRowContext, ExecContext)
  • Доступ к *sql.DB для низкоуровневых операций
  • Graceful shutdown через io.Closer

func NewClient

func NewClient(config *Config, container compogo.Container, logger compogo.Logger) (Client, error)

NewClient создаёт новый клиент БД с указанным драйвером. Использует зарегистрированный Getter для создания клиента.

type Config

type Config struct {
	Driver string
}

Config содержит конфигурацию клиента БД.

func Configuration

func Configuration(config *Config, configurator compogo.Configurator) (*Config, error)

Configuration загружает конфигурацию из Configurator. Проверяет, что драйвер указан и зарегистрирован.

func NewConfig

func NewConfig() *Config

NewConfig создаёт новую конфигурацию.

type Getter

type Getter func(container compogo.Container) (Client, error)

Getter — фабричная функция для создания клиента БД. Принимает DI-контейнер для получения зависимостей драйвера.

type Limiter

type Limiter struct {
	Client
	// contains filtered or unexported fields
}

Limiter — обёртка над Client с ограничением на количество ошибок соединения. При превышении лимита ошибок (соединений) переходит в режим ожидания.

Используется для защиты БД от "штурма" недоступным соединением.

func NewLimiter

func NewLimiter(client Client, limit uint64, duration time.Duration, runner runner.Runner) *Limiter

NewLimiter создаёт новый Limiter.

func (*Limiter) Close

func (l *Limiter) Close() error

func (*Limiter) Exec

func (l *Limiter) Exec(s string, i ...interface{}) (sql.Result, error)

func (*Limiter) ExecContext

func (l *Limiter) ExecContext(ctx context.Context, s string, i ...interface{}) (sql.Result, error)

func (*Limiter) Name

func (l *Limiter) Name() string

func (*Limiter) Process

func (l *Limiter) Process(ctx context.Context) error

func (*Limiter) Query

func (l *Limiter) Query(s string, i ...interface{}) (*sql.Rows, error)

func (*Limiter) QueryContext

func (l *Limiter) QueryContext(ctx context.Context, s string, i ...interface{}) (*sql.Rows, error)

func (*Limiter) QueryRow

func (l *Limiter) QueryRow(s string, i ...interface{}) *sql.Row

func (*Limiter) QueryRowContext

func (l *Limiter) QueryRowContext(ctx context.Context, s string, i ...interface{}) *sql.Row

type Logger

type Logger struct {
	Client
	// contains filtered or unexported fields
}

Logger — обёртка над Client с логированием всех запросов. Логирует на уровне Debug все SQL-запросы и их аргументы.

func NewLogger

func NewLogger(client Client, logger compogo.Logger) *Logger

NewLogger создаёт новый Logger для клиента БД.

func (*Logger) Close

func (l *Logger) Close() error

func (*Logger) Exec

func (l *Logger) Exec(s string, i ...interface{}) (sql.Result, error)

func (*Logger) ExecContext

func (l *Logger) ExecContext(ctx context.Context, s string, i ...interface{}) (sql.Result, error)

func (*Logger) Query

func (l *Logger) Query(s string, i ...interface{}) (*sql.Rows, error)

func (*Logger) QueryContext

func (l *Logger) QueryContext(ctx context.Context, s string, i ...interface{}) (*sql.Rows, error)

func (*Logger) QueryRow

func (l *Logger) QueryRow(s string, i ...interface{}) *sql.Row

func (*Logger) QueryRowContext

func (l *Logger) QueryRowContext(ctx context.Context, s string, i ...interface{}) *sql.Row

Directories

Path Synopsis
http
protobuf

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL