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行目以降で定義したデータベースが作成されます。
ターミナルでデータベースを立ち上げて.tables
コマンドを入れるとpersons
テーブルが作成されて、select * from persons
でテーブルの中身を見ると、2つのレコードが保存されていることがわかります。
続いてMySQLでおなじように実行してみましょう。
MySQLでデータベースを作成
今回は、7行目以降のコードをそのまま使いたいので、ターミナルからMySQLを操作してデータベースを作成しておきます。
ターミナルでコマンドmysql -u ユーザー名 -h localhost -p
を実行し、パスワードを入力してMySQLにログインします。
次にshow databases;
でデータベースを確認してから、create database test_mysql2_db
でデータベースを作成します。
再度show databases;
コマンドでデータベースを確認すると、新しくtest_mysql2_db
が作成されていることがわかります。
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の出力と同じく、次のようになります。
テーブル操作自体は全く同じなので、出力結果も同じなのは当たり前ですね。
ターミナルで確認
最後にターミナルでテーブルが作成されているか確認しておきましょう。
ターミナルで順番にコマンドを実行します。
- use test_mysql2_db;
- show tables;
- select * from persons;
persons
テーブルが作成されていて、次に3つのレコードを書き込んだあと、1つ目のレコードの名前を変更し、2つ目のレコードを削除した結果、最終的に2つのレコードが表示されています。
使いまわしができる
シングルソース・マルチユースという言葉を聞いたことがあると思いますが、1つのソースでいくつものデータベースを使えるというのは作業効率を高めるために非常に重要です。
SQLAlchemyは、まさに1つコードを書けばいくつものデータベースで使いまわしのできるパッケージなので、Pythonからデータベースを扱うためには必須といえます。
標準ライブラリーやサードパーティーライブラリは究極の使い回しと言えますが、Pythonを学習すればするほど、使い回しができるリソースが溜まっていくので、どんどんコードを書くようにしましょう!
それでは今日はこのへんで。
明日も元気にGood Python!