これは何の記事
以下をまとめました
-
sqlalchemy
でデータを取得する方法 -
SELECT
,WHERE
,JOIN
の扱い方 - 取得データの参照方法
早めの結論
SELECT
-
query()
を使用 -
execute()
とtext()
でSQL
を実行
WHERE, JOIN
-
WHERE
:filter()
を使用 -
JOIN
:join()
を使用
取得データの参照方法
.
で参照可能
result = session.query(tbl_a).all()
result.id_a
result = session.query(tbl_b.id_b).all()
result.id_b
本記事で使うテーブルとモデル
モデルは,
テーブルのデータを Python で扱うために,
用意するクラスです
データ取得方法
今回は 2 つ取り上げます
1. query
モデルで定義したカラムを取得します
モデルの tbl_a
を取得する例がこちら
# カラムを指定しないで全てのカラムを取得
session.query(tbl_a).all()
# カラムを指定して全てのカラムを取得
session.query(
tbl_a.id_a,
tbl_a.name_a,
tbl_a.where_a,
).all()
2. execute と text
直接 SQL を書いてデータを取得する方法です
from sqlalchemy import text
# カラムを指定しないで全てのカラムを取得
session.execute(
text("SELECT * FROM tbl_a")
).all()
全件取得か1件取得か
データの取得方法には
all()
と first()
があります
取得データ(返り値)
取得の仕方によって,
model
で返ってくるか
sqlalchemy.engine.row.Row
で返って来ます
model.model.tbl_a
テーブルのデータを,
Python で扱えるように用意したクラスです
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class tbl_a(Base):
__tablename__ = "tbl_a"
id_a = Column(Integer, primary_key=True, index=True)
name_a = Column(String(100), nullable=True)
where_a = Column(String(100), nullable=True)
この型で返ってきます
各カラムのデータは .
で参照できます
result = session.query(tbl_a).first()
result.id_a # カラム「id_a」の値を参照できます
sqlalchemy.engine.row.Row
行のデータを表す,
Python の名前付きタプル (NamedTuple) に,
よく似ているタプルです
各カラムのデータは .
で参照できます
result = session.query(tbl_a.id_a).first()
result.id_a # カラム「id_a」の値を参照できます
WHEREとJOIN
WHERE
は filter()
,
JOIN
は join()
を使います
例で見ていきましょう
以下の結合をしたいとします
tbl_a
の where_a
が Yes
のデータと,
tbl_b
の where_b
が Yes
のデータを,
tbl_a
の id_a
と tbl_b
の id_a
で結合
SELECT
tbl_a.id_a, tbl_a.name_a, tbl_a.where_a,
tbl_b.id_b, tbl_b.id_a, tbl_b.name_b, tbl_b.where_b
FROM(
SELECT *
FROM tbl_a
WHERE tbl_a.where_a = 'Yes'
) AS tbl_a
INNER JOIN (
SELECT *
FROM tbl_b
WHERE tbl_b.where_b = 'Yes'
) AS tbl_b
ON tbl_a.id_a = tbl_b.id_a
query
,filter
,join
を使うとこうです
result = (
session.query(
tbl_a.id_a,
tbl_a.name_a,
tbl_a.where_a,
tbl_b.id_b,
tbl_b.id_a,
tbl_b.name_b,
tbl_b.where_b,
)
.filter(tbl_a.where_a == "Yes")
.filter(tbl_b.where_b == "Yes")
.join(
tbl_b,
tbl_a.id_a == tbl_b.id_a
)
.all()
)