summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorShai Berger <shai@platonix.com>2013-06-28 06:15:03 +0300
committerShai Berger <shai@platonix.com>2013-06-28 06:59:10 +0300
commitd097417025e71286ad5bbde6e0a79caacabbbd64 (patch)
tree007c58c8787cee32cf68d08683b7c5294e8a4ad1 /tests
parent7c0b72a826a3637b30a57553ac83f6b913c33134 (diff)
Support 'pyformat' style parameters in raw queries, Refs #10070
Add support for Oracle, fix an issue with the repr of RawQuerySet, add tests and documentations. Also added a 'supports_paramstyle_pyformat' database feature, True by default, False for SQLite. Thanks Donald Stufft for review of documentation.
Diffstat (limited to 'tests')
-rw-r--r--tests/backends/tests.py44
-rw-r--r--tests/raw_query/tests.py21
2 files changed, 61 insertions, 4 deletions
diff --git a/tests/backends/tests.py b/tests/backends/tests.py
index c6cad56ec1..c1a26df7fc 100644
--- a/tests/backends/tests.py
+++ b/tests/backends/tests.py
@@ -456,13 +456,24 @@ class SqliteChecks(TestCase):
class BackendTestCase(TestCase):
def create_squares_with_executemany(self, args):
+ self.create_squares(args, 'format', True)
+
+ def create_squares(self, args, paramstyle, multiple):
cursor = connection.cursor()
opts = models.Square._meta
tbl = connection.introspection.table_name_converter(opts.db_table)
f1 = connection.ops.quote_name(opts.get_field('root').column)
f2 = connection.ops.quote_name(opts.get_field('square').column)
- query = 'INSERT INTO %s (%s, %s) VALUES (%%s, %%s)' % (tbl, f1, f2)
- cursor.executemany(query, args)
+ if paramstyle=='format':
+ query = 'INSERT INTO %s (%s, %s) VALUES (%%s, %%s)' % (tbl, f1, f2)
+ elif paramstyle=='pyformat':
+ query = 'INSERT INTO %s (%s, %s) VALUES (%%(root)s, %%(square)s)' % (tbl, f1, f2)
+ else:
+ raise ValueError("unsupported paramstyle in test")
+ if multiple:
+ cursor.executemany(query, args)
+ else:
+ cursor.execute(query, args)
def test_cursor_executemany(self):
#4896: Test cursor.executemany
@@ -491,6 +502,35 @@ class BackendTestCase(TestCase):
self.create_squares_with_executemany(args)
self.assertEqual(models.Square.objects.count(), 9)
+ @skipUnlessDBFeature('supports_paramstyle_pyformat')
+ def test_cursor_execute_with_pyformat(self):
+ #10070: Support pyformat style passing of paramters
+ args = {'root': 3, 'square': 9}
+ self.create_squares(args, 'pyformat', multiple=False)
+ self.assertEqual(models.Square.objects.count(), 1)
+
+ @skipUnlessDBFeature('supports_paramstyle_pyformat')
+ def test_cursor_executemany_with_pyformat(self):
+ #10070: Support pyformat style passing of paramters
+ args = [{'root': i, 'square': i**2} for i in range(-5, 6)]
+ self.create_squares(args, 'pyformat', multiple=True)
+ self.assertEqual(models.Square.objects.count(), 11)
+ for i in range(-5, 6):
+ square = models.Square.objects.get(root=i)
+ self.assertEqual(square.square, i**2)
+
+ @skipUnlessDBFeature('supports_paramstyle_pyformat')
+ def test_cursor_executemany_with_pyformat_iterator(self):
+ args = iter({'root': i, 'square': i**2} for i in range(-3, 2))
+ self.create_squares(args, 'pyformat', multiple=True)
+ self.assertEqual(models.Square.objects.count(), 5)
+
+ args = iter({'root': i, 'square': i**2} for i in range(3, 7))
+ with override_settings(DEBUG=True):
+ # same test for DebugCursorWrapper
+ self.create_squares(args, 'pyformat', multiple=True)
+ self.assertEqual(models.Square.objects.count(), 9)
+
def test_unicode_fetches(self):
#6254: fetchone, fetchmany, fetchall return strings as unicode objects
qn = connection.ops.quote_name
diff --git a/tests/raw_query/tests.py b/tests/raw_query/tests.py
index e404c8b065..7242b8309b 100644
--- a/tests/raw_query/tests.py
+++ b/tests/raw_query/tests.py
@@ -3,7 +3,7 @@ from __future__ import absolute_import
from datetime import date
from django.db.models.query_utils import InvalidQuery
-from django.test import TestCase
+from django.test import TestCase, skipUnlessDBFeature
from .models import Author, Book, Coffee, Reviewer, FriendlyAuthor
@@ -123,10 +123,27 @@ class RawQueryTests(TestCase):
query = "SELECT * FROM raw_query_author WHERE first_name = %s"
author = Author.objects.all()[2]
params = [author.first_name]
- results = list(Author.objects.raw(query, params=params))
+ qset = Author.objects.raw(query, params=params)
+ results = list(qset)
self.assertProcessed(Author, results, [author])
self.assertNoAnnotations(results)
self.assertEqual(len(results), 1)
+ self.assertIsInstance(repr(qset), str)
+
+ @skipUnlessDBFeature('supports_paramstyle_pyformat')
+ def testPyformatParams(self):
+ """
+ Test passing optional query parameters
+ """
+ query = "SELECT * FROM raw_query_author WHERE first_name = %(first)s"
+ author = Author.objects.all()[2]
+ params = {'first': author.first_name}
+ qset = Author.objects.raw(query, params=params)
+ results = list(qset)
+ self.assertProcessed(Author, results, [author])
+ self.assertNoAnnotations(results)
+ self.assertEqual(len(results), 1)
+ self.assertIsInstance(repr(qset), str)
def testManyToMany(self):
"""