Skip to main content
Version: 0.7.0

Dialects

QUARK routes SQL generation through a dialect abstraction. Dialects are responsible for placeholders, identifier quoting, insert ID behavior, upsert syntax, and DDL operations.

DialectConstructorNotes
PostgreSQLquark.PostgreSQL()$N placeholders, RETURNING, ON CONFLICT.
MySQLquark.MySQL()AUTO_INCREMENT, LAST_INSERT_ID, ON DUPLICATE KEY UPDATE.
MariaDBquark.MariaDB()MySQL-compatible upsert behavior (ON DUPLICATE KEY UPDATE). Treated as a distinct dialect for DDL edge cases.
SQLitequark.SQLite()In-memory friendly, RETURNING where supported.
MSSQLquark.MSSQL()IDENTITY, OFFSET/FETCH, MERGE upserts.
Oraclequark.Oracle()GENERATED AS IDENTITY, MERGE upserts.

Upsert mapping

user := User{Email: "alice@example.com", Name: "Alice Updated"}

err := quark.For[User](ctx, client).Upsert(
&user,
[]string{"email"},
[]string{"name", "active"},
)
DialectGenerated shape
PostgreSQLON CONFLICT (email) DO UPDATE SET ...
MySQLON DUPLICATE KEY UPDATE ...
MariaDBON DUPLICATE KEY UPDATE ...
SQLiteON CONFLICT (email) DO UPDATE SET col = excluded.col
MSSQLMERGE INTO ... USING ... WHEN MATCHED ...
OracleMERGE INTO ... USING ... WHEN MATCHED ...

Custom dialects

Custom or proprietary engines can be registered:

myDialect := &MyCustomDialect{}

quark.RegisterDialect("customdb", myDialect)

dialect, err := quark.DetectDialectByName("customdb")
if err != nil {
return err
}

client, err := quark.New("customdb", dsn, quark.WithDialect(dialect))

DetectDialectByName looks up a registered dialect by name and returns (Dialect, error). Use RegisterDialect once at init time.

The dialect interface covers SQL generation, placeholder formatting, identifier quoting, and schema DDL.