Modified: trunk/pg.py (955 => 956)
--- trunk/pg.py 2019-01-03 22:52:19 UTC (rev 955)
+++ trunk/pg.py 2019-01-04 11:29:11 UTC (rev 956)
@@ -1869,16 +1869,18 @@
return self.query(*self.adapter.format_query(
command, parameters, types, inline))
- def query_prepared(self, name=None, *args):
+ def query_prepared(self, *args, **kwargs):
"""Execute a prepared SQL statement.
- This works like the query() method, but you need to pass the name of
- a prepared statement that you have already created with prepare().
- If you pass no parameters or pass an empty name, then the unnamed
- statement will be executed if you created one before.
+ This works like the query() method, except that instead of passing
+ the SQL command, you pass the name of a prepared statement via
+ the keyword-only argument `name`. If you don't pass a name, the
+ unnamed statement will be executed, if you created one before.
"""
if not self.db:
raise _int_error('Connection is not valid')
+ # use kwargs because Python 2 does not support keyword-only arguments
+ name = kwargs.get('name')
if name is None:
name = ''
if args:
@@ -1911,8 +1913,8 @@
"""Describe a prepared SQL statement.
This method returns a Query object describing the result columns of
- the prepared statement with the given name. If you do not specify a
- name, then the unnamed statement will be described if you created one.
+ the prepared statement with the given name. If you omit the name,
+ the unnamed statement will be described if you created one before.
"""
if name is None:
name = ''
Modified: trunk/tests/test_classic_dbwrapper.py (955 => 956)
--- trunk/tests/test_classic_dbwrapper.py 2019-01-03 22:52:19 UTC (rev 955)
+++ trunk/tests/test_classic_dbwrapper.py 2019-01-04 11:29:11 UTC (rev 956)
@@ -985,34 +985,36 @@
self.assertIsNone(p("select null", name=''))
def testQueryPreparedWithoutParams(self):
+ f = self.db.query_prepared
+ self.assertRaises(pg.OperationalError, f, 'q')
p = self.db.prepare
- p("select 17", 'q1')
- p("select 42", 'q2')
- f = self.db.query_prepared
- r = f('q1').getresult()[0][0]
+ p("select 17", name='q1')
+ p("select 42", name='q2')
+ r = f(name='q1').getresult()[0][0]
self.assertEqual(r, 17)
- r = f('q2').getresult()[0][0]
+ r = f(name='q2').getresult()[0][0]
self.assertEqual(r, 42)
def testQueryPreparedWithParams(self):
p = self.db.prepare
- p("select 1 + $1 + $2 + $3", 'sum')
- p("select initcap($1) || ', ' || $2 || '!'", 'cat')
+ p("select 1 + $1 + $2 + $3", name='sum')
+ p("select initcap($1) || ', ' || $2 || '!'", name='cat')
f = self.db.query_prepared
- r = f('sum', 2, 3, 5).getresult()[0][0]
+ r = f(2, 3, 5, name='sum').getresult()[0][0]
self.assertEqual(r, 11)
- r = f('cat', 'hello', 'world').getresult()[0][0]
+ r = f('hello', 'world', name='cat').getresult()[0][0]
self.assertEqual(r, 'Hello, world!')
def testQueryPreparedUnnamedWithOutParams(self):
+ f = self.db.query_prepared
+ self.assertRaises(pg.OperationalError, f)
p = self.db.prepare
p("select 'no name'")
- f = self.db.query_prepared
r = f().getresult()[0][0]
self.assertEqual(r, 'no name')
- r = f(None).getresult()[0][0]
+ r = f(name=None).getresult()[0][0]
self.assertEqual(r, 'no name')
- r = f('').getresult()[0][0]
+ r = f(name='').getresult()[0][0]
self.assertEqual(r, 'no name')
def testQueryPreparedUnnamedWithParams(self):
@@ -1019,10 +1021,12 @@
p = self.db.prepare
p("select 1 + $1 + $2")
f = self.db.query_prepared
- r = f(None, 2, 3).getresult()[0][0]
+ r = f(2, 3).getresult()[0][0]
self.assertEqual(r, 6)
- r = f('', 2, 3).getresult()[0][0]
+ r = f(2, 3, name=None).getresult()[0][0]
self.assertEqual(r, 6)
+ r = f(2, 3, name='').getresult()[0][0]
+ self.assertEqual(r, 6)
def testDescribePrepared(self):
self.db.prepare("select 1 as first, 2 as second", 'count')