diff options
author | Daniele Varrazzo <daniele.varrazzo@gmail.com> | 2018-10-23 01:56:17 +0100 |
---|---|---|
committer | Daniele Varrazzo <daniele.varrazzo@gmail.com> | 2018-10-23 01:56:17 +0100 |
commit | 25e6d011ac856a0df0483bc0ec935ec259aa8eb6 (patch) | |
tree | 291035eff1db8e5d4e3fc2af560cd7dc7e5bb07f | |
parent | 1de7d53fb1cc0163f24e2b8bcf3e6bab0e1072d4 (diff) | |
parent | eeef58b5812f6167dccbaee67fbc88429cdbb784 (diff) | |
download | psycopg2-25e6d011ac856a0df0483bc0ec935ec259aa8eb6.tar.gz |
Merge branch 'fix-794' into maint_2_7
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | lib/extras.py | 4 | ||||
-rwxr-xr-x | tests/test_fast_executemany.py | 20 |
3 files changed, 26 insertions, 0 deletions
@@ -10,6 +10,8 @@ What's new in psycopg 2.7.6 - Fixed hang trying to :sql:`COPY` via `~cursor.execute()` (:ticket:`#781`). - Fixed segfault accessing the `connection.readonly` and `connection.deferrable` repeatedly (:ticket:`#790`). +- `~psycopg2.extras.execute_values()` accepts `~psycopg2.sql.Composable` + objects (#794). - `~psycopg2.errorcodes` map updated to PostgreSQL 11. diff --git a/lib/extras.py b/lib/extras.py index 4bb3a48..c33cffc 100644 --- a/lib/extras.py +++ b/lib/extras.py @@ -1259,6 +1259,10 @@ def execute_values(cur, sql, argslist, template=None, page_size=100): [(1, 20, 3), (4, 50, 6), (7, 8, 9)]) ''' + from psycopg2.sql import Composable + if isinstance(sql, Composable): + sql = sql.as_string(cur) + # we can't just use sql % vals because vals is bytes: if sql is bytes # there will be some decoding error because of stupid codec used, and Py3 # doesn't implement % on bytes. diff --git a/tests/test_fast_executemany.py b/tests/test_fast_executemany.py index ad7a5b1..3a4f3cb 100755 --- a/tests/test_fast_executemany.py +++ b/tests/test_fast_executemany.py @@ -83,6 +83,16 @@ class TestExecuteBatch(FastExecuteTestMixin, testutils.ConnectingTestCase): cur.execute("select id, val from testfast order by id") self.assertEqual(cur.fetchall(), [(i, i * 10) for i in range(1000)]) + def test_composed(self): + from psycopg2 import sql + cur = self.conn.cursor() + psycopg2.extras.execute_batch(cur, + sql.SQL("insert into {0} (id, val) values (%s, %s)") + .format(sql.Identifier('testfast')), + ((i, i * 10) for i in range(1000))) + cur.execute("select id, val from testfast order by id") + self.assertEqual(cur.fetchall(), [(i, i * 10) for i in range(1000)]) + def test_pages(self): cur = self.conn.cursor() psycopg2.extras.execute_batch(cur, @@ -169,6 +179,16 @@ class TestExecuteValues(FastExecuteTestMixin, testutils.ConnectingTestCase): cur.execute("select id, val from testfast order by id") self.assertEqual(cur.fetchall(), [(i, i * 10) for i in range(1000)]) + def test_composed(self): + from psycopg2 import sql + cur = self.conn.cursor() + psycopg2.extras.execute_values(cur, + sql.SQL("insert into {0} (id, val) values %s") + .format(sql.Identifier('testfast')), + ((i, i * 10) for i in range(1000))) + cur.execute("select id, val from testfast order by id") + self.assertEqual(cur.fetchall(), [(i, i * 10) for i in range(1000)]) + def test_pages(self): cur = self.conn.cursor() psycopg2.extras.execute_values(cur, |