フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

PythonのSqlAlchemy-migrateでテーブルを作成する

SqlAlchemy-migrateを使ってみる

sqlalchemy-migrate.readthedocs.io

インストール

$ pip install sqlalchemy
$ pip install sqlalchemy-migrate
$ pip install pymysql
$ migrate --help

プロジェクトの作成

migrate create "<フォルダ名>" "<リポジトリ名>"

migrate create migrate "fastapi"

リポジトリとは - manage.py、構成ファイル(migrate.cfg)、およびPythonスクリプトまたはSQLファイルのデータベース変更セットスクリプトが含まれています。 sqlalchemy-migrate.readthedocs.io

  • 上記のコマンドを実行すると下記のようなフォルダ構成となる
migrate
|--README
|--__init__.py
|--__pycache__
|  |--__init__.cpython-39.pyc
|--manage.py
|--migrate.cfg
|--versions
|  |--__init__.py
|  |--__pycache__
|  |  |--__init__.cpython-39.pyc

migrate関連の設定

  • 作成されたフォルダ内にあるmanage.pyファイルを開き接続先のDBを指定する。
  • 接続方法はインストールドライバによって異なるので気を付ける。下記はmysqlclientを利用した
#!/usr/bin/env python
from migrate.versioning.shell import main

if __name__ == '__main__':
    main(debug='False', url='mysql+pymysql://root:password@db/fastapi?charset=utf8', repository='.')

マイグレーションのバージョン管理をするための準備

  • 下記のコマンドを実行する
python manage.py version_control

テーブルの作成

 python manage.py script "add users table"
  • 上記コマンドを実行するとversions/001_add_users_table.pyファイルが作成される
from sqlalchemy import *
from migrate import *


def upgrade(migrate_engine):
    # Upgrade operations go here. Don't create your own engine; bind
    # migrate_engine to your metadata
    pass


def downgrade(migrate_engine):
    # Operations to reverse the above upgrade go here.
    pass
  • 下記のように修正してユーザーテーブルを作成してみる
from sqlalchemy import *
from migrate import *
from sqlalchemy import Table, Column, MetaData,BIGINT, VARCHAR, DateTime, Text

meta = MetaData()

users = Table(
    'users', meta,
    Column('id', BIGINT(), primary_key=True, autoincrement=True),
    Column('mail_address', VARCHAR(40), nullable=False),
    Column('password', VARCHAR(40), nullable=False),
    Column('last_login_at', DATETIME),
    Column('created_at', DATETIME, nullable=False),
    Column('updated_at', DATETIME, nullable=False)
)


def upgrade(migrate_engine):
    meta.bind = migrate_engine
    users.create()


def downgrade(migrate_engine):
    meta.bind = migrate_engine
    users.drop()

マイグレーション実行

# python manage.py upgrade
0 -> 1... 
done

テーブルが作成されていることを確認する

mysql> desc users;
+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| id            | bigint      | NO   | PRI | NULL    | auto_increment |
| mail_address  | varchar(40) | NO   |     | NULL    |                |
| password      | varchar(40) | NO   |     | NULL    |                |
| last_login_at | datetime    | YES  |     | NULL    |                |
| created_at    | datetime    | NO   |     | NULL    |                |
| updated_at    | datetime    | NO   |     | NULL    |                |
+---------------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)