コンテンツにスキップ

移行する

データベースの初期化

すべての例は、すでにデータベースがあることを前提としていることに注意してください。

これが当てはまらず、テーブルを作成する必要がある場合は、ormarがsqlalchemyを使用してベーステーブルを構築するため、非常に簡単です。

以下のサンプルのようにcreate_all()を呼び出すだけです。

1
2
3
4
5
sqlalchemyをインポート
#sqlalchemy形式でデータベースURLを取得する-モデル定義で使用されるデータベースインスタンスと同じ
engine=sqlalchemy. create_engine("sqlite:///test.db")
#これは、ormar Models定義で使用されるのと同じメタデータである必要があることに注意してください。
metadata. create_all(エンジン)

また、ormar. ormar_configオブジェクトでsqlalchemyテーブルを公開する単一のテーブルを作成することもできます。

1
2
3
4
5
sqlalchemyをインポート
#sqlalchemy形式でデータベースURLを取得する-モデル定義で使用されるデータベースインスタンスと同じ
engine=sqlalchemy. create_engine("sqlite:///test.db")
#Artistは以前の例からのormarモデルです
Artist. ormar_config.table.create(エンジン)

!!!警告テーブルは一度だけ作成する必要があるので、Pythonコンソールを使用するか、最初に使用した後に本番コードからスクリプトを削除してください。

蒸留器の使い方

テーブルと同様に、sqlalchemyに基づいてテーブルを移行するため、alembicを使用します。

初期化

コマンドラインを使用して、このシンプルな例を再現します。

1
2
3
alembic in it alembic
alembicリビジョン--autoGeneration-m"いくつかの変更を加えました"
alembicアップグレードヘッド

サンプルenv.pyファイル

蒸留器の移行の簡単な例は次のようになります。

アプリケーションの構造は次のとおりです。

1
2
3
4
5
->アプリ
    ->alembic(初期化フォルダ-アプリフォルダ内でalembic in it alembicを実行)
    ->モデル(ここにモデルがあります)
      ->__in it__. py
      ->my_models.py

(alembicフォルダ内の)env.pyファイルは次のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
logging. configからfileConfigをインポート
sqlalchemyからcreate_engineをインポート

alembicインポートコンテキストから
sys, osをインポート

#システムパスにアプリフォルダを追加する(代わりに、python-mを使用して親フォルダから実行することもできます。。。)
myPath=os. path.dirname(os.path.abspath(__ファイル__))
sys. path.insert(0,myPath+'/../../')

これはAlembic Configオブジェクトです。
#使用中の. iniファイル内の値へのアクセス。
config=context. config

Pythonログの設定ファイルを解釈します。
この行は基本的にロガーを設定します。
fileConfig(config. config_file_name)

#ここにモデルのMetaDataオブジェクトを追加します(ormarで使用されるもの)
'autoGeneration'のサポート
app. models.my_modelsからメタデータをインポート
target_metadata=メタデータ


#ここでURLを設定するか、設定からインポートする
#デフォルトでは、URLはalembic. iniファイルに保存されたsqlachemy.url変数にあることに注意してください。
URL="sqlite:///test. db"


def run_Migrations_off line():
    「オフライン」モードでマイグレーションを実行します。

    これは、URLだけでコンテキストを構成します。
    エンジンではありませんが、エンジンは受け入れられます
    ここではwell.Byエンジンの作成をスキップします
    DB APIが利用可能である必要はありません。

    ここでcontext. execute()を呼び出し、指定された文字列を
    スクリプト出力。

    """
    context. configure(コンフィギュア)
        url=URL,
        target_metadata=ターゲットメタデータ
        リテラルバインド=True,
        dialect_opts={"paramstyle": "named"}、
        #UUIDフィールドを使用する場合は、このパラメータも設定します。
        #プレフィックスは、alembicのsqlalchemyインポート名と一致する必要があります。
        #sqlalchemy_module_prefixオプションで設定できる(デフォルトは'sa.')
        user_module_prefix='sa.'
    )

    context. start_トランザクション()を使用して:
        context. run_Migrations()


def run_Migrations_on line():
    「オンライン」モードで移行を実行します。

    このシナリオでは、エンジンを作成する必要があります。
    そして、文脈とのつながりを関連付けます。

    """
    接続可能=create_engine(URL)

    Connectable. connect()を接続として使用します:
        context. configure(コンフィギュア)
            connection=connection、
            target_metadata=ターゲットメタデータ
            #UUIDフィールドを使用する場合は、このパラメータも設定します。
            #プレフィックスは、alembicのsqlalchemyインポート名と一致する必要があります。
            #sqlalchemy_module_prefixオプションで設定できる(デフォルトは'sa.')
            user_module_prefix='sa.'
        )

        context. start_トランザクション()を使用して:
            context. run_Migrations()


if context. is_off line_mode():
    移行をオフラインで実行()
その他:
    ラン_マイグレーション_オンライン()

除外フォーム

context. configureに渡されたinclude_objectパラメータを使用して、特定のテーブルをインクルード/除外することもできます。これは、指定されたオブジェクトに対してTrue/Falseを返す関数である必要があります。

サンプル関数は、data_jobでない限り、名前がdata_で始まるテーブルを除外します。

1
2
3
4
5
def include_object(object, name,type_,反映,比較_to):
    if name and name. startswith('data_')and name not in['data_job']:
        return False

    return True

!!!注意include_objectの関数パラメータ(名前を変更できる)が必要で、alembicで定義して、その役割を確認してください。alembicドキュメントを確認してください

次に、コンテキスト(オンラインとオフライン)に渡します。

1
2
3
4
5
6
7
8
context. configure(コンフィギュア)
        url=URL,
        target_metadata=ターゲットメタデータ
        リテラルバインド=True,
        dialect_opts={"paramstyle": "named"}、
        user_module_prefix='sa.',
        インクルードオブジェクト
    )

!!!テーブルの作成、変更、および移行の詳細については、sqlalchemyテーブル作成ドキュメントを参照してください。