【Python】SQLAlchemy データの更新(Insert, Update, Delete)

Python

はじめに

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の使用方法は以下で解説しています。

タイトルとURLをコピーしました