sqlalchemy.engine.cursor.CursorResult から、rowcount を参照する
database.py : DB接続セッションを提供する
from sqlalchemy import create_engine from sqlalchemy.orm import Session from contextlib import contextmanager from sqlalchemy.orm import declarative_base import sqlalchemy as db #--- データベース接続情報 ---- host = 'localhost' port = 5432 username = 'sample' password = '2e8Wrxy' dbname = 'togou' engine = create_engine(f'postgresql://{username}:{password}@{host}:{port}/{dbname}') #------------------------------------------------ # getSession:セッション取得 # @contextmanager def getSession(transaction: bool=False)->Session: session = Session(autocommit=False, autoflush=True, bind=engine) if transaction: try: yield session session.commit() except: session.rollback() raise finally: session.close() else: try: yield session except: raise finally: session.close()
CursorResult から挿入行数を求める
import database from sqlalchemy import text with database.getSession(True) as session: sql = """ INSERT INTO itemwork (id, user_name, task_name, point) SELECT id, user_name, task_name, point FROM items WHERE point > :point """ res = session.execute(text(sql).params(point=0)) print('res.count = %d' % res.rowcount)
バルクインサートを使用した時、
itemdto.py :格納先テーブルエンティティ定義
import sqlalchemy as db from sqlalchemy.orm import declarative_base import datetime class Itemwork(declarative_base()): __tablename__ = 'itemwork' id = db.Column(db.INT, nullable=False, primary_key=True) user_name = db.Column(db.String(120), nullable=False) task_name = db.Column(db.String(60), nullable=False) point = db.Column(db.INT, nullable=True) create_time = db.Column(db.TIMESTAMP, nullable=False) def __init__(self,id:int, user_name:str, task_name:str, point:int, create_time=datetime.datetime.now()): self.id = id self.user_name = user_name self.task_name = task_name self.point = point self.create_time = create_time
bulk_save_objects の使用
import database from itemdto import Itemwork with database.getSession(True) as session: itemlist = [] itemlist.append(Itemwork(4, 'kyouko', 'A01', 100)) itemlist.append(Itemwork(5, 'kaoru', 'A02', 130)) itemlist.append(Itemwork(6, 'maria', 'B01', 120)) res = session.bulk_save_objects(itemlist, True) # insert 結果は返らない⇒ None が返る print(res)
bulk_save_objects の実行結果はなにも返さない。
そもそも実行時に、挿入対象リストを渡すのでINSERTした行数は、
その挿入対象リストであるはずで、len(itemlist) で取得できるはずだ。