ddlctl

module
v0.0.7 Latest Latest
Warning

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

Go to latest
Published: Jan 16, 2024 License: Apache-2.0

README

ddlctl

[!WARNING] This project is experimental. It is operational in the author's environment, but it is not known if it can be operated in other environments without trouble.

license pkg goreportcard workflow workflow workflow codecov sourcegraph

Overview

ddlctl is a tool for control RDBMS DDL.

TODO

  • generate subcommand
    • source language
      • Support go (beta)
    • dialect
      • Support mysql (alpha)
      • Support postgres (alpha)
      • Support cockroachdb (alpha)
      • Support spanner (alpha)
      • Support sqlite3
  • show subcommand
    • dialect
      • Support mysql (beta)
      • Support postgres (alpha)
      • Support cockroachdb (beta)
      • Support spanner (alpha)
      • Support sqlite3
  • diff subcommand
    • dialect
      • Support mysql (alpha)
      • Support postgres (alpha)
      • Support cockroachdb (alpha)
      • Support spanner (alpha)
      • Support sqlite3
  • apply subcommand
    • dialect
      • Support mysql (alpha)
      • Support postgres (alpha)
      • Support cockroachdb (alpha)
      • Support spanner (alpha)
      • Support sqlite3

Example

$ # == 1. Prepare your annotated model source code ================================
$ cat <<"EOF" > /tmp/sample.go
package sample

// User is a user model struct.
//
//pgddl:table "users"
//pgddl:constraint UNIQUE ("username")
//pgddl:index "index_users_username" ON "users" ("username")
type User struct {
    UserID   string `db:"user_id"  pgddl:"TEXT NOT NULL" pk:"true"`
    Username string `db:"username" pgddl:"TEXT NOT NULL"`
    Age      int    `db:"age"      pgddl:"INT  NOT NULL"`
}

// Group is a group model struct.
//
//pgddl:table CREATE TABLE IF NOT EXISTS "groups"
//pgddl:index CREATE UNIQUE INDEX "index_groups_group_name" ON "groups" ("group_name")
type Group struct {
    GroupID     string `db:"group_id"    pgddl:"TEXT NOT NULL" pk:"true"`
    GroupName   string `db:"group_name"  pgddl:"TEXT NOT NULL"`
    Description string `db:"description" pgddl:"TEXT NOT NULL"`
}
EOF

$ # == 2. generate DDL ================================
$ ddlctl generate --dialect postgres --column-tag-go db --ddl-tag-go pgddl --pk-tag-go pk --src /tmp/sample.go --dst /tmp/sample.sql
INFO: 2023/11/16 16:10:39 ddlctl.go:44: source: /tmp/sample.go
INFO: 2023/11/16 16:10:39 ddlctl.go:73: destination: /tmp/sample.sql

$ # == 3. Check generated DDL ================================
$ cat /tmp/sample.sql
-- Code generated by ddlctl. DO NOT EDIT.
--

-- source: tmp/sample.go:5
-- User is a user model struct.
--
-- pgddl:table "users"
-- pgddl:constraint UNIQUE ("username")
CREATE TABLE "users" (
    "user_id"  TEXT NOT NULL,
    "username" TEXT NOT NULL,
    "age"      INT  NOT NULL,
    PRIMARY KEY ("user_id"),
    UNIQUE ("username")
);

-- source: tmp/sample.go:7
-- pgddl:index "index_users_username" ON "users" ("username")
CREATE INDEX "index_users_username" ON "users" ("username");

-- source: tmp/sample.go:16
-- Group is a group model struct.
--
-- pgddl:table CREATE TABLE IF NOT EXISTS "groups"
CREATE TABLE IF NOT EXISTS "groups" (
    "group_id"    TEXT NOT NULL,
    "group_name"  TEXT NOT NULL,
    "description" TEXT NOT NULL,
    PRIMARY KEY ("group_id")
);

-- source: tmp/sample.go:17
-- pgddl:index CREATE UNIQUE INDEX "index_groups_group_name" ON "groups" ("group_name")
CREATE UNIQUE INDEX "index_groups_group_name" ON "groups" ("group_name");

Installation

pre-built binary
VERSION=v0.0.7

# download
curl -fLROSs https://github.com/kunitsucom/ddlctl/releases/download/${VERSION}/ddlctl_${VERSION}_darwin_arm64.zip

# unzip
unzip -j ddlctl_${VERSION}_darwin_arm64.zip '*/ddlctl'
go install
go install github.com/kunitsucom/ddlctl/cmd/ddlctl@v0.0.7

Usage

ddlctl
$ ddlctl --help
Usage:
    ddlctl [options]

Description:
    ddlctl is a tool for control RDBMS DDL.

sub commands:
    version: show version
    generate: generate DDL from source (file or directory) to destination (file or directory).
    show: show DDL from DSN like `SHOW CREATE TABLE`.
    diff: diff DDL from <before DDL source> to <after DDL source>.
    apply: apply DDL from <DDL source> to <DSN to apply>.

options:
    --trace (env: DDLCTL_TRACE, default: false)
        trace mode enabled
    --debug (env: DDLCTL_DEBUG, default: false)
        debug mode
    --help (default: false)
        show usage
ddlctl generate
$ ddlctl generate --help
Usage:
    ddlctl generate [options] --dialect <DDL dialect> --src <source> --dst <destination>

Description:
    generate DDL from source (file or directory) to destination (file or directory).

options:
    --lang (env: DDLCTL_LANGUAGE, default: go)
        programming language to generate DDL
    --dialect (env: DDLCTL_DIALECT, default: )
        SQL dialect to generate DDL
    --column-tag-go (env: DDLCTL_COLUMN_TAG_GO, default: db)
        column annotation key for Go struct tag
    --ddl-tag-go (env: DDLCTL_DDL_TAG_GO, default: ddlctl)
        DDL annotation key for Go struct tag
    --pk-tag-go (env: DDLCTL_PK_TAG_GO, default: pk)
        primary key annotation key for Go struct tag
    --src (env: DDLCTL_SOURCE, default: /dev/stdin)
        source file or directory
    --dst (env: DDLCTL_DESTINATION, default: /dev/stdout)
        destination file or directory
    --help (default: false)
        show usage
ddlctl show
$ ddlctl show --help
Usage:
    ddlctl show --dialect <DDL dialect> <DSN>

Description:
    show DDL from DSN like `SHOW CREATE TABLE`.

options:
    --dialect (env: DDLCTL_DIALECT, default: )
        SQL dialect to generate DDL
    --help (default: false)
        show usage
ddlctl diff
$ ddlctl diff --help
Usage:
    ddlctl diff [options] --dialect <DDL dialect> <before DDL source> <after DDL source>

Description:
    diff DDL from <before DDL source> to <after DDL source>.

options:
    --lang (env: DDLCTL_LANGUAGE, default: go)
        programming language to generate DDL
    --dialect (env: DDLCTL_DIALECT, default: )
        SQL dialect to generate DDL
    --column-tag-go (env: DDLCTL_COLUMN_TAG_GO, default: db)
        column annotation key for Go struct tag
    --ddl-tag-go (env: DDLCTL_DDL_TAG_GO, default: ddlctl)
        DDL annotation key for Go struct tag
    --pk-tag-go (env: DDLCTL_PK_TAG_GO, default: pk)
        primary key annotation key for Go struct tag
    --help (default: false)
        show usage
ddlctl apply
$ ddlctl apply --help
Usage:
    ddlctl apply [options] --dialect <DDL dialect> <DSN to apply> <DDL source>

Description:
    apply DDL from <DDL source> to <DSN to apply>.

options:
    --lang (env: DDLCTL_LANGUAGE, default: go)
        programming language to generate DDL
    --dialect (env: DDLCTL_DIALECT, default: )
        SQL dialect to generate DDL
    --column-tag-go (env: DDLCTL_COLUMN_TAG_GO, default: db)
        column annotation key for Go struct tag
    --ddl-tag-go (env: DDLCTL_DDL_TAG_GO, default: ddlctl)
        DDL annotation key for Go struct tag
    --pk-tag-go (env: DDLCTL_PK_TAG_GO, default: pk)
        primary key annotation key for Go struct tag
    --auto-approve (env: DDLCTL_AUTO_APPROVE, default: false)
        auto approve
    --help (default: false)
        show usage

Jump to

Keyboard shortcuts

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