0utputab1e

PythonのDBライブラリ「SQLAlchemy」でMySQLを操作してみた

 2020-07-08
 

前回の記事でdocker-composeを利用したMySQLの構築ができました。今回はPythonライブラリ「SQLAlchemy」を使って、データベースの中にテーブルを作成してみようと思います。

前提環境

  • MySQL: 5.7(前回の記事のdockerで立ち上げたものを使います)
  • Python: 3.7.0
  • pip: 20.1.1(上記Pythonに付属のもの)

SQLAlchemyとMySQLクライアントのインストール

PythonコードからDBの操作をする「SQLAlchemy」も必要ですが、MySQLサーバに接続するためのpython用のMySQLクライアントも必要なので、一緒にインストールします。

$ pip install sqlalchemy
$ pip install mysqlclient

以上でライブラリの準備は完了です。

テーブル作成用のコードを作成

以下のファイルで既存のデータベース内にテーブルを新規作成していきます。

  • database.py
import sys
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float, DateTime

DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8mb4' % (
    "docker",  #ユーザー「docker」の
    "docker",  #パスワード「docker」で    
    "127.0.0.1:3306",  #MySQLサーバ(http:\/\/127.0.0.1:3306)に接続し
    "test_db", データベースtest_dbにアクセスします
)

#DB接続用のインスタンスを作成
ENGINE = create_engine(
    DATABASE,
    convert_unicode=True,
    echo=True  #SQLをログに吐き出すフラグ
)

#上記のインスタンスを使って、MySQLとのセッションを張ります
session = scoped_session(
    sessionmaker(
        autocommit = False,
        autoflush = False,
        bind = ENGINE
    )
)

#以下に書いていくDBモデルのベース部分を作ります
Base = declarative_base()
Base.query = session.query_property()

#DBとデータをやり取りするためのモデルを定義
class User(Base):
    __tablename__ = 'users'
    id = Column('id', Integer, primary_key = True)
    name = Column('name', String(200))
    age = Column('age', Integer)
    email = Column('email', String(100))

#このPythonスクリプトを実行したとき、テーブルを一旦削除して新規作成する
def main(args):
    Base.metadata.drop_all(bind=ENGINE)
    Base.metadata.create_all(bind=ENGINE)

#このファイルを直接実行したとき、mainメソッドでテーブルを作成する
if __name__ == "__main__":
    main(sys.argv)

テーブル作成プログラムを実行

上記の「database.py」を実行してみましょう。

$ python database.py

(中略)
2020-07-08 23:58:47,130 INFO sqlalchemy.engine.base.Engine
CREATE TABLE users (
	id INTEGER NOT NULL AUTO_INCREMENT,
	name VARCHAR(200),
	age INTEGER,
	email VARCHAR(100),
	PRIMARY KEY (id)
)


2020-07-08 23:58:47,130 INFO sqlalchemy.engine.base.Engine ()
2020-07-08 23:58:47,136 INFO sqlalchemy.engine.base.Engine COMMIT

無事作成完了!

データベースに反映されたかどうか確認する

データベースの中を見てみましょう。

mysql> use test_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+--------------------+
| Tables_in_test_db  |
+--------------------+
| test_tbl<-前回のやつ|
| users   <-new!     |
+--------------------+
2 rows in set (0.00 sec)

mysql> desc users;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(200) | YES  |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
| email | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

「database.py」で定義したテーブルの作成を確認できました!

まとめ

今回はDockerで立ち上げたMySQLに、SQLAlchemyでテーブル作成までを行うことができました。

 
次回以降はこのSQLAlchemyと他のライブラリを使って、もっといろいろ動かしてみようと思います。

 
では、また会いましょう!

 

あわせて読みたい記事

>> Homeに戻る