db_sql_generator

package module
v0.0.3 Latest Latest
Warning

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

Go to latest
Published: Apr 7, 2026 License: MIT Imports: 7 Imported by: 2

README

Compogo DB SQL Generator 🛠️

Compogo DB SQL Generator — компонент для типобезопасного построения SQL-запросов, построенный на базе goqu. Автоматически использует диалект, соответствующий драйверу, выбранному в db-client.

🚀 Установка

go get github.com/Compogo/db-sql-generator
📦 Быстрый старт
package main

import (
    "github.com/Compogo/compogo"
    "github.com/Compogo/db-client"
    "github.com/Compogo/db-sql-generator"
    _ "github.com/Compogo/postgres" // ваш драйвер БД
)

func main() {
    app := compogo.NewApp("myapp",
        compogo.WithOsSignalCloser(),
        db_client.Component,           // выбираем драйвер через --db.driver
        db_sql_generator.Component,    // генератор запросов
        compogo.WithComponents(
            userRepositoryComponent,
        ),
    )

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

// Репозиторий, использующий генератор
var userRepositoryComponent = &component.Component{
    Dependencies: component.Components{
        db_client.Component,
        db_sql_generator.Component,
    },
    Execute: component.StepFunc(func(c container.Container) error {
        return c.Invoke(func(db db_client.Client, gen *goqu.DialectWrapper) {
            repo := &UserRepository{db: db, generator: gen}
            // ... регистрация репозитория
        })
    }),
}

type UserRepository struct {
    db        db_client.Client
    generator *goqu.DialectWrapper
}

func (r *UserRepository) GetUsers(ctx context.Context) ([]User, error) {
    // Строим типобезопасный запрос
    query := r.generator.From("users").
        Where(goqu.C("active").IsTrue()).
        Order(goqu.C("created_at").Desc()).
        Limit(20)

    sql, _, _ := query.ToSQL()
    rows, err := r.db.QueryContext(ctx, sql)
    // ...
}
✨ Возможности
🔌 Плагинная архитектура диалектов

Драйверы БД сами регистрируют свой диалект для goqu:

// В драйвере postgres
func init() {
    db_sql_generator.Registration(Postgres, "postgres")
}

// В драйвере mysql
func init() {
    db_sql_generator.Registration(MySQL, "mysql")
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var Component = &component.Component{
	Init: component.StepFunc(func(container container.Container) error {
		return container.Provides(
			NewConfig,
			NewGenerator,
		)
	}),
	Configuration: component.StepFunc(func(container container.Container) error {
		return container.Invoke(Configuration)
	}),
}

Component is a ready-to-use Compogo component that provides a SQL query builder. It automatically:

  • Registers Config and Generator in the DI container
  • Applies configuration during Configuration phase
  • Makes the generator available for repositories and services

Usage:

compogo.WithComponents(
    db_client.Component,           // database client (provides driver name)
    db_sql_generator.Component,    // SQL query builder
    // ... driver components (postgres, mysql, etc.)
)

The driver name is automatically taken from db-client configuration and used to select the appropriate SQL dialect.

In your repository component:

type UserRepository struct {
    db        db_client.Client
    generator *goqu.DialectWrapper
}

func NewUserRepository(container container.Container) (*UserRepository, error) {
    var repo UserRepository
    err := container.Invoke(func(db db_client.Client, gen *goqu.DialectWrapper) {
        repo = UserRepository{db: db, generator: gen}
    })
    return &repo, err
}

Functions

func NewGenerator

func NewGenerator(config *Config, informer logger.Informer) (*goqu.DialectWrapper, error)

NewGenerator creates a new goqu dialect wrapper for the configured database driver. It performs the following steps:

  1. Looks up the dialect alias for the configured driver
  2. Returns a goqu.DialectWrapper ready for building SQL queries

The generator should be used in repositories to construct type-safe SQL queries.

Example:

type UserRepository struct {
    db        db_client.Client
    generator *goqu.DialectWrapper
}

func (r *UserRepository) GetUsers(ctx context.Context) ([]User, error) {
    query := r.generator.From("users").Where(goqu.C("active").IsTrue())
    sql, _, _ := query.ToSQL()
    return r.db.QueryContext(ctx, sql)
}

func Registration

func Registration(d driver.Driver, alias string)

Registration registers a new database driver and its goqu dialect alias. This function should be called during driver package initialization. The dialect will then be available for use via the generator component.

Example (in postgres driver):

func init() {
    db_sql_generator.Registration(Postgres, "postgres")
}

Types

type Config

type Config struct {
	Driver driver.Driver
}

func Configuration

func Configuration(config *Config) *Config

func NewConfig

func NewConfig() *Config

Jump to

Keyboard shortcuts

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