0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【sqlalchemy】データ取得方法と返り値(SELECT, WHERE, JOIN)

Posted at

これは何の記事

以下をまとめました

  • sqlalchemy でデータを取得する方法
  • SELECTWHEREJOIN の扱い方
  • 取得データの参照方法

早めの結論

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

本記事で使うテーブルとモデル

table.png

モデルは,
テーブルのデータを Python で扱うために,
用意するクラスです

model.png

データ取得方法

今回は 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() があります

all_and_first.png

取得データ(返り値)

取得の仕方によって,
model で返ってくるか
sqlalchemy.engine.row.Row で返って来ます
取得データ.png

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

WHEREfilter()
JOINjoin() を使います

例で見ていきましょう
以下の結合をしたいとします

tbl_awhere_aYes のデータと,
tbl_bwhere_bYes のデータを,
tbl_aid_atbl_bid_a で結合

filter_join.png

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

queryfilterjoin を使うとこうです

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()
    )
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?