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