switching from the prepared statements to parameterized statements

This commit is contained in:
Jon Haddad
2014-06-18 14:19:28 -07:00
parent 4cab5851f0
commit f02692ff27
5 changed files with 19 additions and 18 deletions

View File

@@ -9,7 +9,7 @@ class QueryValue(object):
be passed into .filter() keyword args
"""
format_string = ':{}'
format_string = '%({})s'
def __init__(self, value):
self.value = value

View File

@@ -101,7 +101,7 @@ class WhereClause(BaseClause):
def __unicode__(self):
field = ('"{}"' if self.quote_field else '{}').format(self.field)
return u'{} {} ?'.format(field, self.operator)
return u'{} {} {}'.format(field, self.operator, unicode(self.query_value))
def __hash__(self):
return super(WhereClause, self).__hash__() ^ hash(self.operator)
@@ -129,7 +129,7 @@ class AssignmentClause(BaseClause):
""" a single variable st statement """
def __unicode__(self):
return u'"{}" = ?'.format(self.field)
return u'"{}" = %({})s'.format(self.field, self.context_id)
def insert_tuple(self):
return self.field, self.context_id
@@ -170,15 +170,15 @@ class SetUpdateClause(ContainerUpdateClause):
qs = []
ctx_id = self.context_id
if self.previous is None and not (self._assignments or self._additions or self._removals):
qs += ['"{}" = ?'.format(self.field)]
qs += ['"{}" = %({})s'.format(self.field, ctx_id)]
if self._assignments:
qs += ['"{}" = ?'.format(self.field)]
qs += ['"{}" = %({})s'.format(self.field, ctx_id)]
ctx_id += 1
if self._additions:
qs += ['"{0}" = "{0}" + ?'.format(self.field)]
qs += ['"{0}" = "{0}" + %({1})s'.format(self.field, ctx_id)]
ctx_id += 1
if self._removals:
qs += ['"{0}" = "{0}" - ?'.format(self.field)]
qs += ['"{0}" = "{0}" - %({1})s'.format(self.field, ctx_id)]
return ', '.join(qs)
@@ -232,15 +232,15 @@ class ListUpdateClause(ContainerUpdateClause):
qs = []
ctx_id = self.context_id
if self._assignments is not None:
qs += ['"{}" = ?'.format(self.field)]
qs += ['"{}" = %({})s'.format(self.field, ctx_id)]
ctx_id += 1
if self._prepend:
qs += ['"{0}" = ? + "{0}"'.format(self.field)]
qs += ['"{0}" = %({1})s + "{0}"'.format(self.field, ctx_id)]
ctx_id += 1
if self._append:
qs += ['"{0}" = "{0}" + ?'.format(self.field)]
qs += ['"{0}" = "{0}" + %({})s'.format(self.field, ctx_id)]
return ', '.join(qs)
@@ -356,10 +356,10 @@ class MapUpdateClause(ContainerUpdateClause):
ctx_id = self.context_id
if self.previous is None and not self._updates:
qs += ['"int_map" = ?']
qs += ['"int_map" = %({})s']
else:
for _ in self._updates or []:
qs += ['"{}"[?] = ?'.format(self.field)]
qs += ['"{}"[%({})s] = %({})s'.format(self.field, ctx_id, ctx_id + 1)]
ctx_id += 2
return ', '.join(qs)
@@ -380,7 +380,7 @@ class CounterUpdateClause(ContainerUpdateClause):
def __unicode__(self):
delta = self.value - self.previous
sign = '-' if delta < 0 else '+'
return '"{0}" = "{0}" {1} ?'.format(self.field, sign)
return '"{0}" = "{0}" {1} %({})s'.format(self.field, sign, self.context_id)
class BaseDeleteClause(BaseClause):
@@ -428,7 +428,7 @@ class MapDeleteClause(BaseDeleteClause):
def __unicode__(self):
if not self._analyzed: self._analyze()
return ', '.join(['"{}"[?]'.format(self.field) for i in range(len(self._removals))])
return ', '.join(['"{}"[%({})s]'.format(self.field) for i in range(len(self._removals))])
class BaseCQLStatement(object):

View File

@@ -11,6 +11,6 @@ class BaseClauseTests(TestCase):
ctx = []
ss.set_context_id(10)
ss.update_context(ctx)
assert ctx == ['10': 'b']
assert ctx == {'10': 'b'}

View File

@@ -16,7 +16,7 @@ class UpdateStatementTests(TestCase):
us.add_assignment_clause(AssignmentClause('a', 'b'))
us.add_assignment_clause(AssignmentClause('c', 'd'))
us.add_where_clause(WhereClause('a', EqualsOperator(), 'x'))
self.assertEqual(unicode(us), 'UPDATE table SET "a" = ?, "c" = ? WHERE "a" = ?', unicode(us))
self.assertEqual(unicode(us), 'UPDATE table SET "a" = %(0)s, "c" = %(1)s WHERE "a" = %(2)s', unicode(us))
def test_context(self):
us = UpdateStatement('table')

View File

@@ -14,8 +14,9 @@ class TestWhereClause(TestCase):
""" tests that where clauses are rendered properly """
wc = WhereClause('a', EqualsOperator(), 'c')
wc.set_context_id(5)
self.assertEqual('"a" = ?', unicode(wc))
self.assertEqual('"a" = ?', str(wc))
self.assertEqual('"a" = %(5)s', unicode(wc), unicode(wc))
self.assertEqual('"a" = %(5)s', str(wc), type(wc))
def test_equality_method(self):
""" tests that 2 identical where clauses evaluate as == """