スクリプトのお勉強

yoyo-migrationsを使ってみる

投稿日:2020年11月14日 更新日:

勉強用に、PythonでPostgresqlを制御しようと思います。

その前に、Postgresqlの設定と、マイグレーションをしようかと思います。
まずyoyo-migrationsを使用します。

yoyo-migrationsとは

yoyo-migrationsとは、データベースのスキーマを管理するツールです。
他にもありますが、なんとなくシンプルそうだったので採用しました。

PostgreSQLのインストール

使用しているディストリビューションはubuntu 20.04です。

公式を見ながらインストールしました。

$ sudo apt-get install curl ca-certificates gnupg
$ sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt install postgresql-common
$ sudo sh /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
$ sudo apt update
$ sudo apt install postgresql-13
### 起動と起動確認
$ sudo systemctl start postgresql
$ sudo systemctl status postgresql
  postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; disabled; vendor preset: enabled)
     Active: active (exited) since Sat 2020-11-14 10:19:15 JST; 5s ago
    Process: 102819 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 102819 (code=exited, status=0/SUCCESS)

11月 14 10:19:15 ubuntu systemd[1]: Starting PostgreSQL RDBMS...
11月 14 10:19:15 ubuntu systemd[1]: Finished PostgreSQL RDBMS.

ユーザ作成とデータベース作成と

これらまでは手動で行います。

データベースと、ユーザ名は以下を設定します。

データベース名: testdb
ユーザ名: testuser
パスワード: testuserp
データベースの文字コード(エンコーディング): UTF-8

以下でtestdbをtestuserでログインできるようにします。

$ sudo su - postgres
$ vi /etc/postgres/13/pg_hba.conf
local   testdb          testuser                                md5
$ psql
> create role testuser with LOGIN PASSWORD 'testuserp';
> create database testdb owner postgres encoding 'UTF8';
> GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

yoyo-migrationsの設定

やっと本題です。

テーブルは以下を作成します。

create table addr (
  id SERIAL,
  name text,
  addr text,
  ipaddr inet,
  create_time timestamp with time zone,
  update_time timestamp with time zone,
);

本稿のソース

ここに設定したソースを置いてあります。

インストール及び設定

yoyoの設定ファイルは以下の通りです。

[DEFAULT]

sources = %(here)s/migrations
database = postgresql://testuser:testuserp@localhost/testdb
verbosity = 3
batch_mode = on
prefix = testp_

以下のように起動します。

$ pipenv install yoyo-migrations
$ pipenv run yoyo -c ./migration/yoyo.ini list
STATUS    ID                SOURCE
--------  ----------------  ------------------------------------------------------------------------
U         0001_create_addr  /home/tanino/script-plactice/yoyo-migrations-sample/migration/migrations
$ pipenv run yoyo -c ./migration/yoyo.ini apply
INFO:yoyo.migrations:Applying 0001_create_addr
INFO:yoyo.migrations: - applying step 0
DEBUG:yoyo.migrations: - executing b'create table addr (id SERIAL, name text, addr text, ipaddr inet, create_time timestamp with time zone, update_time timestamp with time zone);'
INFO:yoyo.migrations:Marking 0001_create_addr applied

確認

出来たかどうか確認するのは以下です。

postgres@ubuntu:~$ psql -d testdb
testdb=# \d addr
                                        テーブル"public.addr"
     列      |          タイプ          | 照合順序 | Null 値を許容 |            デフォルト
-------------+--------------------------+----------+---------------+----------------------------------
 id          | integer                  |          | not null      | nextval('addr_id_seq'::regclass)
 name        | text                     |          |               |
 addr        | text                     |          |               |
 ipaddr      | inet                     |          |               |
 create_time | timestamp with time zone |          |               |
 update_time | timestamp with time zone |          |               |

終わりに

yoyo-migrations自体はうまくいきました。
次はfastapi + sqlalchemyでAPI(CRUDアプリケーションを作ってみたいと思います。

-スクリプトのお勉強

執筆者:

関連記事

pipenv + Apache + Django起動設定

仕事でwebアプリケーションを作成しています。 Djangoで作成し、webサーバをApache、環境をpipenvで設定したpython3環境上で動かす予定です。 Apacheが起動するまでに、苦労 …

Python Falconによる REST APIの作成

1.はじめに 最近、仕事では、あまり技術的なことをしてませんで。。今回は、pythonのFalconというWebアプリケーションフレームワークを使用し、REST APIを作成します。 前回は、Djan …

Selenium + Python によるアップロードアプリの動作確認プログラム作成

私の周りでは、なぜかSeleniumが流行っている模様です。 私自身は、Webアプリ的なのも作ってますが、あまり使ってなかったので、使ってみようと思います。 前回作成した、Djangoのupload_ …

Python3 – VCR.py でネットワーク系テストを簡単に作成する

1. 始めに python3で実装すると、モックテストをしたくなります。モックを使って、比較的簡単にテストできるからです。 問題はネットワーク系テスト モックテストで問題になるのは、外部に依存するテス …

Vue.js 導入編

1.はじめに 近年、web関係で「クライアントサイドJavaScript」というのがトレンドになっているそうです。 「クライアントサイドJavaScript」と、従来のWebアプリケーションとの違いは …