Github: https://github.com/groveco/django-sql-explorer
SQLエクスプローラ
SQLエクスプローラは、人々の間でデータの流れを迅速かつ簡単に、混乱のないようにすることを目指しています。 これはDjangoベースのアプリケーションで、既存のDjangoサイトに追加することも、スタンドアロンのビジネスインテリジェンスツールとして使用することもできます。
シンプルで使いやすいSQLエディタでSQLクエリをすばやく作成して共有し、ブラウザで結果をプレビューしたり、リンクを共有したり、CSV、JSON、Excelファイルをダウンロードしたり(必要に応じてクエリをAPIエンドポイントとして公開します) !
複数の接続、多くの異なるSQLデータベースタイプ、スキーマエクスプローラ、クエリ履歴(軽量バージョンコントロールなど)、基本的なセキュリティモデル、ブラウザ内ピボットテーブルなどをサポートします。
SQL Explorerは、シンプルさ、直感的な使用、目立たない安定性、安定性、および最小の驚きの原則を評価します。
SQL Explorerは、数多くのすばらしいクエリとレポートツールからインスピレーションを得ています。
元のアイデアはStack Exchangeのデータエクスプローラに由来していましたが、 RedashやBlazerのような類似プロジェクトにも貢献しています。
SQL ExplorerはMITライセンスを受けており、プルリクエストは歓迎されています。
クエリのビュー
すべてのクエリの表示
DBスキーマ情報へのクイックアクセス
スナップショットクエリの結果はS3に、ダウンロードはcsvとして
特徴
-
- セキュリティ
-
- このツールは、実稼働環境で実行中のSQLにアクセスできるようにすることを目的としています。 もしそれがあなたを緊張させるなら(それはすべきです) – あなたは警告されています。 Explorerは恐ろしいことが起こらないように努力しますが、注意してください! EXPLORER_CONNECTION_NAME設定を使用してSQLエクスプローラを読み取り専用のデータベースロールに接続することをお勧めします。
- Explorerは、ツールのユーザーに対して2つの異なる権限チェックをサポートしています。 EXPLORER_PERMISSION_CHANGEテストに合格したユーザーは、クエリを作成、編集、削除、実行できます。 このテストに合格しなかったが、EXPLORER_PERMISSION_VIEWテストに合格したユーザーは、クエリのみを実行できます。 他のユーザーはエクスプローラのどの部分にもアクセスできません。 両方の権限グループはデフォルトでis_staffに設定されており、設定ファイルで上書きすることができます。
- 破壊的なクエリが実行されないように(削除、削除、変更、更新など)、SQLブラックリストを適用します。 これは防弾ではなく、読み取り専用のデータベースロールを設定することをお勧めしますが、不可能な場合はブラックリストが適切な保護を提供します。
-
- 簡単に始める
-
- DjangoのORMで構築されているので、Postgresql、Mysql、およびSqliteで動作します。 そして、あなたと私の間で、RedShiftでもうまくいきます。
- 少数の依存関係。
- ちょっとしたアドバイスを取得して欲しいだけですか? プレイグラウンドエリアでナッツを移動します。
-
- スナップショット
-
- クエリの[スナップショット]ボックスをオンにすると、エクスプローラはクエリ結果の.csvスナップショットをS3にアップロードします。 セロリのcronタスクを使用してスナップショットの頻度を設定します。たとえば毎日午前1時に:
'explorer.tasks.snapshot_queries': { 'task': 'explorer.tasks.snapshot_queries', 'schedule': crontab(hour=1, minute=0) }
- 明らかにセロリが必要です。 また、djceleryとtinys3を使用します。 これらのdepsはすべてオプションで、pip install -r optional-requirements.txtを使用してインストールできます
- クエリーをスナップショットにするためのチェックボックスは、クエリービューの下部(結果表の下)にあるALL THE WAYです。
-
- 電子メールクエリの結果
-
- クエリリストビューの電子メールアイコンをクリックし、電子メールアドレスを入力すると、クエリ結果(zipped .csv)が非同期で送信されます。 長時間実行するクエリには非常に便利です。
-
- パラメータ化されたクエリ
-
- クエリで$$ foo $$を使用すると、Explorerはパラメータを記入するためのUIを作成します。 ‘SELECT * FROM table WHERE id = $$ id $$’のようなクエリを表示すると、Explorerは ‘id’パラメータのUIを生成します。
- パラメータはURLに格納されているため、パラメータ化されたクエリへのリンクを同僚と共有することができます
- $$ paramName:defaultValue $$を使用して、パラメータのデフォルト値を指定します。
-
- スキーマヘルパー
-
- / explorer / schema / <connection-alias>は、クエリの作成時に参照できるテーブル名とカラム名+タイプのリストをレンダリングします。 アプリをこのリストから除外することができます。そのため、無関係な数多くの表をユーザーに抱かせることはありません。 詳細については、以下の設定文書を参照してください。
- これは、クエリを作成する際にサイドバーヘルパーとしてすぐに利用できます(スクリーンショット参照)
- あなたが探しているテーブルのクイック検索。 ちょうど入力を開始してください!
- Explorerは、Django DBのイントロスペクションを使用してスキーマを生成します。 これは、イントロスペクションする各テーブルに対して個別のクエリを発行するため、時間がかかることがあります。 したがって、一度生成されると、Explorerはスキーマ情報をキャッシュします。 Celeryを使用して、非同期的にスキーマ情報を生成するオプションもあります。 これを有効にするには、Celeryがインストールされて構成されていることを確認し、EXPLORER_ENABLE_TASKSとEXPLORER_ASYNC_SCHEMAをTrueに設定します。
-
- テンプレート列
-
- たとえば、 ‘select id、email from user’のようなクエリがあり、その結果の各ユーザーのプロファイルページにすばやくドリルスルーしたいとします。 あなたはそれを行うための “テンプレート”列を作成することができます。
- 設定ファイルにテンプレート列を設定するだけです:
EXPLORER_TRANSFORMS = [('user', '<a href="https://yoursite.com/profile/{0}/">{0}</a>')]
- クエリを「SELECT id AS user」、「FROM user FROM user」に変更します。 エクスプローラは変換の「ユーザー」列エイリアスと一致し、その列の各セルをテンプレート文字列にマージします。 クール!
- EXPLORER_UNSAFE_RENDERINGをTrueに設定する必要があります。これは、レンダリングされたHTML(文字列リテラルと比較して)が出力に表示されるようにするためです。 その設定を有効にすることの意義に注意してください。
-
- ピボットテーブル
-
- ブラウザーのピボット機能(Pivottable JSが提供)を使用するには、クエリ結果の[ピボット]タブに移動します。
- 右上のリンクアイコンをクリックすると、URLを取得して、正確なピボット設定を再作成して同僚と共有できます。
-
- クエリログ
-
- エクスプローラは、実行したすべてのクエリのスナップショットを保存して、失われた非定型クエリをリカバリし、クエリしたものを確認することができます。
- これは、Queriesの安価で汚れたバージョン管理としても機能し、ログを集約することで、「実行カウント」プロパティと平均所要時間(ミリ秒)を提供します。
- また、リンクをプレイグラウンドのクエリログレコードにコピーすることで、プレイグラウンドクエリを素早く共有することもできます。リンクエディタの右上にあるリンクアイコンを参照してください。
- Explorerが大量に使用された場合、ログは軽くなる可能性があります。 explorer.tasksには、<days>より古いログエントリ(以下の例では30日以上)を削除する ‘truncate_querylogs’タスクが含まれています。
'explorer.tasks.truncate_querylogs': { 'task': 'explorer.tasks.truncate_querylogs', 'schedule': crontab(hour=1, minute=0), 'kwargs': {'days': 30} }
-
- 複数の接続
-
- 複数のデータベースにデータがありますか? 問題ありません。 複数のDjangoデータベース接続を設定してExplorerに登録するだけで、さまざまなデータソースすべてに対してクエリを作成、保存、表示することができます。 Djangoのデータベースサポートと互換性があります。 ターゲットデータベースは、Djangoスキーマを含む必要はなく 、Djangoに関係するものであることに注意してください。 マルチ接続設定に関する詳細は、connections.pyを参照してください。
-
- 電源のヒント
-
-
クエリリストページでは、フォーカスが検索ボックスに設定されるので、/ explorerに移動してクエリの名前を入力するだけで検索できます。
-
クイック検索は、クエリビューで「スキーマの表示」を押すと動作します。
-
Command + EnterとCtrl + Enterは、SQLエディタ領域に入力するときにクエリを実行します。
-
“フォーマット”ボタンを押して、SQLのフォーマットとクリーンアップを行います(これは検証ではなく、フォーマットのみです)。
-
クエリログ機能を使用して、永続クエリを作成する価値のない1回限りのクエリを共有します。 プレイグラウンドでSQLを実行してから、/ logsに移動してリンクを共有してください(例:/ explorer / play /?querylog_id = 2428)
-
保存されたクエリの右上にある[履歴]リンクをクリックして、ログをフィルタリングしてそのクエリだけの変更をフィルタします。
-
csv以外のものとしてクエリをダウンロードする必要があるが、settings.EXPLORER_CSV_DELIMETERで区切り文字をグローバルに変更したくない場合は、/ query / download?delim = |を使用できます。 パイプで区切られたファイルを取得します。 タブで区切られたファイルの場合、delim = tabを使用します。 ファイルの拡張子は.csvのままです
-
クエリの実行に時間がかかりすぎて(おそらくタイムアウトした)、クエリを最適化するには、/ query / 123 /?show = 0に移動します。 通常のクエリの詳細ページが表示されますが、クエリは実行されません。
-
env varsをEXPLORER_TOKEN_AUTH_ENABLED = TRUE、EXPLORER_TOKEN = <SOME TOKEN>に設定すると、インスタントデータAPIがあります。 ちょうど:
curl --header "X-API-TOKEN: <TOKEN>" https://www.your-site.com/explorer/<QUERY_ID>/stream?format=csv
トークンは次のようなクエリパラメータで渡すこともできます:
curl https://www.your-site.com/explorer/<QUERY_ID>/stream?format=csv&token=<TOKEN>
-
インストール
Python 2.7、3.4、または3.5が必要です。 Django 1.7.1以降が必要です。
Djangoプロジェクトを以下のように設定します:
`bash $ pip install django $ django-admin startproject project `
詳細は、[こちら]( https://docs.djangoproject.com/en/1.11/intro/tutorial01/ )をご覧ください 。
githubからpipでインストールする:
pip install django-sql-explorer
INSTALLED_APPSをプロジェクトフォルダのsettings.pyファイルに追加します:
INSTALLED_APPS = ( ..., 'explorer', ... )
あなたのurls.pyに以下を追加してください(すべてのExplorerのURLは、EXPLORER_PERMISSION_VIEWとEXPLORER_PERMISSION_CHANGEの設定で制限されています。
url(r'^explorer/', include('explorer.urls')),
migrateを実行してテーブルを作成します。
python manage.py migrate
最後に、次のような設定を行います。
EXPLORER_CONNECTIONS = { 'Default': 'readonly' } EXPLORER_DEFAULT_CONNECTION = 'readonly'
最初の設定では、エクスプローラで使用する接続を一覧表示します。 接続ディクショナリのキーは、Explorerユーザを表示するフレンドリ名で、値はsettings.DATABASESで使用される実際のデータベースエイリアスです。 設定することを強くお勧めします
https:// yoursite / explorer /にアクセスして探検しましょう! EXPLORER_CONNECTION_NAME設定を使用して読み取り専用データベース接続を使用するようにエクスプローラを設定することを強くお勧めします。
Celeryとoptional-requirements.txtの依存関係に依存するいくつかの機能(スナップショット、電子メールクエリ)があります。 セロリがインストールされている場合、これらの機能を有効にするには、settings.pyでEXPLORER_TASKS_ENABLED = Trueを設定します。
依存関係
依存関係の数を最小限に抑えるための努力がなされています。
Python
名 | バージョン | ライセンス |
---|---|---|
sqlparse | 0.1.18 | BS |
ユニコード | 0.14.1 | BSD |
- sqlparseはSQLの書式設定に使用されます。
Python – オプションの依存関係
名 | バージョン | ライセンス |
---|---|---|
セロリ | 3.1 | BSD |
ジャンゴ・セロリー | 3.1 | BSD |
ファクトリーボーイ | 2.6.0 | MIT |
xlsxwriter | 0.8.5 | BSD |
ボトム | 2.46 | MIT |
- 工場の男の子はテストに必要です
- セロリは「電子メール」機能とスナップショットに必要です
- botoはスナップショットに必要です
- Excelのエクスポートにはxlsxwriterが必要です(CSVはそれでも問題なく動作します)
JavaScript
名 | バージョン | ライセンス |
---|---|---|
Twitter Boostrap | 3.3.6 | MIT |
jQuery | 2.1.4 | MIT |
jQuery Cookie | 1.4.1 | MIT |
jQuery UI | 1.11.4 | MIT |
アンダースコア | 1.7.0 | MIT |
コーデミラー | 5.15.2 | MIT |
フロート・ヘッド | 1.4.0 | MIT |
list.js | 1.2.0 | MIT |
pivottable.js | 2.0.2 | MIT |
- すべてがすべてCDNJSから提供されましたが、ローカルで提供されるカスタムビルドを使用するjQuery UIは例外です。
pivottable.jsはjQuery UIに依存しますが、Sortableメソッドのみに依存します。
テスト
あなたが簡単に行うことができるテストを実行したい場合はFactory Boyが必要です:
python manage.py test
カバレッジ付き:
coverage run --source='.' manage.py test
次に:
coverage report
… 99%! フツァ!
タイヤを蹴るために使用できるtest_projectもあります。 新しいvirtualenvを作成し、test_projectにcdしてstart.shを実行するか、自分で手順を実行して、アプリケーションのテストインスタンスを起動して実行してください。
設定
設定 | 説明 | デフォルト |
---|---|---|
EXPLORER_SQL_BLACKLIST | 破壊的な操作を防ぐために、SQL照会で許可されていない単語。 | ( ‘ALTER’、 ‘RENAME’、 ‘DROP’、 ‘TRUNCATE’、 ‘INSERT INTO’、 ‘UPDATE’、 ‘REPLACE’、 ‘DELETE’、 ‘ALTER’、 ‘CREATE TABLE’、 ‘SCHEMA’、 ‘GRANT’ 、 ‘OWNER TO’) |
EXPLORER_SQL_WHITELIST | このフレーズの一部はブラックリストに表示されますが、これらのフレーズは許可されます。 | ( ‘CREATED’、 ‘UPDATED’、 ‘DELETED’、 ‘REGEXP_REPLACE’) |
EXPLORER_DEFAULT_ROWS | プレビューウィンドウにデフォルトで表示される行数です。 | 1000 |
EXPLORER_SCHEMA_INCLUDE_TABLE_PREFIXES | [None]以外の場合は、これらの接頭辞で始まる表に対してのみスキーマを表示します。 EXCLUDEと競合する場合は「勝ち」 | なし#すべてのテーブルを表示する |
EXPLORER_SCHEMA_EXCLUDE_TABLE_PREFIXES | これらの接頭辞で始まる表のスキーマをスキーマ・ヘルパーに表示しないでください。 | ( ‘django.contrib.auth’、 ‘django.contrib.contenttypes’、 ‘django.contrib.sessions’、 ‘django.contrib.admin’) |
EXPLORER ASYNC_SCHEMA | DBスキーマを非同期で生成します。 セロリとEXPLORER_TASKS_ENABLEDが必要です | 偽 |
EXPLORER_CONNECTION_NAME | 使用するDjangoデータベース接続の名前。 理想的には、読み取り専用権限を持つ接続に設定する | なし#これは必須であるため、アプリが機能するように設定する必要があります |
EXPLORER_CONNECTIONS | {‘Friendly Name’: ‘django_db_alias’}の辞書。 すべて | {}#最低でも、{‘Default’: ‘readonly’}などのように設定する必要があります。 詳しくは、connections.pyを参照してください。 |
EXPLORER_PERMISSION_VIEW | ユーザーがストアド・クエリーを表示して実行できるかどうかを確認するコールバック | ラムダ:u.is_staff |
EXPLORER_PERMISSION_CHANGE | ユーザーがクエリの追加/変更/削除を許可されているかどうかを確認するコールバック | ラムダ:u.is_staff |
EXPLORER_TRANSFORMS | [( ‘エイリアス’、 ‘{0}’のテンプレート)]のようなタプルのリスト。 詳細については、このドキュメントの機能のセクションを参照してください。 | [] |
EXPLORER_RECENT_QUERY_COUNT | クエリリストの上部に表示する最近のクエリの数。 | 10 |
EXPLORER_GET_USER_QUERY_VIEWS | {userId:[queryId、…]、…}という形式の特定のクエリに関するビューのアクセス許可を与えるdictは、 | {} |
EXPLORER_TOKEN_AUTH_ENABLED | トークン認証要求を有効にするかどうかを示すBool。 上記の「電源のヒント」を参照してください。 | 偽 |
EXPLORER_TOKEN | クエリ結果のアクセストークン。 | “CHANGEME” |
EXPLORER_TASKS_ENABLED | snapshot_queriesセロリタスクを使用する場合、またはtasks.pyのレポート機能を電子メールで送信する場合にオンにします | 偽 |
EXPLORER_S3_ACCESS_KEY | S3スナップショットアップロードのアクセスキー | なし |
EXPLORER_S3_SECRET_KEY | スナップショットアップロードのS3秘密キー | なし |
EXPLORER_S3_BUCKET | スナップショットアップロード用のS3バケット | なし |
EXPLORER_FROM_EMAIL | 非同期レポートの電子メール機能を使用する場合のデフォルトの「差出人」アドレス | ” django-sql-explorer@example.com “ |
EXPLORER_DATA_EXPORTERS | 使用するエクスポートボタン。 デフォルトにはExcelが含まれているため、optional-requirements.txtのxlsxwriterが必要です | [( ‘csv’、 ‘explorer.exporters.CSVExporter’)、( ‘excel’、 ‘explorer.exporters.ExcelExporter’)、( ‘json’、 ‘explorer.exporters.JSONExporter’)] |
EXPLORER_UNSAFE_RENDERING | データベースから値をレンダリングするための自動文字処理を無効にします。 知られていないデータを照会すると、XSS攻撃に注意してください… | 偽 |
リリースプロセス
リリースプロセスはここで文書化されています 。 リリースに問題がある場合は、プロセスを改善して、再び発生しないようにしてください!