SQLAlchemy と Alembic によるスキーマ管理と移行
このガイドでは、Python エコシステム(SQLAlchemy、Alembic、sqlacodegen を含む)を使用して、starrocks SQLAlchemy ダイアレクトを通じて StarRocks スキーマを管理する方法を紹介します。スキーママイグレーションがなぜ有用なのか、そして StarRocks で効果的に使用する方法を理解するのに役立ちます。
概要
多くのユーザーは、StarRocks のテーブル、ビュー、マテリアライズドビューを SQL DDL を直接使用して管理しています。しかし、プロジェ クトが成長するにつれて、ALTER TABLE ステートメントを手動で維持することはエラーを引き起こしやすく、追跡が困難になります。
StarRocks SQLAlchemy ダイアレクト (starrocks) は以下を提供します:
- StarRocks の テーブル、ビュー、マテリアライズドビュー のための完全な SQLAlchemy モデルレイヤー
- テーブルスキーマとテーブルプロパティ(ビューとマテリアライズドビューを含む)のための 宣言的 定義
- Alembic との統合により、スキーマ変更を自動的に 検出 し、生成 することが可能
- sqlacodegen のようなツールとの互換性により、モデルを逆生成することが可能
これにより、Python ユーザーは StarRocks スキーマを 宣言的、バージョン管理された、自動化された 方法で維持することができます。
主な利点
スキーママイグレーションは伝統的に OLTP データベースと関連付けられていますが、StarRocks のようなデータウェアハウジングシステムでも価値があります。以下の利点から、チームは Alembic を StarRocks ダイアレクトと共に使用しています。
宣言的スキーマ定義
Python ORM モデルや SQLAlchemy コアスタイルでスキーマを定義すると、ALTER TABLE ステートメントを手動で書く必要がなくなります。
自動差分生成と自動生成
Alembic は 現在の StarRocks スキーマ と SQLAlchemy モデル を比較し、マイグレーションスクリプトを自動的に生成します(CREATE/DROP/ALTER)。
レビュー可能でバージョン管理されたマイグレーション
各スキーマ変更はマイグレーションファイル(Python)となり、ユーザーは変更を追跡し、必要に応じてロールバックできます。
環境間での一貫したワークフロー
スキーマ変更は、開発、ステージング、本番環境に同じプロセスで適用できます。
インストールと接続
前提条件
- StarRocks Python クライアント: 1.3.2 以上
SQLAlchemy: 1.4 以上(SQLAlchemy 2.0 が推奨され、sqlacodegenを使用するには必須)Alembic: 1.16 以上
StarRocks Python クライアントのインストール
以下のコマンドを実行して、StarRocks Python クライアントをインストールします。
pip install starrocks
StarRocks への接続
以下の URL を使用して、StarRocks クラスターに接続します。
starrocks://<user>:<password>@<FE_host>:<query_port>/[<catalog>.]<database>
user: クラスターに接続するためのユーザー名。password: ユーザーパスワード。FE_host: FE の IP アドレス。query_port: FE のquery_port(デフォルト: 9030)。catalog: データベースが所在するカタログの名前。database: 接続したいデータベースの名前。
インストール後、以下のコード例を使用して接続性をすぐに検証できます。
from sqlalchemy import create_engine, text
# まず `mydatabase` を作 成する必要があります
engine = create_engine("starrocks://root@localhost:9030/mydatabase")
with engine.connect() as conn:
conn.execute(text("SELECT 1")).fetchall()
print("Connection successful!")
StarRocks モデルの定義(宣言的 ORM)
StarRocks ダイアレクトは以下をサポートします:
- テーブル
- ビュー
- マテリアライズドビュー
また、StarRocks 固有のテーブル属性もサポートしています:
ENGINE(OLAP)- キーモデル(
DUPLICATE KEY、PRIMARY KEY、UNIQUE KEY、AGGREGATE KEY) PARTITION BYのバリエーション(RANGE / LIST / 式に基づくパーティション化)DISTRIBUTED BYのバリエーション(HASH / RANDOM)ORDER BY- テーブルプロパティ(例:
replication_num、storage_medium)
- StarRocks ダイアレクトオプションは、
starrocks_というプレフィックスを付けたキーワード引数として渡されます。 starrocks_プレフィックスは小文字でなければなりません。サフィックスは大文字小文字どちらでも受け入れられます(例:PRIMARY_KEYとprimary_key)。- テーブルキーを指定する場合(例:
starrocks_primary_key="id")、関与するカラムもColumn(...)でprimary_key=Trueとマークされている必要があります。これにより、SQLAlchemy メタデータと Alembic の自動生成が正しく動作します。
以下の例は、実際の公開 API とパラメータ名を反映しています。
テーブルの例
StarRocks テーブルオプションは、ORM(__table_args__ 経由)と Core(Table(..., starrocks_...=...) 経由)の両方のスタイルで指定できます。
ORM(宣言的)スタイル
from sqlalchemy import create_engine
from sqlalchemy.orm import Mapped, declarative_base, mapped_column
from starrocks import INTEGER, STRING
# クイックテストと同じエンジンを使用
engine = create_engine("starrocks://root@localhost:9030/mydatabase")
Base = declarative_base()
class MyTable(Base):
__tablename__ = 'my_orm_table'
id: Mapped[int] = mapped_column(INTEGER, primary_key=True)
name: Mapped[str] = mapped_column(STRING)
__table_args__ = {
'comment': 'table comment',
'starrocks_primary_key': 'id',
'starrocks_distributed_by': 'HASH(id) BUCKETS 10',
'starrocks_properties': {'replication_num': '1'}
}
# データベースにテーブルを作成
Base.metadata.create_all(engine)
Core スタイル
from sqlalchemy import Column, MetaData, Table, create_engine
from starrocks import INTEGER, VARCHAR
# クイックテストと同じエンジンを使用
engine = create_engine("starrocks://root@localhost:9030/mydatabase")
metadata = MetaData()
my_core_table = Table(
'my_core_table',
metadata,
Column('id', INTEGER, primary_key=True),
Column('name', VARCHAR(50)),
# StarRocks 固有の引数
starrocks_primary_key='id',
starrocks_distributed_by='HASH(id) BUCKETS 10',
starrocks_properties={"replication_num": "1"}
)
# データベースにテーブルを作成
metadata.create_all(engine)
テーブル属性とデータ型の包括的なリファレンスについては、Reference [4] を参照してください。
ビューの例
以下は、columns を辞書のリスト(name/comment)として使用する推奨されるビュー定義スタイルです。この例は、既存のテーブル my_core_table に基づいています。
from starrocks.schema import View
# 上記の Core テーブル例からメタデータを再利用
metadata = my_core_table.metadata
user_view = View(
"user_view",
metadata,
definition="SELECT id, name FROM my_core_table WHERE name IS NOT NULL",
columns=[
{"name": "id", "comment": "ID"},
{"name": "name", "comment": "Name"},
],
comment="Active users",
)
ビューのオプションと制限については、Reference [5] を参照してください。
マテリアライズドビューの例
マテリアライズドビューは同様に定義されます。starrocks_refresh プロパティは、リフレッシュ戦略を示す構文文字列です。
from starrocks.schema import MaterializedView
# 上記の Core テーブル例からメタデータを再利用
metadata = my_core_table.metadata
# シンプルなマテリアライズドビューを作成(非同期リフレッシュ)
user_stats_ = MaterializedView(
'user_stats_',
metadata,
definition='SELECT id, COUNT(*) AS cnt FROM my_core_table GROUP BY id',
starrocks_refresh='ASYNC'
)
オプションと ALTER の制限については、Reference [6] を参照してください。
Alembic 統合
StarRocks SQLAlchemy ダイアレクトは以下を完全にサポートします:
- テーブルの作成 / 削除
- ビューの作成 / 削除
- マテリアライズドビューの作成 / 削除
- StarRocks 固有の属性に対するサポートされた変更の検出(例:テーブルプロパティと分散)
これにより、Alembic の autogenerate が正しく動作します。