dbgear


Namedbgear JSON
Version 0.30.1 PyPI version JSON
download
home_pagehttps://github.com/tamuto/dbgear
SummaryDatabase management tools for initial data management
upload_time2025-08-16 21:16:00
maintainerNone
docs_urlNone
authortamuto
requires_python<4.0,>=3.12
licenseNone
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"
}
        
Elapsed time: 0.97577s