Skip to content

Latest commit

 

History

History
277 lines (214 loc) · 12.6 KB

File metadata and controls

277 lines (214 loc) · 12.6 KB

SQL-Bless

Go Test License Go Reference GitHub

<English> / <Japanese>

SQL-Bless は、SQL*Plus に着想を得た、複数のデータベースエンジンに対応するコマンドライン用 SQL クライアントです。

SQL-Bless は「安全性と再現性」を最優先に設計されています。 かつて、顧客の都合で未完成のシステムを納品せざるを得ず、その後、データ不整合の修正に膨大な労力を費やした経験があります。 その経験から、「人為的ミスや予期せぬ自動コミットを防ぎ、すべての操作を追跡可能にするツール」が必要だと痛感しました。 SQL-Bless は、そうした現場での教訓から生まれた、安全で再現性のある DB メンテナンスツールです。

  • 複数行の SQL 入力を編集するための Emacs 風キーバインド
    • Enter キーはデフォルトで改行を挿入します
    • ↑(上)矢印キーまたは Ctrl-P でカーソルを前の行に移動して編集できます
    • Ctrl-J または Ctrl-Enter を押すと、入力を即時に実行します
    • Enter キー単独の場合でも、最終行がセミコロンで終わっている場合や、最初の単語が EXITQUIT といった非SQLコマンドの場合は入力が実行されます
  • SELECT結果は CSV 形式で保存
  • 以下のRDBMSをサポート
    • SQLite3
    • Oracle
    • PostgreSQL
    • Microsoft SQL Server
    • MySQL
  • データベースのレコードをスプレッド風に編集可能 (EDIT コマンド)
  • トランザクションモード動作(オートコミット無効化)
    • DML(INSERT/UPDATE/DELETE)実行時に自動でトランザクションを開始します
    • ユーザが BEGIN 文を入力することはできません(内部で自動管理されるため)
    • COMMIT または ROLLBACK を実行することでトランザクションを終了できます
    • DDL(CREATE/ALTER/DROP 等)のトランザクション内実行可否はデータベースごとに異なります
      • PostgreSQL: VACUUM, REINDEX, CLUSTER, CREATE/DROP DATABASE, CREATE/DROP TABLESPACE を除き、トランザクション内で実行可能
      • SQLite3: VACUUM を除き、トランザクション内で実行可能
      • Oracle / SQL Server / MySQL: DDL を実行する前に、COMMIT もしくは ROLLBACK でトランザクションを終了させる必要があります
      • DDL 実行時に既存トランザクションが残っている場合は、警告が表示されます。
  • テーブル名・カラム名補完
    • ただし、カラム名補完はテーブル名がカーソルより左側に登場している時のみ

image

@emisjerry さんによる 紹介動画

Key Binding
Enter, Ctrl+M 改行(末尾が;であるか、明らかに一行未満で終わるコマンド1時はSQLを実行)
Ctrl+Enter, Meta+Enter, Ctrl+J SQLを実行
, Ctrl+F カーソルを右へ移動
, Ctrl+B カーソルを左へ移動
, Ctrl+P カーソルを上、もしくはヒストリの前のSQLを参照
, Ctrl+N カーソルを上、もしくはヒストリの後のSQLを参照
Ctrl+D 一次削除もしくは、EOF:ロールバックして終了
PageUp, Ctrl+, Meta+P ヒストリ参照(過去方向)
PageDown, Ctrl+, Meta+N ヒストリ参照(未来方向)
Tab テーブル名・カラム名補完

MetaAlt+keyもしくは、Esc の後にkeyを押下することを意味します。

サポートコマンド

  • SELECT / INSERT / UPDATE / DELETE / MERGE ... ;
    • INSERT, UPDATE , DELETE は自動的にトランザクションを開始します
    • これらのコマンドは、セミコロン ;、もしくは -term string で指定された文字列があるまで、Enter を押下しても入力が継続します。
  • COMMIT
  • ROLLBACK ; -- semicolon required
  • SAVEPOINT savepoint;
    (or SAVE TRANSACTION savepoint; for Microsoft SQL Server)
  • ROLLBACK TO savepoint;
    (or ROLLBACK TRANSACTION savepoint; for Microsoft SQL Server)
  • SPOOL
    • spool FILENAME .. FILENAME を開いて、ログや出力を書き込みます
    • spool off .. スプールを止めてクローズします
  • EXIT / QUIT
    • トランザクションをロールバックして、SQL-Bless を終了します
  • START filename
    • ファイル名で指定した SQL スクリプトを実行します。
  • REM comments
  • DESC [tablename] / \D [tablename]
    • テーブル名が指定された場合、そのテーブルのスキーマを表示します
    • テーブル名が省略された場合、テーブルの一覧を表示します
      • テーブル一覧では以下のキーが拡張されます
      • r: そのテーブルのデータの編集モードに入ります
      • Enter: そのテーブルのスキーマを表示します
  • HISTORY
    • 入力履歴を表示します
  • EDIT [tablename [WHERE conditions...]]
    • 選択したテーブルのレコードを修正するため [エディタ][csvi] を起動します

    • エディタ中では以下のキーが拡張されます

      キー 操作内容
      r カレントセルを組み込みの readline で編集する
      o 新しい行を末尾に追加する
      dd, dr カレント行を削除する
      x カレントセルに NULL を設定する
      q エディタを終了する(変更の適用または破棄を確認)

      ターミナルのエスケープシーケンス遅延による誤作動を防ぐため、D キーによる削除は無効化された。行の削除には dd または dr を使用のこと

    • EDIT文は、エディターでの変更データから自動で SQL を生成する都合、個々のデータベース固有の特殊な型向けの SQL データをうまく表現できない場合があります。見つかりましたら、ご連絡いただけるとたすかります。

  • HOST command-line
    • OS コマンドを実行します

 

  • スクリプトを実行する時、セミコロン ;、もしくは -term string で指定された文字列が文の区切りとなります
  • インタラクティブに SQL を入力する時、セミコロン; もしくは-term string で指定された文字列は無視されます

スプールファイルの例

# (2023-04-17 22:52:16)
# select *
#   from tab
#  where rownum < 5
TNAME,TABTYPE,CLUSTERID
AQ$_INTERNET_AGENTS,TABLE,<NULL>
AQ$_INTERNET_AGENT_PRIVS,TABLE,<NULL>
AQ$_KEY_SHARD_MAP,TABLE,<NULL>
AQ$_QUEUES,TABLE,<NULL>
# (2023-04-17 22:52:20)
# history
0,2023-04-17 22:52:05,spool hoge
1,2023-04-17 22:52:16,"select *
  from tab
 where rownum < 5"
2,2023-04-17 22:52:20,history

インストール

バイナリパッケージをReleasesよりダウンロードして、実行ファイルを展開してください。

scoop インストーラーを使用する場合

scoop install https://raw.githubusercontent.com/hymkor/sqlbless/master/sqlbless.json

or

scoop bucket add hymkor https://github.com/hymkor/scoop-bucket
scoop install sqlbless

go install でインストールする場合

go install github.com/hymkor/sqlbless/cmd/sqlbless@latest

設定(Configuration)

SQL-Bless は設定ファイルを必要とせず、すべてコマンドラインオプションで指定できます。 デフォルトでは、ローカルのテスト用データベースに接続するための設定は含まれていません。そのため、接続情報は起動時に必ず指定してください。

たとえば、バッチファイルやシェルスクリプトを作成して、SQL-Bless を起動する際に接続情報を渡す方法が推奨されます。

起動方法

$ sqlbless {options} [DRIVERNAME] DATASOURCENAME

DRIVERNAME は、DATASOURCENAME の中に含まれている場合は省略可能です。

SQLite3

$ sqlbless sqlite3 :memory:
$ sqlbless sqlite3 path/to/file.db

Oracle

$ sqlbless oracle oracle://USERNAME:PASSWORD@HOSTNAME:PORT/SERVICE
$ sqlbless oracle://USERNAME:PASSWORD@HOSTNAME:PORT/SERVICE

PostgreSQL

$ sqlbless postgres host=127.0.0.1 port=5555 user=USERNAME password=PASSWORD dbname=DBNAME sslmode=disable
$ sqlbless postgres postgres://USERNAME:PASSWORD@127.0.0.1:5555/DBNAME?sslmode=verify-full
$ sqlbless postgres://USERNAME:PASSWORD@127.0.0.1:5555/DBNAME?sslmode=verify-full

SQL Server

$ sqlbless sqlserver sqlserver://@localhost?database=master

( Windows authentication )

$ sqlbless sqlserver "Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;protocol=lpc"

MySQL

$ sqlbless.exe mysql user:password@/database

共通オプション

  • -crlf
    • 改行コードに CRLF を使う
  • -fs string
    • 区切り文字を指定する(default: ",")
  • -null string
    • NULLを表現する文字列を指定(default: ␀)
  • -tsv
    • タブを区切り文字に使う
  • -f string
    • スクリプトを実行する
  • -submit-enter
    • Enter で確定し、Ctrl-Enter で新しい行を挿入するようにする
  • -debug
    • SELECTEDIT のヘッダに型情報を表示するようにした
  • -spool filename
    • 指定したファイルに起動時からスプールする
  • -help
    • ヘルプを表示
  • -rv
    • 白背景を前提とした色を使用する

環境変数

  • NO_COLOR
    • 1文字以上設定されていたらカラー表示を抑制する
    • 未定義の場合、通常どおりカラー表示を行う
  • RUNEWIDTH_EASTASIAN
    • `"1" - Unicodeの曖昧幅の文字は2桁とする
    • それ以外が1文字以上設定れていたら1桁とする
  • COLORFGBG
    • (FG);(BG)形式で、前景色を表す(FG)と背景色を表す(BG)が整数で (FG)(BG) より小さい整数の時、白背景を想定した色使いをするようにする (-rvと等価)

Acknowledgements

Author

hymkor (HAYAMA Kaoru)

License

MIT License

Footnotes

  1. DESC, EDIT, EXIT, HISTORY, HOST, QUIT, REM, SPOOL, START, \D