Database management tools for initial data management
Project description
DBGear
データベース初期データ管理のためのコアライブラリとCLIツールです。
インストール
pip install dbgear
使用方法
CLIコマンド
スキーマインポート
# A5:SQL Mk-2ファイルからスキーマをインポート
dbgear import a5sql_mk2 schema.a5er
# 出力ファイルを指定
dbgear import a5sql_mk2 schema.a5er --output my_schema.yaml
# スキーママッピングを指定
dbgear import a5sql_mk2 schema.a5er --mapping "MAIN:production,SUB:development"
# ヘルプ表示
dbgear import --help
データベース適用
# データベースへの適用
dbgear apply <deployment> <environment> [options]
# 例:全テーブルを削除して再作成
dbgear apply localhost development --all drop
# 例:差分のみ適用
dbgear apply localhost development --all delta
# 例:特定のテーブルのみ適用
dbgear apply localhost development --target users
# 例:パッチファイルを使って選択的にデータ復元
dbgear apply localhost development --target users --patch users.patch.yaml
# 例:datamodelなしでバックアップから復元
dbgear apply localhost development --target users --restore-backup
applyコマンドオプション一覧
| オプション | 説明 | 組み合わせ制約 |
|---|---|---|
--all drop/delta |
全テーブルに対して操作 | --targetと排他 |
--target |
特定テーブルのみ操作 | --allと排他 |
--patch |
パッチファイルでデータ復元 | --target必須 |
--restore-backup |
datamodelなしでバックアップ復元 | --target必須、--allと排他 |
--no-restore |
データ投入・復元をスキップ | - |
--restore-only |
スキーマ再作成なしで復元のみ | - |
--backup-key |
バックアップキー指定(YYYYMMDDHHMMSS) | --restore-onlyと併用 |
--index-only |
インデックスのみ再作成 | --target必須、--allと排他 |
データパッチ適用
パッチ機能を使うと、バックアップテーブルから特定条件のデータのみを選択的に復元できます。
# パッチファイルを使った選択的データ復元
dbgear apply localhost development --target テーブル名 --patch パッチファイル.yaml
# 例:特定ユーザーが更新したレコードのみ復元
dbgear apply localhost development --target test_table --patch test_table_admin.patch.yaml
パッチファイルの形式(YAML):
name: test_table # 対象テーブル名(必須)
columns: # カラムマッピング(必須)
# キー: INSERT先のカラム名
# 値: SELECT側の式(カラム名、SQL関数、固定値、計算式)
col_id: col_id # バックアップテーブルのカラム
name: name
update_date: "NOW()" # SQL関数
update_user: "'migration_script'" # 固定値(文字列リテラル)
status: "'active'" # 固定値
priority: "100" # 固定値(数値)
uuid: "UUID()" # SQL関数
where: "update_user = 'admin'" # WHERE条件(オプション)
パッチファイルのサンプル:
基本的な使い方:
etc/test/env1/sample2/main@test_table.patch.yaml- 特定ユーザーのデータのみ復元etc/test/env1/sample2/main@test_table_recent.patch.yaml- 直近30日のデータのみ復元etc/test/env1/sample2/main@test_table_numeric.patch.yaml- 数値条件でフィルタetc/test/env1/sample2/main@test_table_all.patch.yaml- 全データ復元(WHERE条件なし)etc/test/env1/sample2/main@tbl_child.patch.yaml- 親テーブルとの関連を考慮
高度な使い方:
etc/test/env1/sample2/main@test_table_advanced.patch.yaml- SQL関数と計算式を使用etc/test/env1/sample2/main@test_table_with_defaults.patch.yaml- 新カラムにデフォルト値設定etc/test/env1/sample2/main@test_table_transform.patch.yaml- CASE文によるデータ変換
パッチのユースケース:
- 本番環境へのマイグレーション時にテストデータを除外
- 個人情報を含む特定カラムの除外
- 時系列データの部分復元(ディスク容量節約)
- 条件付きロールバック(特定データのみ以前の状態に戻す)
- スキーマ変更時の新カラムへのデフォルト値設定
- データ変換・正規化(計算式、CASE文)
- 監査情報の自動追加(現在時刻、ユーザー名など)
指定可能な値の種類:
- カラム名: バックアップテーブルのカラムを直接指定(例:
col_id: col_id) - SQL関数: MySQL組み込み関数(例:
created_at: "NOW()"、uuid: "UUID()") - 固定値(文字列): シングルクォートで囲む(例:
status: "'active'") - 固定値(数値): そのまま記述(例:
priority: "100") - 計算式: 四則演算など(例:
total: "price * quantity") - CASE文: 条件分岐(例:
type: "CASE WHEN num > 100 THEN 'large' ELSE 'small' END")
セキュリティ機能: パッチファイルには自動バリデーションが組み込まれており、以下のパターンが検出されるとエラーになります:
- WHERE句:
;(複数SQL文の実行防止)、--,/*,*/(コメント注入防止)、DROP,DELETE,UPDATE(破壊的操作の防止) - カラム式:
;,--,/*,*/の使用禁止
#### datamodelなしでの使用
**v0.35.0以降**: datamodelが定義されていない場合でも、以下の操作が可能です。
##### パッチファイルによる選択的復元
```bash
# datamodelがなくてもpatchファイルを使用可能
dbgear apply localhost development --target users --patch users.patch.yaml
バックアップからの全件復元
# --restore-backupオプションでdatamodelなしでも復元可能
dbgear apply localhost development --target users --restore-backup
# バックアップキーを指定して復元
dbgear apply localhost development --target users --restore-backup --backup-key 20251210120000
動作条件:
--targetオプションでテーブル名を指定--patchまたは--restore-backupオプションを指定- 対象テーブルのバックアップテーブルが存在すること
注意: datamodelが定義されている場合は、そちらのsync_mode設定が優先されます。
sync_modeの種類:
drop_create: 初期データのみ投入、バックアップ復元なしmanual:--all時スキップ、個別指定時は新規レコードのみ追加(INSERT IGNORE)update_diff:--all時も実行、新規レコードのみ追加(INSERT IGNORE)replace:--all時も実行、バックアップで既存レコードを上書き(REPLACE INTO)
プログラムでの利用
スキーマインポート
from dbgear.core.importer import import_schema
# A5:SQL Mk-2ファイルからインポート
schema_manager = import_schema('a5sql_mk2', 'path/to', 'schema.a5er', {'MAIN': 'main'})
# YAMLファイルに保存
from dbgear.core.models.fileio import save_model
save_model('schema.yaml', schema_manager)
プロジェクト管理
from dbgear.core.models.project import Project
from dbgear.core.operations import Operation
from dbgear.core.models.schema import SchemaManager, Table, Column
# プロジェクト読み込み
project = Project("./my-project")
project.read_definitions()
# データベース操作
with Operation(project, "development", "localhost") as op:
op.reset_all() # 全テーブルをリセット
op.require("main", "users") # 特定のテーブルデータを挿入
# スキーマ管理
manager = SchemaManager("./my-project")
schema = manager.create_schema("main")
# テーブル追加(表現式対応)
table = Table(
table_name="users",
display_name="ユーザー"
)
# カラムを追加
table.add_column(Column(
column_name="id",
display_name="ID",
column_type="BIGINT",
nullable=False,
primary_key=1,
auto_increment=True
))
table.add_column(Column(
column_name="name",
display_name="名前",
column_type="VARCHAR(100)",
nullable=False,
charset="utf8mb4",
collation="utf8mb4_unicode_ci"
))
table.add_column(Column(
column_name="full_name",
display_name="フルネーム",
column_type="VARCHAR(201)",
nullable=False,
expression="CONCAT(first_name, ' ', last_name)",
stored=True
))
schema.add_table(table)
manager.save() # YAML保存
機能
スキーマインポート
- A5:SQL Mk-2インポート: .a5erファイルからDBGear形式への変換
- 動的インポーター: importlibによる拡張可能なアーキテクチャ
- スキーママッピング: 外部形式からDBGearスキーマ名への柔軟なマッピング
- CLIサポート:
dbgear importコマンドによる簡単な変換
データベーススキーマ管理
- 多形式対応: A5:SQL Mk-2、MySQL直接接続、独自YAML形式対応
- スキーマ操作: テーブル・カラム・インデックス・ビューの追加・更新・削除
- カラム式サポート: MySQL生成カラム(GENERATED ALWAYS AS)対応
- 拡張カラム属性: AUTO_INCREMENT、文字セット、照合順序指定
- ビュー管理: データベースビューの定義と依存関係管理
- SQLテンプレートエンジン: Jinja2ベースの統一されたSQL生成システム
データ管理
- 初期データ管理: YAML形式でのデータ定義
- 環境管理: 開発・テスト・本番環境の分離
- データバインディング: 自動的な値設定(UUID、現在時刻等)
- プラグイン機構: カスタムデータ変換の拡張
- 外部キー整合性: 参照制約の自動検証
プロジェクト構成
project.yaml
project_name: MyProject
description: Database initial data management
definitions:
- type: a5sql_mk2
filename: ./schema.a5er
mapping:
MAIN: main
# または独自YAML形式を使用
- type: dbgear_schema
filename: ./schema.yaml
mapping:
main: production
bindings:
created_at:
type: fixed
value: NOW()
deployments:
localhost: mysql+pymysql://root:password@localhost/mydb
環境設定
# development/_mapping.yaml
id: mydb_dev
instances:
- main
独自YAML形式のスキーマ定義
# schema.yaml
schemas:
main:
tables:
users:
display_name: ユーザー
columns:
# 主キー(AUTO_INCREMENT)
- column_name: id
display_name: ID
column_type: BIGINT
nullable: false
primary_key: 1
auto_increment: true
# 文字セット指定
- column_name: first_name
display_name: 名
column_type: VARCHAR(50)
nullable: false
charset: utf8mb4
collation: utf8mb4_unicode_ci
- column_name: last_name
display_name: 姓
column_type: VARCHAR(50)
nullable: false
charset: utf8mb4
collation: utf8mb4_unicode_ci
- column_name: email
display_name: メールアドレス
column_type: VARCHAR(255)
nullable: false
foreign_key: contacts.email
# 生成カラム(STORED)
- column_name: full_name
display_name: フルネーム
column_type: VARCHAR(101)
nullable: false
expression: "CONCAT(last_name, ' ', first_name)"
stored: true
# 生成カラム(VIRTUAL)
- column_name: email_domain
display_name: メールドメイン
column_type: VARCHAR(255)
nullable: true
expression: "SUBSTRING_INDEX(email, '@', -1)"
stored: false
# 複雑な式(CASE文)
- column_name: user_type
display_name: ユーザー種別
column_type: VARCHAR(20)
nullable: false
expression: "CASE WHEN email LIKE '%@company.com' THEN '社員' ELSE '一般' END"
stored: true
# タイムスタンプ
- column_name: created_at
display_name: 作成日時
column_type: TIMESTAMP
nullable: false
default_value: "CURRENT_TIMESTAMP"
indexes:
- index_name: idx_email
columns: [email]
- index_name: idx_full_name
columns: [full_name]
ライブラリ構成
dbgear.core.models: データモデルとプロジェクト管理schema: Column/Table/View/Schemaクラス(表現式属性対応)project: プロジェクト設定管理fileio: YAML形式でのスキーマ読み書き
dbgear.core.dbio: データベースI/O操作templates: Jinja2ベースSQLテンプレートエンジン(18テンプレート)
dbgear.core.importer: スキーマインポート機能- 動的インポーターローダー(importlibベース)
dbgear.core.importers: インポーターモジュールa5sql_mk2: A5:SQL Mk-2形式インポーター
dbgear.core.operations: データベース操作オーケストレーションdbgear.cli: CLIインターフェース
表現式機能
サポートする拡張カラム属性
- expression: 生成カラムの式(MySQL GENERATED ALWAYS AS)
- stored: STORED(true)またはVIRTUAL(false)の指定
- auto_increment: AUTO_INCREMENT属性
- charset: 文字セット(VARCHAR等の文字列型で使用)
- collation: 照合順序(文字列型で使用)
使用例
# 生成カラムの定義
calculated_field = Column(
column_name="total_price",
column_type="DECIMAL(10,2)",
expression="price * (1 + tax_rate)",
stored=True # STORED列として保存
)
# AUTO_INCREMENT主キー
id_field = Column(
column_name="id",
column_type="BIGINT",
primary_key=1,
auto_increment=True
)
# 文字セット指定
name_field = Column(
column_name="name",
column_type="VARCHAR(100)",
charset="utf8mb4",
collation="utf8mb4_unicode_ci"
)
制約・検証ルール
- 表現式カラムは
default_value,primary_key,foreign_keyと併用不可 - AUTO_INCREMENTは主キー必須、nullable不可
- 外部キー参照の整合性チェック
- フィールド名・テーブル名の重複チェック
Web UIが必要な場合
Web UIでのデータ編集が必要な場合は、dbgear-webパッケージをインストールしてください:
pip install dbgear-web
dbgear-web --project ./my-project --port 5000
開発
テスト実行
task test # 全テスト実行
task test-fast # 軽量テストのみ
task lint # flake8によるコードチェック
task clean # ビルド成果物のクリーンアップ
依存関係
poetry install # 依存関係のインストール
poetry add package # パッケージの追加
ライセンス
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dbgear-0.41.0.tar.gz.
File metadata
- Download URL: dbgear-0.41.0.tar.gz
- Upload date:
- Size: 45.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.12.3 Linux/5.15.136-tegra
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3dac902ac6ca03e29b7d290fae1fe80e269d7e98bae6ba9d7ce7d47da10c9e1d
|
|
| MD5 |
9d112c5840c6d531fb08a843c361612e
|
|
| BLAKE2b-256 |
a498ffc8d22d91dda293bc0d93f5b97ca8e7b71a2cd064d6fa149f3800ca86c7
|
File details
Details for the file dbgear-0.41.0-py3-none-any.whl.
File metadata
- Download URL: dbgear-0.41.0-py3-none-any.whl
- Upload date:
- Size: 58.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.12.3 Linux/5.15.136-tegra
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27e14b47c649676146e3553a2f58f62246cc98663975e0cdf8e01905fc662793
|
|
| MD5 |
91e47c7ff7c508ff6ac9be5640735d3e
|
|
| BLAKE2b-256 |
a00c17f01fcc4e392c9161736edc04ce2c6457a8efd03f4b7ae08fad8ba87d7d
|