diff --git a/setup.py b/setup.py index 712d46b..4474c61 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ # encoding: utf-8 from distutils.core import setup from setuptools import find_packages +import sqlquerybuilder setup( name='sqlquerybuilder', @@ -8,6 +9,7 @@ setup( author='José Sánchez Moreno', author_email='jose@o2w.es', packages=find_packages(), + test_suite="tests", license='MIT', description=u'SQL Query Builder inspired on django ORM Syntax', long_description=open('README.rst').read(), @@ -22,6 +24,7 @@ setup( 'Operating System :: Microsoft :: Windows', 'Operating System :: POSIX', 'Programming Language :: Python', + 'Programming Language :: SQL', ], ) diff --git a/sqlquerybuilder/__init__.py b/sqlquerybuilder/__init__.py index a1141c2..f6e5e38 100644 --- a/sqlquerybuilder/__init__.py +++ b/sqlquerybuilder/__init__.py @@ -1,5 +1,6 @@ import datetime import copy +import collections VERSION = "0.0.3" @@ -76,10 +77,9 @@ class F(object): class Q(QMixin): lookup_types = [ - 'iexact', 'contains', 'icontains', - 'startswith', 'istartswith', 'endswith', 'iendswith', 'year', - 'month', 'day', 'week_day', 'hour', 'minute', 'second', - 'isnull', 'search', 'regex', 'iregex'] + 'icontains', 'istartswith', 'iendswith', + 'year', 'month', 'day', 'week_day', 'hour', 'minute', 'second', + 'isnull', 'in'] op_map = { 'lte': '<=', @@ -101,7 +101,7 @@ class Q(QMixin): def _get_value(self, value): if isinstance(value, int) or isinstance(value, float): - return value + return str(value) if isinstance(value, datetime.datetime): return "'%s'" % value.strftime("%Y-%m-%d %H:%M:%S") @@ -109,6 +109,9 @@ class Q(QMixin): if isinstance(value, datetime.date): return "'%s'" % value.strftime("%Y-%m-%d") + if isinstance(value, list) or isinstance(value, set): + return ", ".join([self._get_value(item) for item in value]) + if isinstance(value, F): return value @@ -132,6 +135,9 @@ class Q(QMixin): if lookup == "istartwith": return "{0} like '{1}%'".format(column, value) + if lookup == "in" and value: + return "{0} in ({1})".format(column, self._get_value(value)) + if lookup == 'isnull': op = "" if not value: diff --git a/sqlquerybuilder/tests.py b/sqlquerybuilder/tests.py index 2c0b9a1..7c0185c 100644 --- a/sqlquerybuilder/tests.py +++ b/sqlquerybuilder/tests.py @@ -29,7 +29,7 @@ class TestSqlBuilder(unittest.TestCase): def test_compound(self): qs = Queryset("users", "SQL_SERVER")\ .filter(nombre="jose")\ - .order_by( "nombre", "-fecha")\ + .order_by("nombre", "-fecha")\ .filter(fecha__lte=F("now()"))[:10] self.assertEqual( @@ -61,5 +61,17 @@ class TestSqlBuilder(unittest.TestCase): self.assertEqual( str(sql), "SELECT name, date, tlf , count(*) as total FROM users WHERE ((name='jhon') AND NOT (DATEPART('year', date)<=1977))") + def test_in(self,): + sql = Queryset("users") + sql = sql.filter(name__in=["jose", "andres"]) + self.assertEqual( + str(sql), "SELECT * FROM users WHERE (name in ('jose', 'andres'))") + + sql = Queryset("users") + sql = sql.filter(year__in=[2012, 2014, "jose"]) + self.assertEqual( + str(sql), "SELECT * FROM users WHERE (year in (2012, 2014, 'jose'))") + + if __name__ == '__main__': unittest.main()