前提
次のクラスをテーブルのための例とする.
class Books(Base): |
SQLのSELECT文の作り方
SQLAlchemyではレコードの選択をquery
で行い,絞り込んだ上でall
等により抽出する.
ここで,filter
はSQLのWHERE
句に相当する.
セッション名.query(取り出したいもの).filter(絞り込み条件).抽出方法 |
抽出するレコードの量による抽出方法の違い
all
all
は複数ヒットするものに使う.
次の例は,1000円以上の書籍の品番と名前を抽出する.
session.query(Books.id, Books.title).filter(Books.price >= 1000).all() |
first
first
は1行に決まるケースで使う.
次の例は,重複しない品番から書籍情報を抽出する.
session.query(Books).filter(Books.id == 'A123').first() |
scalar
scalar
は1つの値に決まるケースで使う.
次の例は,ある品番の書籍情報のうち,価格だけを抽出する.
session.query(Books.price).filter(Books.id == 'A123').scalar() |
DISTINCT
distinct
で重複を取り除くことができる.
次は,1000円以上の書籍の価格のリスト.
session.query(distinct(Books.price)).filter(Books.price >= 1000).all() |
ORDER BY・LIMIT
価格が高いものから5件を抽出するなら,order_by
とlimit
を使って次のようにする.
from sqlalchemy import desc |
絞り込み条件(filter)
AND・OR・NOT
and_
,or_
,not_
を使う.
次は1000円以上でフラグがFalseの書籍を抽出する例.
from sqlalchemy import and_, or_, not_ |
LIKE
like
を使う.
次は「ネコ」で始まる書名の書籍を抽出する例.
session.query(Books).filter(Books.title.like("ネコ%").all() |
BETWEEN
between
を使う.
次は価格が1000円から2000円の書籍を抽出する例.
session.query(Books).filter(Books.price.between(1000, 2000)).all() |
IN
in_
を使う.
次は1000円か1200円の価格である書籍を抽出する.
session.query(Books).filter(Books.price.in_[1000, 1200]).all() |
SQLAlchemyの使用例.
インストール
pip
からのインストールは次のようにして行う.
pip install SQLAlchemy |
エンジン
接続情報を与える.
次はPostgreSQLに5432ポートで接続する情報の記述例.
from sqlalchemy import create_engine |
セッション
エンジンからセッションを作成する.
with
でセッションを使っている間にエラーが生じなければコミット,生じたらロールバックするつもりで予め準備しておく.
from sqlalchemy.orm import sessionmaker |
テーブル
データベース処理用のクラスを作って,それを継承する.
ここではBooks
というクラスを作り,データベースのbooks
というテーブルにアクセスするようにした.
テーブル内の列はColumn
で定義する.
from sqlalchemy.orm import declarative_base |
ここで主キー制約を与えるのにprimary_key
を使用した.
非Null制約にはnullable
,一意制約にはunique
を使う.
追加(SQLのINSERT)
追加したいレコードのインスタンスを作る.
book = Books() |
データベースに接続してadd
する.
with Session() as session: |
抽出(SQLのSELECT)
レコードの選択をquery
で行い,絞り込んだ上でall
等により抽出する.
ここで,filter
はSQLのWHERE
句に相当する.
セッション.query(取り出したいもの).filter(絞り込み条件).all() |
次の例では,1000円以上の書籍の品番と名前を抽出する.
with Session() as session: |
更新(SQLのUPDATE)
data
に格納したレコードの更新は次のように行う.
次の例では,抽出したレコードについてflag
列をTrue
に更新する.
with Session() as session: |
削除(SQLのDELETE)
delete
で削除が実行できる.
with Session() as session: |