SQL generation fix to handle IN operation for one value lists

This commit is contained in:
Lex Berezhny 2020-02-12 10:31:27 -05:00
parent 1190a60c7a
commit dcb1b64696
2 changed files with 23 additions and 7 deletions

View file

@ -134,11 +134,15 @@ def constraints_to_sql(constraints, joiner=' AND ', prepend_key=''):
col, op = col[:-len('__not_like')], 'NOT LIKE' col, op = col[:-len('__not_like')], 'NOT LIKE'
elif key.endswith('__in') or key.endswith('__not_in'): elif key.endswith('__in') or key.endswith('__not_in'):
if key.endswith('__in'): if key.endswith('__in'):
col, op = col[:-len('__in')], 'IN' col, op, one_val_op = col[:-len('__in')], 'IN', '='
else: else:
col, op = col[:-len('__not_in')], 'NOT IN' col, op, one_val_op = col[:-len('__not_in')], 'NOT IN', '!='
if constraint: if constraint:
if isinstance(constraint, (list, set, tuple)): if isinstance(constraint, (list, set, tuple)):
if len(constraint) == 1:
values[f'{key}{tag}'] = constraint[0]
sql.append(f'{col} {one_val_op} :{key}{tag}')
else:
keys = [] keys = []
for i, val in enumerate(constraint): for i, val in enumerate(constraint):
keys.append(f':{key}{tag}_{i}') keys.append(f':{key}{tag}_{i}')

View file

@ -98,6 +98,12 @@ class TestQueryBuilder(unittest.TestCase):
'txo_name__in0_1': 'def456' 'txo_name__in0_1': 'def456'
}) })
) )
self.assertTupleEqual(
constraints_to_sql({'txo.name__in': ('abc123',)}),
('txo.name = :txo_name__in0', {
'txo_name__in0': 'abc123',
})
)
self.assertTupleEqual( self.assertTupleEqual(
constraints_to_sql({'txo.age__in': 'SELECT age from ages_table'}), constraints_to_sql({'txo.age__in': 'SELECT age from ages_table'}),
('txo.age IN (SELECT age from ages_table)', {}) ('txo.age IN (SELECT age from ages_table)', {})
@ -118,6 +124,12 @@ class TestQueryBuilder(unittest.TestCase):
'txo_name__not_in0_1': 'def456' 'txo_name__not_in0_1': 'def456'
}) })
) )
self.assertTupleEqual(
constraints_to_sql({'txo.name__not_in': ('abc123',)}),
('txo.name != :txo_name__not_in0', {
'txo_name__not_in0': 'abc123',
})
)
self.assertTupleEqual( self.assertTupleEqual(
constraints_to_sql({'txo.age__not_in': 'SELECT age from ages_table'}), constraints_to_sql({'txo.age__not_in': 'SELECT age from ages_table'}),
('txo.age NOT IN (SELECT age from ages_table)', {}) ('txo.age NOT IN (SELECT age from ages_table)', {})