SQLAlchemyとは
直接SQL文を記述しなくてもデータベースを操作することができるライブラリー
ORM(Object-Relational Mapping)
SQLAlchemyのように、データベースとオブジェクトを関連付けるもの。コードでデータベースを操作できるもの。
ORマッパーともいう。
クエリとは
SQL文のことでデータベースを操作するSELECTなどのことを言う
セッションとは
データベースとある一定の期間の間おこなう連続した操作のこと。
セッションが始まると関連する操作や対話が同じつながりや状態の中で行われ、セッションが終了すると接続も終わります。
①SELECTの操作の流れ
①ベースモデルの作成(モデルの作成)
Base = declarative_base()
読み込めばベースを作成してくれる。モデルを初期化して変数に入れている
これは決まった定型文
②モデルの作成(クラス定義)
class User(Base):
__tablename__ = 'users' # Userクラス ←→ usersテーブル
# 変数名 ←→ カラム名
id = Column(Integer, primary_key=True)
name = Column(String)
kana = Column(String)
note = Column(String)
※ベースモデルを作成してからここまでがモデル
ベースモデルを引数にとり、クラスを定義してデータベースの名前やカラムの設定を行う
③エンジンの作成
engine = create_engine('sqlite:///db/sql_training.sqlite')
データベースへの接続を行う部分で、主にデータベースのURLを記述して変数に入れる
④セッションオブジェクトの作成
Session = sessionmaker(bind=engine)
sessionmaker()がファクトリ関数(何かを作り出す関数)でbind=でデータベースの接続先を指定する
セッションのオブジェクトを作成している。
session = Session()
オブジェクトを初期化して、変数に代入しているここも定型文なので覚えたほうがいい
⑤SELECT * FROM user が内部で実行される
for user in session.query(User).all():
print(user.name, user.kana)
解説
・session.query(User)
SELECT users.id, users.name, users.kana, users.note FROM usersというSQLに変換されます。
session.query = select となる
・session.query(User).all()
Userクラスの全てのオブジェクトのリストを返します。
・リストの各要素に対して user.name や user.kana とすることでデータを取得できます。
WHERE句 filter_by(a = b)
・filter_by() を使ってキーワードと対象の値が等しいか比較できます。
# SELECT * FROM items WHERE itemcode = '2000A-NV' LIMIT 1
item_1 = session.query(Item).filter_by(itemcode='2000A-NV').first()
print(item_1.itemcode, item_1.name)
AND filter_by(a, b)
・filter_by() の中にカンマ区切りで条件を書くと AND になります。
・.filter_by(maker_id=1).filter_by(price=2500) と複数の filter_by() を結合しても同じ意味です。
# SELECT * FROM items WHERE maker_id=1 AND price=2500 LIMIT 1
item_2 = session.query(Item).filter_by(maker_id=1, price=2500).first()
print(item_2.itemcode, item_2.price, item_2.maker_id)
比較 filter()
・filter_by()ですと、完全一致しか比較できません。
・条件式を指定する場合には、 filter() を使って条件の内容を記述します。
# SELECT * FROM items WHERE price < 500 LIMIT 1
item_3 = session.query(Item).filter(Item.price < 500).first()
print(item_3.itemcode, item_3.price)
IN句
・in_関数を使います。
・inがPythonの予約語になっているため、末尾にアンダースコア(_)がついています。
# SELECT * FROM items WHERE price IN (660,670)
items_1 = session.query(Item).filter(Item.price.in_([660,670])).all()
for v in items_1:
print(v.itemcode, v.price)
filterを繋げるだけで複雑な条件が書ける
SQLAlchemyは、filter関数の中に色々な条件を書けます。
・LIKE
filter(Item.itemcode.like('%A%'))
・BETWEEN
Item.price.between(1000, 2000)
・ORDER BY
order_by(Item.itemcode.asc()) # desc() で降順
・OR
filter(or_(Item.price==500, Item.price==600))
※ SQLAlchemyでORを使う場合、or_メソッドのインポートが必要です
or_ の利用例
from sqlalchemy import or_
items = session.query(Item).filter(
or_(Item.price==500, Item.price==600))
for v in items:
print(v.itemcode, v.price)
filter関数を繋げて複数の条件を指定する
このプログラムでは itemcode に A を含み、 name が てぶくろ から始まるレコードを取得しています。
items = session.query(Item).filter(
Item.itemcode.like('%A%')).filter(Item.name.like('てぶくろ%'))
for v in items:
print(v.itemcode, v.name)
order_byメソッドについて
order_byの引数は、SQLのORDER BYと同じく、複数項目を指定できます。
下記の指定では、Item.priceで昇順にソートします。Item.priceの値が同じ場合はItem.itemcodeで昇順にソートします。
order_by(Item.price.asc(), Item.itemcode.asc())
INSERT、UPDATE、DELETE文の書き方は以下のURL