sqlite

package
v1.0.37 Latest Latest
Warning

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

Go to latest
Published: Feb 8, 2026 License: Apache-2.0 Imports: 9 Imported by: 0

README

SQLite Writer

SQLite DDL (Data Definition Language) writer for RelSpec. Converts database schemas to SQLite-compatible SQL statements.

Features

  • Automatic Schema Flattening - SQLite doesn't support PostgreSQL-style schemas, so table names are automatically flattened (e.g., public.userspublic_users)
  • Type Mapping - Converts PostgreSQL data types to SQLite type affinities (TEXT, INTEGER, REAL, NUMERIC, BLOB)
  • Auto-Increment Detection - Automatically converts SERIAL types and auto-increment columns to INTEGER PRIMARY KEY AUTOINCREMENT
  • Function Translation - Converts PostgreSQL functions to SQLite equivalents (e.g., now()CURRENT_TIMESTAMP)
  • Boolean Handling - Maps boolean values to INTEGER (true=1, false=0)
  • Constraint Generation - Creates indexes, unique constraints, and documents foreign keys
  • Identifier Quoting - Properly quotes identifiers using double quotes

Usage

Convert PostgreSQL to SQLite
relspec convert --from pgsql --from-conn "postgres://user:pass@localhost/mydb" \
                --to sqlite --to-path schema.sql
Convert DBML to SQLite
relspec convert --from dbml --from-path schema.dbml \
                --to sqlite --to-path schema.sql
Multi-Schema Databases

SQLite doesn't support schemas, so multi-schema databases are automatically flattened:

# Input has auth.users and public.posts
# Output will have auth_users and public_posts
relspec convert --from json --from-path multi_schema.json \
                --to sqlite --to-path flattened.sql

Type Mapping

PostgreSQL Type SQLite Affinity Examples
TEXT TEXT varchar, text, char, citext, uuid, timestamp, json
INTEGER INTEGER int, integer, smallint, bigint, serial, boolean
REAL REAL real, float, double precision
NUMERIC NUMERIC numeric, decimal
BLOB BLOB bytea, blob

Auto-Increment Handling

Columns are converted to INTEGER PRIMARY KEY AUTOINCREMENT when they meet these criteria:

  • Marked as primary key
  • Integer type
  • Have AutoIncrement flag set, OR
  • Type contains "serial", OR
  • Default value contains "nextval"

Example:

-- Input (PostgreSQL)
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

-- Output (SQLite)
CREATE TABLE "users" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "name" TEXT
);

Default Value Translation

PostgreSQL SQLite Notes
now(), CURRENT_TIMESTAMP CURRENT_TIMESTAMP Timestamp functions
CURRENT_DATE CURRENT_DATE Date function
CURRENT_TIME CURRENT_TIME Time function
true, false 1, 0 Boolean values
gen_random_uuid() (removed) SQLite has no built-in UUID
nextval(...) (removed) Handled by AUTOINCREMENT

Foreign Keys

Foreign keys are generated as commented-out ALTER TABLE statements for reference:

-- Foreign key: fk_posts_user_id
-- ALTER TABLE "posts" ADD CONSTRAINT "posts_fk_posts_user_id"
--   FOREIGN KEY ("user_id")
--   REFERENCES "users" ("id");
-- Note: Foreign keys should be defined in CREATE TABLE for better SQLite compatibility

For production use, define foreign keys directly in the CREATE TABLE statement or execute the ALTER TABLE commands after creating all tables.

Constraints

  • Primary Keys: Inline for auto-increment columns, separate constraint for composite keys
  • Unique Constraints: Converted to CREATE UNIQUE INDEX statements
  • Check Constraints: Generated as comments (should be added to CREATE TABLE manually)
  • Indexes: Generated without PostgreSQL-specific features (no GIN, GiST, operator classes)

Output Structure

Generated SQL follows this order:

  1. Header comments
  2. PRAGMA foreign_keys = ON;
  3. CREATE TABLE statements (sorted by schema, then table)
  4. CREATE INDEX statements
  5. CREATE UNIQUE INDEX statements (for unique constraints)
  6. Check constraint comments
  7. Foreign key comments

Example

Input (multi-schema PostgreSQL):

CREATE SCHEMA auth;
CREATE TABLE auth.users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT now()
);

CREATE SCHEMA public;
CREATE TABLE public.posts (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES auth.users(id),
    title VARCHAR(200) NOT NULL,
    published BOOLEAN DEFAULT false
);

Output (SQLite with flattened schemas):

-- SQLite Database Schema
-- Database: mydb
-- Generated by RelSpec
-- Note: Schema names have been flattened (e.g., public.users -> public_users)

-- Enable foreign key constraints
PRAGMA foreign_keys = ON;

-- Schema: auth (flattened into table names)

CREATE TABLE "auth_users" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "username" TEXT NOT NULL,
    "created_at" TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE UNIQUE INDEX "auth_users_users_username_key" ON "auth_users" ("username");

-- Schema: public (flattened into table names)

CREATE TABLE "public_posts" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "user_id" INTEGER NOT NULL,
    "title" TEXT NOT NULL,
    "published" INTEGER DEFAULT 0
);

-- Foreign key: posts_user_id_fkey
-- ALTER TABLE "public_posts" ADD CONSTRAINT "public_posts_posts_user_id_fkey"
--   FOREIGN KEY ("user_id")
--   REFERENCES "auth_users" ("id");
-- Note: Foreign keys should be defined in CREATE TABLE for better SQLite compatibility

Programmatic Usage

import (
    "git.warky.dev/wdevs/relspecgo/pkg/models"
    "git.warky.dev/wdevs/relspecgo/pkg/writers"
    "git.warky.dev/wdevs/relspecgo/pkg/writers/sqlite"
)

func main() {
    // Create writer (automatically enables schema flattening)
    writer := sqlite.NewWriter(&writers.WriterOptions{
        OutputPath: "schema.sql",
    })

    // Write database schema
    db := &models.Database{
        Name: "mydb",
        Schemas: []*models.Schema{
            // ... your schema data
        },
    }

    err := writer.WriteDatabase(db)
    if err != nil {
        panic(err)
    }
}

Notes

  • Schema flattening is always enabled for SQLite output (cannot be disabled)
  • Constraint and index names are prefixed with the flattened table name to avoid collisions
  • Generated SQL is compatible with SQLite 3.x
  • Foreign key constraints require PRAGMA foreign_keys = ON; to be enforced
  • For complex schemas, review and test the generated SQL before use in production

Documentation

Index

Constants

View Source
const (
	TypeText    = "TEXT"
	TypeInteger = "INTEGER"
	TypeReal    = "REAL"
	TypeNumeric = "NUMERIC"
	TypeBlob    = "BLOB"
)

SQLite type affinities

Variables

This section is empty.

Functions

func FormatConstraintName

func FormatConstraintName(schema, table, constraint string, opts *writers.WriterOptions) string

FormatConstraintName formats a constraint name with table prefix if flattening

func FormatDefault

func FormatDefault(col *models.Column) string

FormatDefault formats a default value for SQLite

func GetTemplateFuncs

func GetTemplateFuncs(opts *writers.WriterOptions) template.FuncMap

GetTemplateFuncs returns template functions for SQLite SQL generation

func IsAutoIncrementCandidate

func IsAutoIncrementCandidate(col *models.Column) bool

IsAutoIncrementCandidate checks if a column should use AUTOINCREMENT

func IsIntegerType

func IsIntegerType(colType string) bool

IsIntegerType checks if a column type should be treated as integer

func MapBooleanValue

func MapBooleanValue(value string) string

MapBooleanValue converts PostgreSQL boolean literals to SQLite (0/1)

func MapPostgreSQLType

func MapPostgreSQLType(pgType string) string

MapPostgreSQLType maps PostgreSQL data types to SQLite type affinities

func QuoteIdentifier

func QuoteIdentifier(name string) string

QuoteIdentifier quotes an identifier for SQLite (double quotes)

Types

type ConstraintTemplateData

type ConstraintTemplateData struct {
	Schema         string
	Table          string
	Name           string
	Columns        []string
	Expression     string
	ForeignSchema  string
	ForeignTable   string
	ForeignColumns []string
	OnDelete       string
	OnUpdate       string
}

ConstraintTemplateData contains data for constraint templates

type IndexTemplateData

type IndexTemplateData struct {
	Schema  string
	Table   string
	Name    string
	Columns []string
}

IndexTemplateData contains data for index template

type TableTemplateData

type TableTemplateData struct {
	Schema     string
	Name       string
	Columns    []*models.Column
	PrimaryKey *models.Constraint
}

TableTemplateData contains data for table template

func BuildTableTemplateData

func BuildTableTemplateData(schema string, table *models.Table) TableTemplateData

BuildTableTemplateData builds TableTemplateData from a models.Table

type TemplateExecutor

type TemplateExecutor struct {
	// contains filtered or unexported fields
}

TemplateExecutor manages and executes SQLite SQL templates

func NewTemplateExecutor

func NewTemplateExecutor(opts *writers.WriterOptions) (*TemplateExecutor, error)

NewTemplateExecutor creates a new template executor for SQLite

func (*TemplateExecutor) ExecuteCreateCheckConstraint

func (te *TemplateExecutor) ExecuteCreateCheckConstraint(data ConstraintTemplateData) (string, error)

ExecuteCreateCheckConstraint executes the create check constraint template

func (*TemplateExecutor) ExecuteCreateForeignKey

func (te *TemplateExecutor) ExecuteCreateForeignKey(data ConstraintTemplateData) (string, error)

ExecuteCreateForeignKey executes the create foreign key template

func (*TemplateExecutor) ExecuteCreateIndex

func (te *TemplateExecutor) ExecuteCreateIndex(data IndexTemplateData) (string, error)

ExecuteCreateIndex executes the create index template

func (*TemplateExecutor) ExecuteCreateTable

func (te *TemplateExecutor) ExecuteCreateTable(data TableTemplateData) (string, error)

ExecuteCreateTable executes the create table template

func (*TemplateExecutor) ExecuteCreateUniqueConstraint

func (te *TemplateExecutor) ExecuteCreateUniqueConstraint(data ConstraintTemplateData) (string, error)

ExecuteCreateUniqueConstraint executes the create unique constraint template

func (*TemplateExecutor) ExecutePragmaForeignKeys

func (te *TemplateExecutor) ExecutePragmaForeignKeys() (string, error)

ExecutePragmaForeignKeys executes the pragma foreign keys template

type Writer

type Writer struct {
	// contains filtered or unexported fields
}

Writer implements the Writer interface for SQLite SQL output

func NewWriter

func NewWriter(options *writers.WriterOptions) *Writer

NewWriter creates a new SQLite SQL writer SQLite doesn't support schemas, so FlattenSchema is automatically enabled

func (*Writer) WriteDatabase

func (w *Writer) WriteDatabase(db *models.Database) error

WriteDatabase writes the entire database schema as SQLite SQL

func (*Writer) WriteSchema

func (w *Writer) WriteSchema(schema *models.Schema) error

WriteSchema writes a single schema as SQLite SQL

func (*Writer) WriteTable

func (w *Writer) WriteTable(table *models.Table) error

WriteTable writes a single table as SQLite SQL

Jump to

Keyboard shortcuts

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