[Sqlalchemy-tickets] Issue #3863: Bulk save doesn't executemany() when model kwargs are different (
Brought to you by:
zzzeek
From: Antoine C. <iss...@bi...> - 2016-11-29 13:11:26
|
New issue 3863: Bulk save doesn't executemany() when model kwargs are different https://bitbucket.org/zzzeek/sqlalchemy/issues/3863/bulk-save-doesnt-executemany-when-model Antoine Catton: Let's consider this dialect in `test.py`: ``` #!python import sqlalchemy as sa from sqlalchemy.dialects import registry from sqlalchemy.dialects.sqlite.pysqlite import SQLiteDialect_pysqlite from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker class CustomSQLiteDialect(SQLiteDialect_pysqlite): def do_executemany(self, cursor, statement, parameters, context=None): print("executemany(): statement={s!r}, params={p!r}".format(s=statement, p=parameters)) super(CustomSQLiteDialect, self).do_executemany(cursor, statement, parameters, context) def do_execute(self, cursor, statement, parameters, context=None): print("EXECUTE!!(): statement={s!r}, params={p!r}".format(s=statement, p=parameters)) super(CustomSQLiteDialect, self).do_execute(cursor, statement, parameters, context) ``` And this model: ``` #!python Base = declarative_base() class Model(Base): __tablename__ = 'model' id = sa.Column(sa.Integer, primary_key=True) foo = sa.Column(sa.String, default='foo') bar = sa.Column(sa.String, default='bar') ``` And run the code: ``` #!python registry.register("sqlite.custom", "test", "CustomSQLiteDialect") if __name__ == '__main__': engine = sa.create_engine('sqlite+custom:///:memory:') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() bulk1 = [Model(foo='a', bar='b'), Model(foo='c', bar='d')] print("== Saving first bulk:") session.bulk_save_objects(bulk1) bulk2 = [Model(foo='a'), Model(bar='b')] print("== Saving second bulk:") session.bulk_save_objects(bulk2) ``` Here's the output: ``` EXECUTE!!(): statement=u"SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1", params=() EXECUTE!!(): statement=u"SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1", params=() EXECUTE!!(): statement=u'PRAGMA table_info("model")', params=() EXECUTE!!(): statement=u'\nCREATE TABLE model (\n\tid INTEGER NOT NULL, \n\tfoo VARCHAR, \n\tbar VARCHAR, \n\tPRIMARY KEY (id)\n)\n\n', params=() == Saving first bulk: executemany(): statement=u'INSERT INTO model (foo, bar) VALUES (?, ?)', params=(('a', 'b'), ('c', 'd')) == Saving second bulk: EXECUTE!!(): statement=u'INSERT INTO model (foo, bar) VALUES (?, ?)', params=('a', 'bar') EXECUTE!!(): statement=u'INSERT INTO model (foo, bar) VALUES (?, ?)', params=('foo', 'b') ``` I don't see a reason why the second bulk should do many `execute()`. |