From 08c46eea924d23a234bf3feea1a928eb8ae8a00a Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 17 Apr 2020 10:55:08 -0400 Subject: ORM executemany returning Build on #5401 to allow the ORM to take advanage of executemany INSERT + RETURNING. Implemented the feature updated tests to support INSERT DEFAULT VALUES, needed to come up with a new syntax for compiler INSERT INTO table (anycol) VALUES (DEFAULT) which can then be iterated out for executemany. Added graceful degrade to plain executemany for PostgreSQL <= 8.2 Renamed EXECUTEMANY_DEFAULT to EXECUTEMANY_PLAIN Fix issue where unicode identifiers or parameter names wouldn't work with execute_values() under Py2K, because we have to encode the statement and therefore have to encode the insert_single_values_expr too. Correct issue from #5401 to support executemany + return_defaults for a PK that is explicitly pre-generated, meaning we aren't actually getting RETURNING but need to return it from compiled_parameters. Fixes: #5263 Change-Id: Id68e5c158c4f9ebc33b61c06a448907921c2a657 --- test/sql/test_insert.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'test/sql') diff --git a/test/sql/test_insert.py b/test/sql/test_insert.py index c7749e74c..e5f2fbe6d 100644 --- a/test/sql/test_insert.py +++ b/test/sql/test_insert.py @@ -936,11 +936,25 @@ class EmptyTest(_InsertTestBase, fixtures.TablesTest, AssertsCompiledSQL): dialect = default.DefaultDialect() dialect.supports_empty_insert = dialect.supports_default_values = True - stmt = table1.insert().values({}) # hide from 2to3 + stmt = table1.insert().values({}) self.assert_compile( stmt, "INSERT INTO mytable DEFAULT VALUES", dialect=dialect ) + def test_supports_empty_insert_true_executemany_mode(self): + table1 = self.tables.mytable + + dialect = default.DefaultDialect() + dialect.supports_empty_insert = dialect.supports_default_values = True + + stmt = table1.insert().values({}) + self.assert_compile( + stmt, + "INSERT INTO mytable (myid) VALUES (DEFAULT)", + dialect=dialect, + for_executemany=True, + ) + def test_supports_empty_insert_false(self): table1 = self.tables.mytable -- cgit v1.2.1