Python SQLAlchemyの使い方 Udemy講座 データベースの切り替え

Python学習【365日チャレンジ!】143日目のマスターU(@Udemy11)です。

衝動買い的に青物用のランディングポールとランディングネットを購入してしまいました。。。

今使っているネットは、実家にあった安物で、ネットとポールの接続部分が取れてしまい、接着剤でくっつけているのですが、魚をすくう時に外れてしまわないか気が気でなかったんです。

いろいろと悩んだ挙げ句、ポールがオリムピックのステーザEX480、ネットがベルモントのカーボンフレームMR-279、ジョイントを昌栄のフレックスアーム Ver.2 ロックタイプで組み合わせました。

フィッシングに興味のない人には申し訳ないのですが、それなりに良いものを買ったので、商品を眺めながらニヤニヤしてしまいます。

そんな変態ぶりはさておき、今日もPython学習をはじめましょう。

昨日の復習

昨日は、SQLAlchemyを使って、SQLiteのデータベースを扱う方法を学習しました。

実際にデータベースファイルを作成せずに、メモリー上にデータベースを作ってSQLiteの操作を試してみましたが、コード内にSQL文を記述する必要がなく、SQLAlchemyが自動的にSQL文を生成してくれました。

SQLAlchemyを使ってメモリー上でSQLiteのデータベースを扱う方法はこちらの記事をごらんください。

今日も引き続き、SQLAlchemyについて学習しましょう!

データベースの切り替え

昨日作成したSQLAlchemyでSQLiteを操作するコードは次のようなものでした。

import sqlalchemy
import sqlalchemy.ext.declarative
import sqlalchemy.orm

engine = sqlalchemy.create_engine('sqlite:///:memory:')

Base = sqlalchemy.ext.declarative.declarative_base()

class Person(Base):
    __tablename__ = 'persons'
    id = sqlalchemy.Column(sqlalchemy.Integer,
                           primary_key=True,
                           autoincrement=True)
    name = sqlalchemy.Column(sqlalchemy.String(14))

Base.metadata.create_all(engine)

Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()

person1 = Person(name='Mark')
session.add(person1)
person2 = Person(name='Kate')
session.add(person2)
person3 = Person(name='Alex')
session.add(person3)
session.commit()

person4 = session.query(Person).filter_by(name='Mark').first()
person4.name = 'Michel'
session.add(person4)

person5 = session.query(Person).filter_by(name='Kate').first()
session.delete(person5)
session.commit()

persons = session.query(Person).all()
for person in persons:
    print(person.id, person.name)

このコードはメモリーを使っていたので、まずはSQLiteのデータベース作成するコードに変更します。

5行目のengineを生成するコードを次のように変更します。

engine = sqlalchemy.create_engine('sqlite:///test_sqlite2.db')

このように、接続URLをsqlite:///:memory:からsqlite:///test_sqlite2.dbに変更するだけで、実行ファイルと同じ階層に6行目以降で定義したデータベースが作成されます。

Python SQLAlchemyの使い方 Udemy講座 データベースの切り替え

ターミナルでデータベースを立ち上げて.tablesコマンドを入れるとpersonsテーブルが作成されて、select * from personsでテーブルの中身を見ると、2つのレコードが保存されていることがわかります。

Python SQLAlchemyの使い方 Udemy講座 データベースの切り替え

続いてMySQLでおなじように実行してみましょう。

MySQLでデータベースを作成

今回は、7行目以降のコードをそのまま使いたいので、ターミナルからMySQLを操作してデータベースを作成しておきます。

ターミナルでコマンドmysql -u ユーザー名 -h localhost -pを実行し、パスワードを入力してMySQLにログインします。

Python SQLAlchemyの使い方 Udemy講座 データベースの切り替え

次にshow databases;でデータベースを確認してから、create database test_mysql2_dbでデータベースを作成します。

Python SQLAlchemyの使い方 Udemy講座 データベースの切り替え

再度show databases;コマンドでデータベースを確認すると、新しくtest_mysql2_dbが作成されていることがわかります。

Python SQLAlchemyの使い方 Udemy講座 データベースの切り替え

PythonからMySQLを操作

Pythonファイルに戻って、データベースを操作していきますが、最初に書いたコードの7行目以降は全く同じになります。

インポートするモジュールも変更ありませんが、MySQLにログインするためにユーザーIDとパスワードが必要なので、MySQLの学習でやったように、ユーザーIDとパスワードを保存したconfig.pyを追加でインポートして、変数を定義し、engineオブジェクトを生成します。

変更する部分のコードがこちらです。

import config


test_id = config.test_mysql_id
test_pass = config.test_mysql_pass

engine = sqlalchemy.create_engine('mysql+pymysql://{}:{}@localhost/test_mysql2_db'.format(test_id, test_pass))

MySQLにログインするためには、ユーザーIDとパスワード、ホストが必要です。

mysql+pymysql://ユーザー名:パスワード@ホスト/データベース名を入れてエンジンを生成します。

上記のコードでは、ユーザー名とパスワードを変数に入れているので、formatを使って値を代入しています。

12行目以降は、最初のコードの7行目以降と全く同じです。

コードが書けたらPythonを実行します。

出力結果はSQLiteの出力と同じく、次のようになります。

テーブル操作自体は全く同じなので、出力結果も同じなのは当たり前ですね。

ターミナルで確認

最後にターミナルでテーブルが作成されているか確認しておきましょう。

ターミナルで順番にコマンドを実行します。

  1. use test_mysql2_db;
  2. show tables;
  3. select * from persons;

Python SQLAlchemyの使い方 Udemy講座 データベースの切り替え

personsテーブルが作成されていて、次に3つのレコードを書き込んだあと、1つ目のレコードの名前を変更し、2つ目のレコードを削除した結果、最終的に2つのレコードが表示されています。

使いまわしができる

シングルソース・マルチユースという言葉を聞いたことがあると思いますが、1つのソースでいくつものデータベースを使えるというのは作業効率を高めるために非常に重要です。

SQLAlchemyは、まさに1つコードを書けばいくつものデータベースで使いまわしのできるパッケージなので、Pythonからデータベースを扱うためには必須といえます。

標準ライブラリーやサードパーティーライブラリは究極の使い回しと言えますが、Pythonを学習すればするほど、使い回しができるリソースが溜まっていくので、どんどんコードを書くようにしましょう!

それでは今日はこのへんで。

明日も元気にGood Python!