PythonのDBライブラリ「SQLAlchemy」でMySQLを操作してみた
2020-07-08
今回は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と他のライブラリを使って、もっといろいろ動かしてみようと思います。
では、また会いましょう!