目次
結論。自分の理解まとめ。
SQLAlchemyはORMツール。このライブラリ使って、DB操作しろよってこと。
ORMは、リレーショナルデータベースに対する操作をオブジェクト型指向言語で扱えるようにするための手法です。
つまり、SQLを書かずにDBデータの操作を行う手法。
具体的なデータ操作の処理は、カプセル化されています。
なので、SQLを記載せずに全部Pythonで記載できるし、DBがSQLiteだろうがMySQLだろうが何であれ、このSQLAlchemyを通すことで、DBの違いを意識しなくても良くなります。
また、テーブルの表現の仕方としては、オブジェクト指向でやるので、
テーブルのカラムをクラスで表現して、テーブルの行をそのクラスのインスタンスで表現することになります。
SQL Alchemyの全体像の認識
2層の概念があり、「SQL Alchemy ORM」と「SQL Alchemy Core」です。
ORMの方は、より抽象的で便利なAPIを用意しています。あまりSQLを意識せず、機能を実行するイメージか?
テーブル行をPythonのインスタンスで表現して、DBに関連付けていく作り方。
Coreの方は、基本的にユーザーはCore層の一部である「SQL Expression Language」というものを使うようです。ORMでは表現しきれない、より具体的でSQLに近い表現で書いていくようです。
また、SQL AlchemyからDBへアクセスするために、DBのAPIは別途インストールが必要だそうです。使用するDBに応じて対応してください。SQLiteの場合は、標準モジュールであるsqlite3と同一のDBAPIだそうなので、追加のインストールは不要です。つまり、SQL Alchemyだけインストールすれば良い。
SQL Alchemy ORMの使い方
DBへの接続用インスタンス生成
from sqlalchemy import create_engine
# create_engine('DBの種類(+ドライバーの指定があれば)://DB接続ユーザー名:DB接続パスワード@ホスト名:ポート番号/接続DB名?charset=文字コード')
engine = create_engine('sqlite:///test.db')
テーブルとクラスのマッピング
from sqlalchemy.orm import declarative_base
Base = declarative_base()
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, String
class Mysite(Base):
__tablename__ = 'Mysite'
id = Column(Integer, primary_key=True)
name = Column(String)
twitter = Column(String)
address= Column(String)
テーブルをDBに作成する
Base.metadata.create_all(engine)
Baseを継承しているクラスの定義がDBに作成される。
metadataはDBの色々な情報を持っているオブジェクト。これを使うことで既存のDBの定義を取得することもできる。
セッション
セッションを通してDBにアクセスする。セッションはDBコネクションを作成してから切断するまでの単位。セッションを作成して、DBと繋がって、クエリを実行することでデータ操作できる。
from sqlalchemy.orm import sessionmaker
SessionObj = sessionmaker(bind=engine)
session = SessionObj()
# ~~何かのDBアクセス処理~~
# ちゃんとクローズする。
session.close()
データを追加してみる
site_info= Mysite(name="taishi", twitter="@taishi_tera", address="https://surukoto.jp")
session.add(site_info)
session.commit()
既存のテーブルを使う場合は、マッピング方法を簡単にできる
Base = declarative_base(bind=engine)
class sudeniaru_table(Base):
__tablename__ = "Mysite"
__table_args__ = {"autoload": True}
データを取得してみる
for row in session.query(sudeniaru_table):
print(row.id, row.name, row.twitter, row.address)