Name | dbgear JSON |
Version |
0.30.1
JSON |
| download |
home_page | https://github.com/tamuto/dbgear |
Summary | Database management tools for initial data management |
upload_time | 2025-08-16 21:16:00 |
maintainer | None |
docs_url | None |
author | tamuto |
requires_python | <4.0,>=3.12 |
license | None |
keywords |
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# DBGear
データベース初期データ管理のためのコアライブラリとCLIツールです。
## インストール
```bash
pip install dbgear
```
## 使用方法
### CLIコマンド
#### スキーマインポート
```bash
# 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
```
#### データベース適用
```bash
# データベースへの適用
dbgear apply <deployment> <environment> [options]
# 例:全テーブルを削除して再作成
dbgear apply localhost development --all drop
# 例:差分のみ適用
dbgear apply localhost development --all delta
# 例:特定のテーブルのみ適用
dbgear apply localhost development --target users
```
### プログラムでの利用
#### スキーマインポート
```python
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)
```
#### プロジェクト管理
```python
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
```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
```
### 環境設定
```yaml
# development/_mapping.yaml
id: mydb_dev
instances:
- main
```
### 独自YAML形式のスキーマ定義
```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**: 照合順序(文字列型で使用)
### 使用例
```python
# 生成カラムの定義
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`パッケージをインストールしてください:
```bash
pip install dbgear-web
dbgear-web --project ./my-project --port 5000
```
## 開発
### テスト実行
```bash
task test # 全テスト実行
task test-fast # 軽量テストのみ
task lint # flake8によるコードチェック
task clean # ビルド成果物のクリーンアップ
```
### 依存関係
```bash
poetry install # 依存関係のインストール
poetry add package # パッケージの追加
```
## ライセンス
MIT
Raw data
{
"_id": null,
"home_page": "https://github.com/tamuto/dbgear",
"name": "dbgear",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.12",
"maintainer_email": null,
"keywords": null,
"author": "tamuto",
"author_email": "tamuto@infodb.jp",
"download_url": "https://files.pythonhosted.org/packages/54/f5/cfbf374f113359ebee7aa1a81f10eced6ddf6bdf64b8caaae54f71dfc252/dbgear-0.30.1.tar.gz",
"platform": null,
"description": "# DBGear\n\n\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u521d\u671f\u30c7\u30fc\u30bf\u7ba1\u7406\u306e\u305f\u3081\u306e\u30b3\u30a2\u30e9\u30a4\u30d6\u30e9\u30ea\u3068CLI\u30c4\u30fc\u30eb\u3067\u3059\u3002\n\n## \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n\n```bash\npip install dbgear\n```\n\n## \u4f7f\u7528\u65b9\u6cd5\n\n### CLI\u30b3\u30de\u30f3\u30c9\n\n#### \u30b9\u30ad\u30fc\u30de\u30a4\u30f3\u30dd\u30fc\u30c8\n```bash\n# A5:SQL Mk-2\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30b9\u30ad\u30fc\u30de\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\ndbgear import a5sql_mk2 schema.a5er\n\n# \u51fa\u529b\u30d5\u30a1\u30a4\u30eb\u3092\u6307\u5b9a\ndbgear import a5sql_mk2 schema.a5er --output my_schema.yaml\n\n# \u30b9\u30ad\u30fc\u30de\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u6307\u5b9a\ndbgear import a5sql_mk2 schema.a5er --mapping \"MAIN:production,SUB:development\"\n\n# \u30d8\u30eb\u30d7\u8868\u793a\ndbgear import --help\n```\n\n#### \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u9069\u7528\n```bash\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3078\u306e\u9069\u7528\ndbgear apply <deployment> <environment> [options]\n\n# \u4f8b\uff1a\u5168\u30c6\u30fc\u30d6\u30eb\u3092\u524a\u9664\u3057\u3066\u518d\u4f5c\u6210\ndbgear apply localhost development --all drop\n\n# \u4f8b\uff1a\u5dee\u5206\u306e\u307f\u9069\u7528\ndbgear apply localhost development --all delta\n\n# \u4f8b\uff1a\u7279\u5b9a\u306e\u30c6\u30fc\u30d6\u30eb\u306e\u307f\u9069\u7528\ndbgear apply localhost development --target users\n```\n\n### \u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306e\u5229\u7528\n\n#### \u30b9\u30ad\u30fc\u30de\u30a4\u30f3\u30dd\u30fc\u30c8\n```python\nfrom dbgear.core.importer import import_schema\n\n# A5:SQL Mk-2\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30a4\u30f3\u30dd\u30fc\u30c8\nschema_manager = import_schema('a5sql_mk2', 'path/to', 'schema.a5er', {'MAIN': 'main'})\n\n# YAML\u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\nfrom dbgear.core.models.fileio import save_model\nsave_model('schema.yaml', schema_manager)\n```\n\n#### \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u7ba1\u7406\n```python\nfrom dbgear.core.models.project import Project\nfrom dbgear.core.operations import Operation\nfrom dbgear.core.models.schema import SchemaManager, Table, Column\n\n# \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u8aad\u307f\u8fbc\u307f\nproject = Project(\"./my-project\")\nproject.read_definitions()\n\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\nwith Operation(project, \"development\", \"localhost\") as op:\n op.reset_all() # \u5168\u30c6\u30fc\u30d6\u30eb\u3092\u30ea\u30bb\u30c3\u30c8\n op.require(\"main\", \"users\") # \u7279\u5b9a\u306e\u30c6\u30fc\u30d6\u30eb\u30c7\u30fc\u30bf\u3092\u633f\u5165\n\n# \u30b9\u30ad\u30fc\u30de\u7ba1\u7406\nmanager = SchemaManager(\"./my-project\")\nschema = manager.create_schema(\"main\")\n\n# \u30c6\u30fc\u30d6\u30eb\u8ffd\u52a0\uff08\u8868\u73fe\u5f0f\u5bfe\u5fdc\uff09\ntable = Table(\n table_name=\"users\",\n display_name=\"\u30e6\u30fc\u30b6\u30fc\"\n)\n\n# \u30ab\u30e9\u30e0\u3092\u8ffd\u52a0\ntable.add_column(Column(\n column_name=\"id\",\n display_name=\"ID\",\n column_type=\"BIGINT\",\n nullable=False,\n primary_key=1,\n auto_increment=True\n))\n\ntable.add_column(Column(\n column_name=\"name\",\n display_name=\"\u540d\u524d\",\n column_type=\"VARCHAR(100)\",\n nullable=False,\n charset=\"utf8mb4\",\n collation=\"utf8mb4_unicode_ci\"\n))\n\ntable.add_column(Column(\n column_name=\"full_name\",\n display_name=\"\u30d5\u30eb\u30cd\u30fc\u30e0\",\n column_type=\"VARCHAR(201)\",\n nullable=False,\n expression=\"CONCAT(first_name, ' ', last_name)\",\n stored=True\n))\n\nschema.add_table(table)\nmanager.save() # YAML\u4fdd\u5b58\n```\n\n## \u6a5f\u80fd\n\n### \u30b9\u30ad\u30fc\u30de\u30a4\u30f3\u30dd\u30fc\u30c8\n- **A5:SQL Mk-2\u30a4\u30f3\u30dd\u30fc\u30c8**: .a5er\u30d5\u30a1\u30a4\u30eb\u304b\u3089DBGear\u5f62\u5f0f\u3078\u306e\u5909\u63db\n- **\u52d5\u7684\u30a4\u30f3\u30dd\u30fc\u30bf\u30fc**: importlib\u306b\u3088\u308b\u62e1\u5f35\u53ef\u80fd\u306a\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\n- **\u30b9\u30ad\u30fc\u30de\u30de\u30c3\u30d4\u30f3\u30b0**: \u5916\u90e8\u5f62\u5f0f\u304b\u3089DBGear\u30b9\u30ad\u30fc\u30de\u540d\u3078\u306e\u67d4\u8edf\u306a\u30de\u30c3\u30d4\u30f3\u30b0\n- **CLI\u30b5\u30dd\u30fc\u30c8**: `dbgear import`\u30b3\u30de\u30f3\u30c9\u306b\u3088\u308b\u7c21\u5358\u306a\u5909\u63db\n\n### \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b9\u30ad\u30fc\u30de\u7ba1\u7406\n- **\u591a\u5f62\u5f0f\u5bfe\u5fdc**: A5:SQL Mk-2\u3001MySQL\u76f4\u63a5\u63a5\u7d9a\u3001\u72ec\u81eaYAML\u5f62\u5f0f\u5bfe\u5fdc\n- **\u30b9\u30ad\u30fc\u30de\u64cd\u4f5c**: \u30c6\u30fc\u30d6\u30eb\u30fb\u30ab\u30e9\u30e0\u30fb\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30fb\u30d3\u30e5\u30fc\u306e\u8ffd\u52a0\u30fb\u66f4\u65b0\u30fb\u524a\u9664\n- **\u30ab\u30e9\u30e0\u5f0f\u30b5\u30dd\u30fc\u30c8**: MySQL\u751f\u6210\u30ab\u30e9\u30e0\uff08GENERATED ALWAYS AS\uff09\u5bfe\u5fdc\n- **\u62e1\u5f35\u30ab\u30e9\u30e0\u5c5e\u6027**: AUTO_INCREMENT\u3001\u6587\u5b57\u30bb\u30c3\u30c8\u3001\u7167\u5408\u9806\u5e8f\u6307\u5b9a\n- **\u30d3\u30e5\u30fc\u7ba1\u7406**: \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d3\u30e5\u30fc\u306e\u5b9a\u7fa9\u3068\u4f9d\u5b58\u95a2\u4fc2\u7ba1\u7406\n- **SQL\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30a8\u30f3\u30b8\u30f3**: Jinja2\u30d9\u30fc\u30b9\u306e\u7d71\u4e00\u3055\u308c\u305fSQL\u751f\u6210\u30b7\u30b9\u30c6\u30e0\n\n### \u30c7\u30fc\u30bf\u7ba1\u7406\n- **\u521d\u671f\u30c7\u30fc\u30bf\u7ba1\u7406**: YAML\u5f62\u5f0f\u3067\u306e\u30c7\u30fc\u30bf\u5b9a\u7fa9\n- **\u74b0\u5883\u7ba1\u7406**: \u958b\u767a\u30fb\u30c6\u30b9\u30c8\u30fb\u672c\u756a\u74b0\u5883\u306e\u5206\u96e2\n- **\u30c7\u30fc\u30bf\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0**: \u81ea\u52d5\u7684\u306a\u5024\u8a2d\u5b9a\uff08UUID\u3001\u73fe\u5728\u6642\u523b\u7b49\uff09\n- **\u30d7\u30e9\u30b0\u30a4\u30f3\u6a5f\u69cb**: \u30ab\u30b9\u30bf\u30e0\u30c7\u30fc\u30bf\u5909\u63db\u306e\u62e1\u5f35\n- **\u5916\u90e8\u30ad\u30fc\u6574\u5408\u6027**: \u53c2\u7167\u5236\u7d04\u306e\u81ea\u52d5\u691c\u8a3c\n\n## \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u6210\n\n### project.yaml\n```yaml\nproject_name: MyProject\ndescription: Database initial data management\n\ndefinitions:\n - type: a5sql_mk2\n filename: ./schema.a5er\n mapping:\n MAIN: main\n # \u307e\u305f\u306f\u72ec\u81eaYAML\u5f62\u5f0f\u3092\u4f7f\u7528\n - type: dbgear_schema\n filename: ./schema.yaml\n mapping:\n main: production\n\nbindings:\n created_at:\n type: fixed\n value: NOW()\n\ndeployments:\n localhost: mysql+pymysql://root:password@localhost/mydb\n```\n\n### \u74b0\u5883\u8a2d\u5b9a\n```yaml\n# development/_mapping.yaml\nid: mydb_dev\ninstances:\n - main\n```\n\n### \u72ec\u81eaYAML\u5f62\u5f0f\u306e\u30b9\u30ad\u30fc\u30de\u5b9a\u7fa9\n\n```yaml\n# schema.yaml\nschemas:\n main:\n tables:\n users:\n display_name: \u30e6\u30fc\u30b6\u30fc\n columns:\n # \u4e3b\u30ad\u30fc\uff08AUTO_INCREMENT\uff09\n - column_name: id\n display_name: ID\n column_type: BIGINT\n nullable: false\n primary_key: 1\n auto_increment: true\n \n # \u6587\u5b57\u30bb\u30c3\u30c8\u6307\u5b9a\n - column_name: first_name\n display_name: \u540d\n column_type: VARCHAR(50)\n nullable: false\n charset: utf8mb4\n collation: utf8mb4_unicode_ci\n \n - column_name: last_name\n display_name: \u59d3\n column_type: VARCHAR(50)\n nullable: false\n charset: utf8mb4\n collation: utf8mb4_unicode_ci\n \n - column_name: email\n display_name: \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\n column_type: VARCHAR(255)\n nullable: false\n foreign_key: contacts.email\n \n # \u751f\u6210\u30ab\u30e9\u30e0\uff08STORED\uff09\n - column_name: full_name\n display_name: \u30d5\u30eb\u30cd\u30fc\u30e0\n column_type: VARCHAR(101)\n nullable: false\n expression: \"CONCAT(last_name, ' ', first_name)\"\n stored: true\n \n # \u751f\u6210\u30ab\u30e9\u30e0\uff08VIRTUAL\uff09\n - column_name: email_domain\n display_name: \u30e1\u30fc\u30eb\u30c9\u30e1\u30a4\u30f3\n column_type: VARCHAR(255)\n nullable: true\n expression: \"SUBSTRING_INDEX(email, '@', -1)\"\n stored: false\n \n # \u8907\u96d1\u306a\u5f0f\uff08CASE\u6587\uff09\n - column_name: user_type\n display_name: \u30e6\u30fc\u30b6\u30fc\u7a2e\u5225\n column_type: VARCHAR(20)\n nullable: false\n expression: \"CASE WHEN email LIKE '%@company.com' THEN '\u793e\u54e1' ELSE '\u4e00\u822c' END\"\n stored: true\n \n # \u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\n - column_name: created_at\n display_name: \u4f5c\u6210\u65e5\u6642\n column_type: TIMESTAMP\n nullable: false\n default_value: \"CURRENT_TIMESTAMP\"\n \n indexes:\n - index_name: idx_email\n columns: [email]\n - index_name: idx_full_name\n columns: [full_name]\n```\n\n## \u30e9\u30a4\u30d6\u30e9\u30ea\u69cb\u6210\n\n- `dbgear.core.models`: \u30c7\u30fc\u30bf\u30e2\u30c7\u30eb\u3068\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u7ba1\u7406\n - `schema`: Column/Table/View/Schema\u30af\u30e9\u30b9\uff08\u8868\u73fe\u5f0f\u5c5e\u6027\u5bfe\u5fdc\uff09\n - `project`: \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u8a2d\u5b9a\u7ba1\u7406\n - `fileio`: YAML\u5f62\u5f0f\u3067\u306e\u30b9\u30ad\u30fc\u30de\u8aad\u307f\u66f8\u304d\n- `dbgear.core.dbio`: \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9I/O\u64cd\u4f5c\n - `templates`: Jinja2\u30d9\u30fc\u30b9SQL\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30a8\u30f3\u30b8\u30f3\uff0818\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\uff09\n- `dbgear.core.importer`: \u30b9\u30ad\u30fc\u30de\u30a4\u30f3\u30dd\u30fc\u30c8\u6a5f\u80fd\n - \u52d5\u7684\u30a4\u30f3\u30dd\u30fc\u30bf\u30fc\u30ed\u30fc\u30c0\u30fc\uff08importlib\u30d9\u30fc\u30b9\uff09\n- `dbgear.core.importers`: \u30a4\u30f3\u30dd\u30fc\u30bf\u30fc\u30e2\u30b8\u30e5\u30fc\u30eb\n - `a5sql_mk2`: A5:SQL Mk-2\u5f62\u5f0f\u30a4\u30f3\u30dd\u30fc\u30bf\u30fc\n- `dbgear.core.operations`: \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u30aa\u30fc\u30b1\u30b9\u30c8\u30ec\u30fc\u30b7\u30e7\u30f3\n- `dbgear.cli`: CLI\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\n\n## \u8868\u73fe\u5f0f\u6a5f\u80fd\n\n### \u30b5\u30dd\u30fc\u30c8\u3059\u308b\u62e1\u5f35\u30ab\u30e9\u30e0\u5c5e\u6027\n\n- **expression**: \u751f\u6210\u30ab\u30e9\u30e0\u306e\u5f0f\uff08MySQL GENERATED ALWAYS AS\uff09\n- **stored**: STORED\uff08true\uff09\u307e\u305f\u306fVIRTUAL\uff08false\uff09\u306e\u6307\u5b9a\n- **auto_increment**: AUTO_INCREMENT\u5c5e\u6027\n- **charset**: \u6587\u5b57\u30bb\u30c3\u30c8\uff08VARCHAR\u7b49\u306e\u6587\u5b57\u5217\u578b\u3067\u4f7f\u7528\uff09\n- **collation**: \u7167\u5408\u9806\u5e8f\uff08\u6587\u5b57\u5217\u578b\u3067\u4f7f\u7528\uff09\n\n### \u4f7f\u7528\u4f8b\n\n```python\n# \u751f\u6210\u30ab\u30e9\u30e0\u306e\u5b9a\u7fa9\ncalculated_field = Column(\n column_name=\"total_price\",\n column_type=\"DECIMAL(10,2)\",\n expression=\"price * (1 + tax_rate)\",\n stored=True # STORED\u5217\u3068\u3057\u3066\u4fdd\u5b58\n)\n\n# AUTO_INCREMENT\u4e3b\u30ad\u30fc\nid_field = Column(\n column_name=\"id\",\n column_type=\"BIGINT\",\n primary_key=1,\n auto_increment=True\n)\n\n# \u6587\u5b57\u30bb\u30c3\u30c8\u6307\u5b9a\nname_field = Column(\n column_name=\"name\",\n column_type=\"VARCHAR(100)\",\n charset=\"utf8mb4\",\n collation=\"utf8mb4_unicode_ci\"\n)\n```\n\n### \u5236\u7d04\u30fb\u691c\u8a3c\u30eb\u30fc\u30eb\n\n- \u8868\u73fe\u5f0f\u30ab\u30e9\u30e0\u306f `default_value`, `primary_key`, `foreign_key` \u3068\u4f75\u7528\u4e0d\u53ef\n- AUTO_INCREMENT\u306f\u4e3b\u30ad\u30fc\u5fc5\u9808\u3001nullable\u4e0d\u53ef\n- \u5916\u90e8\u30ad\u30fc\u53c2\u7167\u306e\u6574\u5408\u6027\u30c1\u30a7\u30c3\u30af\n- \u30d5\u30a3\u30fc\u30eb\u30c9\u540d\u30fb\u30c6\u30fc\u30d6\u30eb\u540d\u306e\u91cd\u8907\u30c1\u30a7\u30c3\u30af\n\n## Web UI\u304c\u5fc5\u8981\u306a\u5834\u5408\n\nWeb UI\u3067\u306e\u30c7\u30fc\u30bf\u7de8\u96c6\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001`dbgear-web`\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304f\u3060\u3055\u3044\uff1a\n\n```bash\npip install dbgear-web\ndbgear-web --project ./my-project --port 5000\n```\n\n## \u958b\u767a\n\n### \u30c6\u30b9\u30c8\u5b9f\u884c\n```bash\ntask test # \u5168\u30c6\u30b9\u30c8\u5b9f\u884c\ntask test-fast # \u8efd\u91cf\u30c6\u30b9\u30c8\u306e\u307f\ntask lint # flake8\u306b\u3088\u308b\u30b3\u30fc\u30c9\u30c1\u30a7\u30c3\u30af\ntask clean # \u30d3\u30eb\u30c9\u6210\u679c\u7269\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\n```\n\n### \u4f9d\u5b58\u95a2\u4fc2\n```bash\npoetry install # \u4f9d\u5b58\u95a2\u4fc2\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\npoetry add package # \u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u8ffd\u52a0\n```\n\n## \u30e9\u30a4\u30bb\u30f3\u30b9\n\nMIT\n",
"bugtrack_url": null,
"license": null,
"summary": "Database management tools for initial data management",
"version": "0.30.1",
"project_urls": {
"Homepage": "https://github.com/tamuto/dbgear",
"Repository": "https://github.com/tamuto/dbgear"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "25984fceeba7133eb57d7a38cd1b65239f668d85448ebabaa98f4f5b5e625db9",
"md5": "92f542cc8c82d63c9d466f889ba39c5f",
"sha256": "93e8e0b31adb7b993c164200b304976482bb03bfae221c570c408cb11ec7ba01"
},
"downloads": -1,
"filename": "dbgear-0.30.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "92f542cc8c82d63c9d466f889ba39c5f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.12",
"size": 49810,
"upload_time": "2025-08-16T21:15:58",
"upload_time_iso_8601": "2025-08-16T21:15:58.470880Z",
"url": "https://files.pythonhosted.org/packages/25/98/4fceeba7133eb57d7a38cd1b65239f668d85448ebabaa98f4f5b5e625db9/dbgear-0.30.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "54f5cfbf374f113359ebee7aa1a81f10eced6ddf6bdf64b8caaae54f71dfc252",
"md5": "2fd2ac08754ca3c4369c04abfaa1119b",
"sha256": "11512c00703cc78e8433ea0c245846faff5959c173a7c9ed75ee5a263a8d2d24"
},
"downloads": -1,
"filename": "dbgear-0.30.1.tar.gz",
"has_sig": false,
"md5_digest": "2fd2ac08754ca3c4369c04abfaa1119b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.12",
"size": 36442,
"upload_time": "2025-08-16T21:16:00",
"upload_time_iso_8601": "2025-08-16T21:16:00.423016Z",
"url": "https://files.pythonhosted.org/packages/54/f5/cfbf374f113359ebee7aa1a81f10eced6ddf6bdf64b8caaae54f71dfc252/dbgear-0.30.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-16 21:16:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tamuto",
"github_project": "dbgear",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "dbgear"
}