はじめに
PythonのORMであるSQLAlchemyを用いてデータの更新(Insert,Update,Delete)を行う方法について解説します。
SQLAlchemyを使ってデータの更新をしてみよう!
SQL文を全く書かずにデータのInsertやDeleteができるようになるにゃ!
前準備
まずはエンジンオブジェクトの作成からSessionの作成まで行います。
なお、このサンプルではデータベースはSQLiteを使用します。
rom sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# エンジンオブジェクトの作成
eng = create_engine('sqlite:///Test.db')
# ベースクラスの作成
base = declarative_base()
# モデルクラスの作成
class test_data(base):
__tablename__ = 'test_data'
id = Column(Integer, primary_key=True)
name = Column(String(255))
price = Column(Integer)
# Sessionの作成
mak = sessionmaker(bind=eng)
ses = mak()
この部分の詳しい解説については下記の記事を御覧ください。
テーブルの作成
前準備で記載したコードに下記を追記します。
モデルクラスからテーブルを作成する事ができます。
今回準備したモデルクラスはtest_dataの一つだけですが、複数のモデルクラスを予め準備しておけば
下記のcreate_allで準備したモデルクラスのテーブルが一括作成されます。
# テーブル作成
base.metadata.create_all(eng)
Insertの方法
テーブルにデータを追加してみるにゃ!
インスタンスを作成して、登録したい値をセットして、Sessionに追加する。
これだけで1レコード作成されます。
最後にcommitするのを忘れないようにしましょう。
test = test_data()
test.name = 'アイス'
test.price = 280
ses.add(test)
ses.commit()
下記のように1行で記載することもできます。
また、複数のデータを追加する際にコミットは最後に1回実行するだけ一括登録できます。
ses.add(test_data(name='ケーキ',price=350))
ses.add(test_data(name='パフェ',price=780))
ses.commit()
ここまでで、テーブルには下記のように3レコード登録されました。
なお、データの確認はDB Browser for SQLiteを使用しています。詳細は下記で解説しています。
VSCodeをお使いの場合は、SQLiteの拡張機能をインストールすることで、VSCode上でデータの内容を確認できます。
Updateの方法
次は既存レコードの内容を更新してみるにゃ。
test = ses.query(test_data).filter(test_data.id==3).first()
test.price = 850
ses.commit()
上記ではIDが3のレコードに対してpriceを850に変更しています。
Insertと同様commitを書かないと更新されません。
filterに記載した条件に一致するレコードがなければnoneを返します。
そのまま処理を実行するとエラーになるので注意が必要です。
test = ses.query(test_data).filter(test_data.id==99).first()
test.price = 850 #ここでエラー
複数のレコードを更新することもできます。
from sqlalchemy import or_
tests = ses.query(test_data).filter(or_(test_data.id==1, test_data.id==2)).all()
for test in tests:
test.price = 410
ses.commit()
IDが1もしくは2のレコードのpriceを410にしています。
このようなOR条件を使用するためにはor_のインポートが必要です。
Deleteの方法
レコードを削除するには、filterで削除したいレコードを抽出して、deleteを記載するんだ。
ses.query(test_data).filter(test_data.id==5).delete()
ses.commit()
SessionのClose
使い終わったSessionはクローズするにゃ。
ses.close()
おわりに
SQLAlchemyを使用してSQL文を全く意識せず、データの更新ができました。
最後まで読んでくれてありがとうにゃあ。
Joinの使用方法は以下で解説しています。