Documentation
¶
Overview ¶
Package fluentsql provides a fluent SQL query builder for Go.
go-fluent-sql offers a Laravel-inspired API for building SQL queries with built-in protection against SQL injection attacks.
Quick Start ¶
Connect to a database and start building queries:
db, err := fluentsql.Connect("user:pass@tcp(localhost:3306)/dbname")
if err != nil {
log.Fatal(err)
}
defer db.Close()
qb := fluentsql.New(db)
Select Queries ¶
Build SELECT queries using the fluent API:
var users []User
err := qb.Table("users").
Select("id", "name", "email").
Where("status", "=", "active").
OrderBy("created_at", "DESC").
Limit(10).
Get(&users)
Where Clauses ¶
Multiple WHERE methods are available:
qb.Where("age", ">", 18)
qb.OrWhere("role", "=", "admin")
qb.WhereIn("status", []interface{}{"active", "pending"})
qb.WhereBetween("created_at", startDate, endDate)
qb.WhereNull("deleted_at")
Insert, Update, Delete ¶
Execute write operations:
// Insert
result, err := qb.Table("users").Insert(map[string]interface{}{
"name": "John",
"email": "john@example.com",
})
// Update
result, err := qb.Table("users").
Where("id", "=", 1).
Update(map[string]interface{}{"status": "inactive"})
// Delete
result, err := qb.Table("users").
Where("status", "=", "banned").
Delete()
Transactions ¶
Use transactions for atomic operations:
tx, err := fluentsql.BeginTransaction(db)
if err != nil {
return err
}
if err := tx.Table("accounts").Where("id", "=", 1).Update(debit); err != nil {
tx.Rollback()
return err
}
if err := tx.Table("accounts").Where("id", "=", 2).Update(credit); err != nil {
tx.Rollback()
return err
}
return tx.Commit()
Security ¶
go-fluent-sql protects against SQL injection through:
- Prepared statements for all values
- Identifier validation (table/column names)
- Operator whitelisting
Thread Safety ¶
QueryBuilder instances are NOT thread-safe. Create a new instance for each goroutine or query.
Supported Databases ¶
- MySQL / MariaDB
- PostgreSQL (coming soon)
- SQLite (coming soon)
Package fluentsql, Go dilinde akıcı SQL sorguları oluşturmayı ve yönetmeyi sağlayan bir kütüphanedir. Bu paket, hem bağlantılı hem de bağlantısız sorgu oluşturmayı destekler, raw SQL ifadelerini güvenli biçimde kullanmayı sağlar ve çeşitli konfigürasyon seçenekleri sunar.
Yazar: Ahmet ALTUN Github: github.com/biyonik LinkedIn: linkedin.com/in/biyonik Email: ahmet.altun60@gmail.com
Index ¶
- Constants
- Variables
- func WrapError(op string, err error) error
- type Builder
- func (b *Builder) Clone() *Builder
- func (b *Builder) Count() (int64, error)
- func (b *Builder) CountContext(ctx context.Context) (int64, error)
- func (b *Builder) CrossJoin(table string) *Builder
- func (b *Builder) Delete() (*QueryResult, error)
- func (b *Builder) DeleteContext(ctx context.Context) (*QueryResult, error)
- func (b *Builder) Distinct() *Builder
- func (b *Builder) DoesntExist() (bool, error)
- func (b *Builder) DoesntExistContext(ctx context.Context) (bool, error)
- func (b *Builder) Err() error
- func (b *Builder) Exists() (bool, error)
- func (b *Builder) ExistsContext(ctx context.Context) (bool, error)
- func (b *Builder) First(dest any) error
- func (b *Builder) FirstContext(ctx context.Context, dest any) error
- func (b *Builder) ForPage(page, perPage int) *Builder
- func (b *Builder) From(name string) *Builder
- func (b *Builder) Get(dest any) error
- func (b *Builder) GetColumns() []string
- func (b *Builder) GetContext(ctx context.Context, dest any) error
- func (b *Builder) GetGroupBy() []string
- func (b *Builder) GetHaving() []dialect.WhereClause
- func (b *Builder) GetJoins() []dialect.JoinClause
- func (b *Builder) GetLimit() *int
- func (b *Builder) GetOffset() *int
- func (b *Builder) GetOrders() []dialect.OrderClause
- func (b *Builder) GetTable() string
- func (b *Builder) GetTableAlias() string
- func (b *Builder) GetWheres() []dialect.WhereClause
- func (b *Builder) GroupBy(columns ...string) *Builder
- func (b *Builder) Having(column, operator string, value any) *Builder
- func (b *Builder) HavingRaw(sqlExpr string, bindings ...any) *Builder
- func (b *Builder) Insert(data map[string]any) (*QueryResult, error)
- func (b *Builder) InsertContext(ctx context.Context, data map[string]any) (*QueryResult, error)
- func (b *Builder) IsDistinct() bool
- func (b *Builder) Join(table, first, operator, second string) *Builder
- func (b *Builder) Latest() *Builder
- func (b *Builder) LeftJoin(table, first, operator, second string) *Builder
- func (b *Builder) Limit(n int) *Builder
- func (b *Builder) Offset(n int) *Builder
- func (b *Builder) Oldest() *Builder
- func (b *Builder) OrWhere(column, operator string, value any) *Builder
- func (b *Builder) OrWhereIn(column string, values []any) *Builder
- func (b *Builder) OrWhereNested(fn func(*Builder)) *Builder
- func (b *Builder) OrWhereNotIn(column string, values []any) *Builder
- func (b *Builder) OrWhereNotNull(column string) *Builder
- func (b *Builder) OrWhereNull(column string) *Builder
- func (b *Builder) OrWhereRaw(sqlExpr string, bindings ...any) *Builder
- func (b *Builder) OrderBy(column string, direction dialect.OrderDirection) *Builder
- func (b *Builder) OrderByAsc(column string) *Builder
- func (b *Builder) OrderByDesc(column string) *Builder
- func (b *Builder) OrderByRaw(expr string) *Builder
- func (b *Builder) Reset() *Builder
- func (b *Builder) RightJoin(table, first, operator, second string) *Builder
- func (b *Builder) Select(columns ...string) *Builder
- func (b *Builder) SelectRaw(expr string) *Builder
- func (b *Builder) Skip(n int) *Builder
- func (b *Builder) Table(name string) *Builder
- func (b *Builder) TableAs(name, alias string) *Builder
- func (b *Builder) Take(n int) *Builder
- func (b *Builder) ToDeleteSQL() (string, []any, error)
- func (b *Builder) ToInsertSQL(data map[string]any) (string, []any, error)
- func (b *Builder) ToSQL() (string, []any, error)
- func (b *Builder) ToSelectSQL() (string, []any, error)
- func (b *Builder) ToUpdateSQL(data map[string]any) (string, []any, error)
- func (b *Builder) Unless(condition bool, fn func(*Builder)) *Builder
- func (b *Builder) Update(data map[string]any) (*QueryResult, error)
- func (b *Builder) UpdateContext(ctx context.Context, data map[string]any) (*QueryResult, error)
- func (b *Builder) When(condition bool, fn func(*Builder)) *Builder
- func (b *Builder) Where(column, operator string, value any) *Builder
- func (b *Builder) WhereBetween(column string, min, max any) *Builder
- func (b *Builder) WhereDate(column string, value string) *Builder
- func (b *Builder) WhereDay(column string, value int) *Builder
- func (b *Builder) WhereIn(column string, values []any) *Builder
- func (b *Builder) WhereLike(column string, pattern string) *Builder
- func (b *Builder) WhereMonth(column string, value int) *Builder
- func (b *Builder) WhereNested(fn func(*Builder)) *Builder
- func (b *Builder) WhereNotBetween(column string, min, max any) *Builder
- func (b *Builder) WhereNotIn(column string, values []any) *Builder
- func (b *Builder) WhereNotLike(column string, pattern string) *Builder
- func (b *Builder) WhereNotNull(column string) *Builder
- func (b *Builder) WhereNull(column string) *Builder
- func (b *Builder) WhereRaw(sqlExpr string, bindings ...any) *Builder
- func (b *Builder) WhereYear(column string, value int) *Builder
- type BuilderOption
- type Config
- type DB
- func (d *DB) Begin() (*Transaction, error)
- func (d *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Transaction, error)
- func (d *DB) Close() error
- func (d *DB) Grammar() dialect.Grammar
- func (d *DB) IsDebug() bool
- func (d *DB) Logger() Logger
- func (d *DB) Ping(ctx context.Context) error
- func (d *DB) Scanner() Scanner
- func (d *DB) Table(name string) *Builder
- func (d *DB) TablePrefix() string
- func (d *DB) Transaction(ctx context.Context, fn func(*Transaction) error) error
- type DefaultScanner
- func (s *DefaultScanner) GetFieldNames(dest any) ([]string, error)
- func (s *DefaultScanner) GetPrimaryKey(dest any) string
- func (s *DefaultScanner) ScanColumn(rows *sql.Rows, dest any) error
- func (s *DefaultScanner) ScanRow(row *sql.Row, dest any) error
- func (s *DefaultScanner) ScanRows(rows *sql.Rows, dest any) error
- func (s *DefaultScanner) ScanValue(row *sql.Row, dest any) error
- type Logger
- type NopLogger
- type Option
- type Pagination
- type QueryError
- type QueryExecutor
- type QueryResult
- type Raw
- type Scanner
- type Transaction
- func (t *Transaction) Commit() error
- func (t *Transaction) ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
- func (t *Transaction) Grammar() dialect.Grammar
- func (t *Transaction) IsClosed() bool
- func (t *Transaction) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
- func (t *Transaction) QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
- func (t *Transaction) ReleaseSavepoint(name string) error
- func (t *Transaction) Rollback() error
- func (t *Transaction) RollbackTo(name string) error
- func (t *Transaction) Savepoint(name string) error
- func (t *Transaction) Scanner() Scanner
- func (t *Transaction) Table(name string) *Builder
- func (t *Transaction) Tx() *sql.Tx
- type ValidationError
Constants ¶
const Version = "0.1.0-alpha"
Version, go-fluent-sql kütüphanesinin mevcut sürümünü belirtir.
Variables ¶
var ( // ErrNoRows is returned when a query returns no rows. ErrNoRows = errors.New("fluentsql: no rows in result set") // ErrNoTable is returned when no table is specified. ErrNoTable = errors.New("fluentsql: no table specified") // ErrNoColumns is returned when no columns are specified for insert/update. ErrNoColumns = errors.New("fluentsql: no columns specified") // ErrNoExecutor is returned when no database executor is set. ErrNoExecutor = errors.New("fluentsql: no database executor") // ErrInvalidIdentifier is returned for invalid SQL identifiers. ErrInvalidIdentifier = errors.New("fluentsql: invalid identifier") // ErrInvalidOperator is returned for disallowed operators. ErrInvalidOperator = errors.New("fluentsql: invalid operator") // ErrInvalidValue is returned for invalid values. ErrInvalidValue = errors.New("fluentsql: invalid value") // ErrNotAPointer is returned when dest is not a pointer. ErrNotAPointer = errors.New("fluentsql: destination must be a pointer") // ErrNotASlice is returned when dest is not a slice. ErrNotASlice = errors.New("fluentsql: destination must be a slice") // ErrNotAStruct is returned when dest element is not a struct. ErrNotAStruct = errors.New("fluentsql: destination element must be a struct") // ErrTxAlreadyClosed is returned when transaction is already committed/rolled back. ErrTxAlreadyClosed = errors.New("fluentsql: transaction already closed") // ErrEmptyBatch is returned when inserting empty batch. ErrEmptyBatch = errors.New("fluentsql: cannot insert empty batch") // ErrInconsistentBatch is returned when batch rows have different columns. ErrInconsistentBatch = errors.New("fluentsql: inconsistent columns in batch") // ErrEmptyWhereIn is returned when WhereIn is called with an empty slice. ErrEmptyWhereIn = errors.New("fluentsql: empty slice passed to WhereIn") // ErrInvalidBetweenValues is returned when WhereBetween doesn't receive exactly 2 values. ErrInvalidBetweenValues = errors.New("fluentsql: BETWEEN requires exactly 2 values") // ErrConnectionClosed is returned when trying to use a closed connection. ErrConnectionClosed = errors.New("fluentsql: connection closed") // ErrQueryTimeout is returned when a query exceeds the context deadline. ErrQueryTimeout = errors.New("fluentsql: query timeout exceeded") )
Sentinel errors for go-fluent-sql. These errors can be checked using errors.Is().
Functions ¶
func WrapError ¶
------------------------------------------------------------------------------- 🔄 WrapError ------------------------------------------------------------------------------- Amaç: Operasyon ismiyle birlikte hata zinciri oluşturmak. Kullanım: return WrapError("insert", err) Sonuç: `fluentsql: insert: <wrapped error>` şeklinde takip edilebilir output üretir. ------------------------------------------------------------------------------
Types ¶
type Builder ¶
type Builder struct {
// contains filtered or unexported fields
}
Builder, SQL sorgularını akıcı bir arayüz (fluent interface) ile oluşturmak için kullanılan ana sınıftır.
Bu sınıf, Laravel ve Symfony'nin Query Builder mantığından esinlenmiştir. Sorguların neyi, nasıl ve neden yaptığına dair okunabilir ve bakımı kolay bir yapı sunar. Builder örnekleri **concurrent-safe** değildir; paralel kullanımlar için Clone() ile çoğaltılmalıdır.
Genel kullanım örneği:
var users []User
err := db.Table("users").
Select("id", "name", "email").
Where("status", "=", "active").
OrderByDesc("created_at").
Limit(10).
GetContext(ctx, &users)
Bu sınıf, SELECT, INSERT, UPDATE, DELETE işlemlerini destekler ve sorgu bileşenlerini kolayca birleştirmeyi sağlar.
@author Ahmet ALTUN @github github.com/biyonik @linkedin linkedin.com/in/biyonik @email ahmet.altun60@gmail.com
func New ¶
New, veritabanı bağlantısı olmadan yeni bir Builder oluşturur. SQL stringleri oluşturmak ve sorgu yürütmeden hazırlık yapmak için kullanılır.
Örnek:
qb := fluentsql.New()
sql, args, err := qb.Table("users").
Select("id", "name").
Where("status", "=", "active").
ToSQL()
func NewBuilder ¶
func NewBuilder(executor QueryExecutor, grammar dialect.Grammar, scanner Scanner) *Builder
NewBuilder, belirtilen executor, grammar ve scanner ile yeni bir Builder oluşturur.
func Table ¶
Table, yeni bir Builder oluşturup tablo adını ayarlamak için kısayoldur.
Örnek:
sql, args, err := fluentsql.Table("users").
Where("status", "=", "active").
ToSQL()
func (*Builder) CountContext ¶
CountContext, sorgu için toplam satır sayısını döndürür.
func (*Builder) Delete ¶
func (b *Builder) Delete() (*QueryResult, error)
Delete, DeleteContext’in context.Background() versiyonudur.
func (*Builder) DeleteContext ¶
func (b *Builder) DeleteContext(ctx context.Context) (*QueryResult, error)
DeleteContext, DELETE sorgusu çalıştırır.
func (*Builder) DoesntExist ¶
DoesntExist, DoesntExistContext’in context.Background() versiyonudur.
func (*Builder) DoesntExistContext ¶
DoesntExistContext, sorguda hiçbir satır yoksa true döner.
func (*Builder) ExistsContext ¶
ExistsContext, sorguda herhangi bir satır var mı kontrol eder.
func (*Builder) FirstContext ¶
FirstContext, LIMIT 1 ile sorguyu çalıştırır.
func (*Builder) GetColumns ¶
GetColumns, seçilen kolonları döndürür.
func (*Builder) GetContext ¶
GetContext, sorguyu çalıştırır ve sonuçları dest içine tarar.
func (*Builder) GetGroupBy ¶
GetGroupBy, GROUP BY kolonlarını döndürür.
func (*Builder) GetHaving ¶
func (b *Builder) GetHaving() []dialect.WhereClause
GetHaving, HAVING koşullarını döndürür.
func (*Builder) GetJoins ¶
func (b *Builder) GetJoins() []dialect.JoinClause
GetJoins, JOIN koşullarını döndürür.
func (*Builder) GetOrders ¶
func (b *Builder) GetOrders() []dialect.OrderClause
GetOrders, ORDER BY koşullarını döndürür.
func (*Builder) GetTableAlias ¶
GetTableAlias, tablo aliasını döndürür.
func (*Builder) GetWheres ¶
func (b *Builder) GetWheres() []dialect.WhereClause
GetWheres, WHERE koşullarını döndürür.
func (*Builder) Insert ¶
func (b *Builder) Insert(data map[string]any) (*QueryResult, error)
Insert, InsertContext’in context.Background() versiyonudur.
func (*Builder) InsertContext ¶
InsertContext, INSERT sorgusu çalıştırır.
func (*Builder) IsDistinct ¶
IsDistinct, DISTINCT kullanılıp kullanılmadığını döndürür.
func (*Builder) OrWhereNested ¶
OrWhereNested, OR iç içe WHERE bloğu ekler.
func (*Builder) OrWhereNotIn ¶
OrWhereNotIn, OR WHERE NOT IN koşulu ekler.
func (*Builder) OrWhereNotNull ¶
OrWhereNotNull, OR WHERE IS NOT NULL koşulu ekler.
func (*Builder) OrWhereNull ¶
OrWhereNull, OR WHERE IS NULL koşulu ekler.
func (*Builder) OrWhereRaw ¶
OrWhereRaw, ham SQL OR WHERE ifadesi ekler.
func (*Builder) OrderBy ¶
func (b *Builder) OrderBy(column string, direction dialect.OrderDirection) *Builder
OrderBy, ORDER BY ekler.
func (*Builder) OrderByAsc ¶
OrderByAsc, artan sırada ORDER BY ekler.
func (*Builder) OrderByDesc ¶
OrderByDesc, azalan sırada ORDER BY ekler.
func (*Builder) OrderByRaw ¶
OrderByRaw, ham ORDER BY ifadesi ekler.
func (*Builder) SelectRaw ¶
SelectRaw, ham SQL select ifadesi ekler. Dikkat: SQL injection riskine karşı ifadeyi güvenli şekilde kullanın.
func (*Builder) ToDeleteSQL ¶
ToDeleteSQL, DELETE sorgusunu derler.
func (*Builder) ToInsertSQL ¶
ToInsertSQL, INSERT sorgusunu derler.
func (*Builder) ToSelectSQL ¶
ToSelectSQL, SELECT sorgusunu derler.
func (*Builder) ToUpdateSQL ¶
ToUpdateSQL, UPDATE sorgusunu derler.
func (*Builder) Update ¶
func (b *Builder) Update(data map[string]any) (*QueryResult, error)
Update, UpdateContext’in context.Background() versiyonudur.
func (*Builder) UpdateContext ¶
UpdateContext, UPDATE sorgusu çalıştırır.
func (*Builder) WhereBetween ¶
WhereBetween, WHERE BETWEEN koşulu ekler.
func (*Builder) WhereMonth ¶
WhereMonth, MONTH(column) = value koşulu ekler.
func (*Builder) WhereNested ¶
WhereNested, iç içe WHERE bloğu ekler.
func (*Builder) WhereNotBetween ¶
WhereNotBetween, WHERE NOT BETWEEN koşulu ekler.
func (*Builder) WhereNotIn ¶
WhereNotIn, WHERE NOT IN koşulu ekler.
func (*Builder) WhereNotLike ¶
WhereNotLike, WHERE NOT LIKE koşulu ekler.
func (*Builder) WhereNotNull ¶
WhereNotNull, WHERE IS NOT NULL koşulu ekler.
type BuilderOption ¶
type BuilderOption func(*Builder)
BuilderOption tipi, yalnızca query bazlı kullanılan yapılandırmalardır. DB Option'larından farklıdır çünkü her sorguda ayrı davranışlara izin verir.
Amaç: • Daha ince taneli kontrol • Bağlam bazlı varyasyon
type Config ¶
type Config struct {
Driver string // Kullanılacak sürücü: "mysql", "postgres" vb.
Host string // Veritabanı sunucusunun adresi (IP veya domain)
Port int // Bağlantı portu
Database string // Bağlanılacak veritabanı (schema) adı
Username string // Yetkilendirme için kullanıcı adı
Password string // Yetkilendirme için parola
Charset string // Karakter seti (varsayılan: utf8mb4)
Collation string // Sıralama ve karşılaştırma kuralları (varsayılan: utf8mb4_unicode_ci)
Prefix string // Tablo isimlerinin önüne eklenecek önek (prefix)
MaxOpenConns int // Havuzdaki maksimum açık bağlantı sayısı (0 = sınırsız)
MaxIdleConns int // Havuzda boşta bekletilecek maksimum bağlantı sayısı
ConnMaxLife time.Duration // Bir bağlantının yaşam döngüsü süresi
ConnMaxIdle time.Duration // Bir bağlantının boşta kalabileceği maksimum süre
TLS bool // TLS/SSL şifreli bağlantı zorunluluğu
}
Config, veritabanı bağlantısının DNA'sını oluşturan yapılandırma şemasıdır.
Bir veritabanı bağlantısı sadece host ve porttan ibaret değildir. Performanslı bir uygulama için Connection Pooling (Havuzlama), Timeout süreleri, Karakter setleri (Charset) ve SSL/TLS ayarları hayati önem taşır. Bu struct, tüm bu parametreleri tek bir çatı altında toplar.
func DefaultConfig ¶
func DefaultConfig() *Config
DefaultConfig, üretim ortamına (production) uygun varsayılan ayarlarla dolu bir konfigürasyon nesnesi döndürür.
Geliştirici hiçbir ayar yapmasa bile, bu metot sayesinde "çalışan" ve belirli bir performans standardına sahip bir yapılandırma elde eder.
func (*Config) DSN ¶
DSN (Data Source Name), veritabanı sürücüsünün anlayacağı formatta bağlantı dizesini (connection string) oluşturur.
Özellikle MySQL için gereken karmaşık parametre dizilimini (user:pass@tcp(host:port)/db?param=val) dinamik olarak inşa eder. Charset, collation ve parseTime gibi kritik parametreleri sorgu dizesine (query string) ekler.
type DB ¶
type DB struct {
*sql.DB // Standart Go DB nesnesi gömülü olarak bulunur.
// contains filtered or unexported fields
}
DB struct'ı veritabanı bağlantısını sarar ve üzerine grammar, scanner, logging, prefix gibi ORM davranışlarını belirleyen özellikler ekler. Böylece DB artık yalnızca bağlanılan yer değil, sorguyu şekillendiren ve işleyen ana merkez olur.
Bu yapı; "Salt bağlantı" → "Akıllı ORM çekirdeği" dönüşümünün temel taşıdır. ---------------------------------------------------------------------
func Connect ¶
Connect, verilen driver ve veri kaynağıyla yeni bir veritabanı bağlantısı oluşturur ve DB örneğini döndürür. Bağlantının doğruluğunu kontrol eder ve hata oluşursa WrapError ile sarar.
Örnek:
db, err := fluentsql.Connect("mysql", "user:pass@tcp(localhost:3306)/dbname")
if err != nil {
log.Fatal(err)
}
defer db.Close()
func ConnectWithConfig ¶
ConnectWithConfig, Config yapısı kullanarak yeni bir veritabanı bağlantısı oluşturur. Bağlantı havuz ayarlarını uygular ve DSN oluşturur.
Örnek:
cfg := &fluentsql.Config{
Driver: "mysql",
Host: "localhost",
Port: 3306,
Database: "mydb",
Username: "user",
Password: "pass",
}
db, err := fluentsql.ConnectWithConfig(cfg)
func NewDB ¶
NewDB -> DB sarmalayıcısının oluşturulduğu yerdir. Varsayılan Grammar ve Scanner atanır, opsiyonlar ile davranış şekillendirilebilir. Geliştirici, yalnızca sql.DB verip gerisini bu wrapper'a teslim eder → Akıcı yapı başlar. ---------------------------------------------------------------------
func (*DB) Begin ¶
func (d *DB) Begin() (*Transaction, error)
Begin -> Varsayılan ayarlarla transaction başlatır. Hızlı kullanım için kısayoldur. ---------------------------------------------------------------------
func (*DB) BeginTx ¶
BeginTx -> Manuel transaction başlatır. Bağlantıya güvenip işi tek adımda yapmak yerine, adım adım ilerlemek isteyen geliştiriciler için kontrollü güç sunar. ---------------------------------------------------------------------
func (*DB) Table ¶
Table -> Yeni bir Query Builder oluşturur ve belirtilen tablo üzerinde çalışmaya başlar. Bu fonksiyon, sorgu yazımının ilk adımıdır. Zincirin başlangıç halkasıdır. ---------------------------------------------------------------------
func (*DB) TablePrefix ¶
TablePrefix -> Tüm tabloların başında kullanılacak ön-ek (prefix) değerini döndürür.
func (*DB) Transaction ¶
Transaction -> Verilen fonksiyon içerisinde otomatik transaction yönetimi sağlar. Başarılı olursa commit, hata veya panic durumunda rollback yapar. Laravel `DB::transaction()` davranışına doğrudan bir karşılıktır. ---------------------------------------------------------------------
type DefaultScanner ¶
type DefaultScanner struct {
// contains filtered or unexported fields
}
DefaultScanner → Kütüphanenin standart tarama motorudur. Reflection kullanır, `db:"field"` tag’i ile eşleme yapar. Struct metadata bilgisi cache’de tutulduğu için yüksek performans sağlar.
func NewDefaultScanner ¶
func NewDefaultScanner() *DefaultScanner
NewDefaultScanner → Varsayılan scanner oluşturur. Dışarıdan bağımlılık gerektirmez, tek satırda çağrılır:
scanner := NewDefaultScanner()
func (*DefaultScanner) GetFieldNames ¶
func (s *DefaultScanner) GetFieldNames(dest any) ([]string, error)
GetFieldNames → Struct içerisinde veritabanına karşılık gelen bütün kolon adlarını döner. SELECT * yerine SELECT id,name,email üretmek isteyen sistemler burada beslenir.
func (*DefaultScanner) GetPrimaryKey ¶
func (s *DefaultScanner) GetPrimaryKey(dest any) string
GetPrimaryKey → struct'ın birincil anahtar kolonunu döner. Eğer tanımlı değilse "id" fallback olarak kabul edilir.
func (*DefaultScanner) ScanColumn ¶
func (s *DefaultScanner) ScanColumn(rows *sql.Rows, dest any) error
ScanColumn → sonuçların tek bir kolon olup slice’a yazıldığı senaryolar içindir. Örnek:
var ids []int scanner.ScanColumn(rows, &ids)
func (*DefaultScanner) ScanRow ¶
func (s *DefaultScanner) ScanRow(row *sql.Row, dest any) error
ScanRow → Tek satırı karşılayan scanner fonksiyonudur. Struct pointer bekler, alanlar tek tek doldurulur. Row yok ise ErrNoRows döner.
func (*DefaultScanner) ScanRows ¶
func (s *DefaultScanner) ScanRows(rows *sql.Rows, dest any) error
ScanRows → Çoklu sonuç tarayıcı. rows sonuç kümesini slice’a aktarır. (Users → []User şeklinde)
ÖNEMLİ NOKTA: - Eğer hedef slice pointer değilse çalışmaz - Eğer slice element yapısı struct değilse hata döner
type Logger ¶
Logger, sistemin kara kutusudur.
Çalışan SQL sorgularını, parametreleri, sorgunun ne kadar sürdüğünü ve olası hataları izlemek (observability) için kullanılan arayüzdür. Geliştirici kendi logger'ını enjekte ederek sorgu performansını analiz edebilir.
type NopLogger ¶
type NopLogger struct{}
NopLogger (No-Operation Logger), "sessiz mod" için kullanılan bir logger uygulamasıdır.
Eğer geliştirici herhangi bir loglama mekanizması belirtmezse, sistemin hata vermeden çalışmaya devam etmesi için bu boş (dummy) yapı kullanılır. Tüm logları yutar ve hiçbir işlem yapmaz.
type Option ¶
type Option func(*DB)
Option tipi, bir *DB* örneği üzerinde çalışan yapılandırma fonksiyonlarının temel imzasıdır. Bu tasarım sayesinde, yapılandırma parametreleri sabit ve katı değil; ihtiyaç oldukça genişletilebilir bir yapıya kavuşur.
Neden böyle? Çünkü proje büyüdükçe veritabanı davranışı da evrilir. Option pattern, kodu işlemeye dokunmadan yeni ayarlar eklemeye olanak tanır.
func WithDebug ¶
WithDebug fonksiyonu debug modunu aktif veya pasif hâle getirir. Debug açık olduğunda, oluşturulan her sorgu loglanır.
Neyi, nasıl değiştirir? • Debug = true -> tüm query'ler Logger üzerinden görünür hale gelir • Geliştirme aşamasında şeffaflık sağlar, hata analizini hızlandırır
Örnek:
db := fluentsql.NewDB(sqlDB, fluentsql.WithDebug(true))
func WithGrammar ¶
WithGrammar fonksiyonu, FluentSQL'in derleme aşamasında kullanacağı SQL gramerini değiştirmeye yarar. Varsayılan olarak MySQLGrammar kullanılır, fakat PostgreSQL, SQLite veya özel türevler kolayca eklenebilir.
Neyi sağlar? • Sorgu oluşturma kurallarının değişmesini • Farklı veri tabanı motorlarına geçişte minimum maliyet
Nasıl çalışır? • Option fonksiyonu olarak DB'ye enjekte edilir ve grammar alanını doldurur.
Örnek:
db := fluentsql.NewDB(sqlDB, fluentsql.WithGrammar(fluentsql.NewPostgreSQLGrammar()))
func WithLogger ¶
WithLogger fonksiyonu özel bir logger tanımlamaya yarar. Debug moduyla birlikte kullanıldığında sorgularınızı istediğiniz formatta, istediğiniz hedefe aktarabilirsiniz.
Kullanım amacı? • CLI, file, remote log server gibi farklı log ortamlarını desteklemek • Geliştiriciye loglama mimarisini özgürce şekillendirme gücü vermek
Örnek:
db := fluentsql.NewDB(sqlDB,
fluentsql.WithDebug(true),
fluentsql.WithLogger(myLogger),
)
func WithScanner ¶
WithScanner fonksiyonu, veritabanından dönen sonucu struct içerisine map eden tarayıcı yapısını değiştirmeye imkân tanır. Varsayılan tarayıcı DefaultScanner’dır ancak özel modellemede esneklik sunması için yeniden tanımlanabilir.
Neden önemli? • Farklı veri tipleri veya dönüş yapılarıyla çalışırken kontrol sağlar • Geliştiricinin kendi scan algoritmasını yazmasına olanak tanır
Örnek:
db := fluentsql.NewDB(sqlDB, fluentsql.WithScanner(customScanner))
func WithTablePrefix ¶
WithTablePrefix fonksiyonu tüm tablo adlarına otomatik olarak prefix ekler. Çok tenantlı sistemlerde her müşterinin verisini ayırmak ya da proje genelinde ad çakışmalarını önlemek için oldukça zarif bir yaklaşımdır.
Örnek:
db := fluentsql.NewDB(sqlDB, fluentsql.WithTablePrefix("app_"))
// db.Table("users") → "app_users"
type Pagination ¶
type Pagination struct {
Page int // Mevcut sayfa numarası (1'den başlar)
PerPage int // Sayfa başına gösterilecek kayıt sayısı
Total int64 // Veritabanındaki toplam kayıt sayısı
TotalPages int // Hesaplanan toplam sayfa sayısı
HasMore bool // Sonraki sayfaların olup olmadığını belirten bayrak
}
Pagination, veri listeleme işlemlerinde "sayfalama" mantığını yöneten veri yapısıdır.
Modern web uygulamalarında ve API'lerde, binlerce kaydı tek seferde çekmek yerine parçalar halinde sunmak (chunking) performansın anahtarıdır. Bu yapı, hem istemciye sunulacak meta veriyi (toplam sayfa, mevcut sayfa vb.) hem de SQL sorgusu için gerekli olan LIMIT/OFFSET hesaplamalarını barındırır.
func NewPagination ¶
func NewPagination(page, perPage int, total int64) *Pagination
NewPagination, ham sayfalama parametrelerinden zengin bir Pagination nesnesi oluşturur.
Bu kurucu metot (constructor), geçersiz veya eksik parametreleri (örn: negatif sayfa sayısı) otomatik olarak "akıllı varsayılanlara" (sensible defaults) dönüştürür. Ayrıca toplam sayfa sayısını ve veri setinin devamı olup olmadığını matematiksel olarak hesaplar.
func (*Pagination) HasNext ¶
func (p *Pagination) HasNext() bool
HasNext, mevcut sayfadan ileriye gidilip gidilemeyeceğini kontrol eder. Eğer elimizdeki veri seti toplam sayfa sayısına ulaşmadıysa true döner.
func (*Pagination) HasPrev ¶
func (p *Pagination) HasPrev() bool
HasPrev, mevcut sayfadan geriye gidilip gidilemeyeceğini kontrol eder. Sayfa 1'de isek geriye gidiş yoktur.
func (*Pagination) Offset ¶
func (p *Pagination) Offset() int
Offset, SQL sorgusu için gerekli olan başlangıç noktasını (SKIP miktarını) hesaplar.
Örnek: 3. sayfadasınız ve her sayfada 10 kayıt var. Offset = (3 - 1) * 10 = 20. Yani ilk 20 kaydı atla, sonrakileri getir.
type QueryError ¶
type QueryError struct {
Op string // Operation: "select", "insert", "update", "delete", "compile"
Table string // Table name
SQL string // Generated SQL (sanitized, no actual values)
Err error // Underlying error
}
------------------------------------------------------------------------------- 🏷 QueryError -------------------------------------------------------------------------------
- Amaç: Sorgu işlemlerinde bağlam kaybı olmadan hata taşımak.
- Neden var?: Hatanın "hangi tablo", "hangi operasyon", "hangi SQL çıktısı" ile ilişkili olduğunun tek bakışta anlaşılması gerekir.
- Kullanım: `return &QueryError{ ... }` şeklinde veya `NewQueryError()` ile üretilir. errors.Unwrap() ile alt hata geri alınabilir.
------------------------------------------------------------------------------
func NewQueryError ¶
func NewQueryError(op, table, sql string, err error) *QueryError
NewQueryError creates a new QueryError with context. Bu yardımcı fonksiyon hata üretimini standartlaştırır; proje genelinde tek tip format ve izlenebilirlik sağlar.
func (*QueryError) Error ¶
func (e *QueryError) Error() string
Error implements the error interface. Bu fonksiyon hata mesajını okunabilir formatta döndürür. Eğer tablo adı mevcut ise → "select on table X" şeklinde detaylı yazılır.
func (*QueryError) Unwrap ¶
func (e *QueryError) Unwrap() error
Unwrap returns the underlying error. Amaç: Go'nun error chain mekanizması ile hatanın köküne ulaşabilmek.
type QueryExecutor ¶
type QueryExecutor interface {
// ExecContext -> INSERT/UPDATE/DELETE gibi sonuç satırı döndürmeyen komutlar için çalıştırma yöntemidir.
// Parametre olarak context alır; timeout, cancel vb. durumlarda akış kontrolü sağlanabilir.
ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
// QueryContext -> Birden fazla satır döndürebilen SELECT sorguları için çağrılır.
QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
// QueryRowContext -> Tek satır beklenen SELECT işlemlerinde kullanılır.
// Eğer veri yoksa *sql.Row.Err() ile boş dönebilir, bu durum bilinçli yönetilmelidir.
QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
}
QueryExecutor arayüzü; hem *sql.DB hem *sql.Tx yapılarının ortak olarak sağlayabildiği temel veritabanı fonksiyonlarını soyutlar. Böylece işlem ister direkt DB'de olsun ister Transaction içinde, kod yapısı ve çağrım şekli değişmeden akıcı biçimde çalışabilir.
Bu mimari seçim, "Tek kod → iki farklı çalışma ortamı" yaklaşımının bir sonucudur. Özellikle transaction tabanlı finansal hareketlerde büyük esneklik sağlar. ---------------------------------------------------------------------
type QueryResult ¶
type QueryResult struct {
// contains filtered or unexported fields
}
QueryResult, bir INSERT, UPDATE veya DELETE işlemi sonucunda veritabanından dönen ham yanıtı sarmalayan (wrapper) yapıdır.
Bu yapı, ham `sql.Result` arabirimini doğrudan dışarı sızdırmak yerine, üzerinde güvenli erişim metotları sunarak olası çalışma zamanı hatalarını (runtime errors) minimize etmeyi hedefler.
func NewQueryResult ¶
func NewQueryResult(result sql.Result) *QueryResult
NewQueryResult, ham `sql.Result` nesnesinden güvenli bir FluentSQL sonuç nesnesi türetir.
Bu fabrika metodu, veritabanı sürücüsünden dönen sonucu paketleyerek kütüphanenin standartlarına uygun hale getirir.
func (*QueryResult) LastInsertID ¶
func (r *QueryResult) LastInsertID() (int64, error)
LastInsertID, veritabanına son eklenen kaydın benzersiz kimliğini (ID) döndürür.
Genellikle AUTO_INCREMENT (MySQL) veya SERIAL (Postgres) alanlar için kullanılır. Eğer altta yatan veritabanı sürücüsü bu özelliği desteklemiyorsa veya işlem başarısızsa 0 ve hata döner. Ayrıca sonucun `nil` olup olmadığını kontrol ederek panic durumunu önler.
func (*QueryResult) RowsAffected ¶
func (r *QueryResult) RowsAffected() (int64, error)
RowsAffected, çalıştırılan sorgudan kaç adet satırın etkilendiğini bildirir.
Özellikle toplu güncellemelerde (UPDATE) veya silme (DELETE) işlemlerinde, operasyonun başarısını ve kapsamını doğrulamak için kritik bir metriktir.
type Raw ¶
Raw, kaçış yapılmayacak ham SQL ifadesini temsil eder. Sadece güvenli ve kontrol edilen girdi için kullanın.
Bu tip, düzenli değerlerden ayırt edilebilmesi için bir işaretleyicidir.
type Scanner ¶
type Scanner interface {
// ScanRow → Tek satırı tek struct’a işler.
// Burada beklenen davranış; row’dan verileri okuyup struct alanlarına set etmektir.
ScanRow(row *sql.Row, dest any) error
// ScanRows → Birden fazla satırı slice içine işler.
// ORM kullanıyormuş hissi veren ana fonksiyondur.
ScanRows(rows *sql.Rows, dest any) error
}
Scanner veritabanından okunan satırları Go modellerine map eden davranış sözleşmesidir. Bu interface’i implement eden her yapı, satırları struct’a veya slice’a dönüştürebilir.
type Transaction ¶
type Transaction struct {
// contains filtered or unexported fields
}
Transaction struct'ı, bir SQL transaction’ı temsil eder ve Query Builder entegrasyonu ile birlikte çalışır. Aynı *sql.Tx* üzerinden sorgular zincir halinde yürütülür. Ancak dikkat: Bu yapı thread-safe değildir. Her goroutine kendi Transaction nesnesini kullanmalıdır.
func (*Transaction) Commit ¶
func (t *Transaction) Commit() error
Commit metodu, yapılan tüm işlemleri kalıcı hale getirir. Bir kez işlendiğinde transaction kapanır ve tekrar kullanılmaya çalışılırsa ErrTxAlreadyClosed üretir.
Kullanım Amacı: • İşlemlerin başarıyla tamamlandığını onaylamak • Sistem bütünlüğünü korumak
func (*Transaction) ExecContext ¶
func (t *Transaction) ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
ExecContext metodu — Builder kullanmaya gerek kalmadan raw SQL çalıştırmak için doğrudan erişim sunar.
Kullanım Alanı: • Özel SQL ifadeleri • Builder’ın desteklemediği query tipleri
func (*Transaction) Grammar ¶
func (t *Transaction) Grammar() dialect.Grammar
Grammar — transaction seviyesinde kullanılan SQL sözdizimini döndürür.
func (*Transaction) IsClosed ¶
func (t *Transaction) IsClosed() bool
IsClosed transaction'ın commit ya da rollback sonrası kapanıp kapanmadığını bildirir. Bu, işlem akışını kontrol ederken önemli bir güvenlik kilidi işlevi görür.
func (*Transaction) QueryContext ¶
func (t *Transaction) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
QueryContext — result set döndüren SELECT benzeri işlemler için kullanılır. Dönen sonuç satır tabanlıdır (*sql.Rows*).
func (*Transaction) QueryRowContext ¶
QueryRowContext — tek satır dönen sorgular içindir. Örneğin LIMIT 1, COUNT(), MAX() gibi yapılar için tercih edilir.
func (*Transaction) ReleaseSavepoint ¶
func (t *Transaction) ReleaseSavepoint(name string) error
ReleaseSavepoint — oluşturulan savepoint’i serbest bırakır. Bu işlem transaction’ı bitirmez, yalnızca savepoint'i temizler.
func (*Transaction) Rollback ¶
func (t *Transaction) Rollback() error
Rollback metodu — commit'in tam tersidir. Tüm değişiklikleri geri alır. Çok önemli not: Rollback tekrar tekrar çağıldığında hata vermez, idempotenttir.
Kullanım Senaryosu: • Hata oluştuğunda işlemi geri almak • Bir adım yanlış gittiğinde sistem tutarlılığını korumak
func (*Transaction) RollbackTo ¶
func (t *Transaction) RollbackTo(name string) error
RollbackTo — transaction’ı tamamen geri almadan yalnızca belirli savepoint’e dönüş sağlar. Büyük sistemlerde geri dönüş maliyetini minimize eder.
func (*Transaction) Savepoint ¶
func (t *Transaction) Savepoint(name string) error
Savepoint — büyük transaction blokları arasında güvenli dönüş noktası oluşturur. Tüm işlemi bozmak yerine yalnızca belirli bölümü geri almak için kullanılır.
Not: Her veritabanı savepoint desteklemez.
func (*Transaction) Scanner ¶
func (t *Transaction) Scanner() Scanner
Scanner — transaction’ın tarayıcı (struct-bind) bileşenini döndürür.
func (*Transaction) Table ¶
func (t *Transaction) Table(name string) *Builder
Table metodu, transaction kapsamında kullanılmak üzere yeni bir Builder üretir. Amaç: Transaction içerisinde akıcı query üretmeyi sürdürmek.
Örnek:
tx, _ := db.Begin()
_, err := tx.Table("users").Where("id", "=", 1).Update(data)
func (*Transaction) Tx ¶
func (t *Transaction) Tx() *sql.Tx
Tx — alttaki *sql.Tx* referansına doğrudan erişim sağlar. ⚠ Kullanırken dikkatli olunmalıdır. Transaction metodları güvenlik kontrolleri içerirken raw erişim içermez.
type ValidationError ¶
type ValidationError struct {
Type string // "identifier", "operator", "value"
Value string // The invalid value
Reason string // Why it's invalid
}
------------------------------------------------------------------------------- 🏷 ValidationError -------------------------------------------------------------------------------
- Amaç: Identifier, operator veya value geçersiz olduğunda anlamlı geri dönüş üretmek.
- Neden özel struct?: Çünkü bir hatanın yalnızca oluşması değil, *neden* oluştuğu da önemlidir. Örn: "identifier geçersiz" vs "value geçersiz" → farklı kök sebepler.
- errors.Is() override edilmiştir, böylece ErrInvalidIdentifier gibi sabit hatalarla eşleştirilebilir.
------------------------------------------------------------------------------
func NewValidationError ¶
func NewValidationError(typ, value, reason string) *ValidationError
NewValidationError creates a new ValidationError. Kullanımı basitleştirilmiş factory fonksiyondur.
func (*ValidationError) Error ¶
func (e *ValidationError) Error() string
Error implements the error interface. Hatanın insan tarafından anlaşılabilir string halini döndürür.
func (*ValidationError) Is ¶
func (e *ValidationError) Is(target error) bool
Is allows errors.Is() to match against sentinel errors. Böylece errors.Is(err, ErrInvalidIdentifier) → true olabilir.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package dialect, farklı veritabanları için SQL dilbilgisi (grammar) implementasyonlarını sağlar.
|
Package dialect, farklı veritabanları için SQL dilbilgisi (grammar) implementasyonlarını sağlar. |
|
internal
|
|
|
validation
Package validation, SQL sorgularında kullanılan tablolar, kolonlar ve alias isimlerini güvenli bir şekilde doğrulamak için dahili yardımcı fonksiyonlar sağlar.
|
Package validation, SQL sorgularında kullanılan tablolar, kolonlar ve alias isimlerini güvenli bir şekilde doğrulamak için dahili yardımcı fonksiyonlar sağlar. |