SQLAlchemy INSERT 実行時の挿入行数

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) で取得できるはずだ。