diff --git a/sqlquerybuilder/__init__.py b/sqlquerybuilder/__init__.py index e857ebd..5c79126 100644 --- a/sqlquerybuilder/__init__.py +++ b/sqlquerybuilder/__init__.py @@ -1,4 +1,5 @@ import datetime +import copy VERSION = "0.0.3" @@ -175,47 +176,58 @@ class SQLQuery(object): self._extra = {} self._limits = None + def _clone(self,): + return copy.deepcopy(self) + def values(self, *args): - self._values = args - return self + clone = self._clone() + clone._values = args + return clone def filter(self, *args, **kwargs): + clone = self._clone() for arg in args: if issubclass(arg.__class__, QMixin): - self._filters &= arg + clone._filters &= arg - self._filters &= Q(**kwargs) - return self + clone._filters &= Q(**kwargs) + return clone def exclude(self, *args, **kwargs): + clone = self._clone() for arg in args: if issubclass(arg.__class__, QMixin): - self._excludes &= arg + clone._excludes &= arg - self._excludes &= Q(**kwargs) - return self + clone._excludes &= Q(**kwargs) + return clone def order_by(self, *args): - self._order_by = args - return self + clone = self._clone() + clone._order_by = args + return clone - def group_by(self, *args): - self._group_by = args - return self + def group_by(clone, *args): + clone = self._clone() + clone._group_by = args + return clone def join(self, table, on="", how="inner join"): + clone = self._clone() if on: on = "ON " + on - self._joins.append("{how} {table} {on}".format(how=how, table=table, on=on)) - return self + clone._joins.append("{how} {table} {on}".format(how=how, table=table, on=on)) + return clone def extra(self, extra): - self._extra.update(extra) - return self + clone = self._clone() + clone._extra.update(extra) + return clone def __getitem__(self, slice): - self._limits = slice - return self + clone = self._clone() + clone._limits = slice + return clone class SQLCompiler(object): diff --git a/sqlquerybuilder/tests.py b/sqlquerybuilder/tests.py index a5ebd91..dbdcca6 100644 --- a/sqlquerybuilder/tests.py +++ b/sqlquerybuilder/tests.py @@ -43,6 +43,19 @@ class TestSqlBuilder(unittest.TestCase): self.assertEqual( str(qs), "SELECT * FROM users WHERE ((nombre='jose') AND (fecha<=now())) ORDER BY nombre, fecha DESC LIMIT 10") + def test_vars(self): + sql = Queryset("users") + sql = sql.filter(name="jhon") + sql = sql.exclude(date__year__lte=1977) + sql = sql.values("name", "date") + self.assertEqual( + str(sql), "SELECT name, date FROM users WHERE ((name='jhon') AND NOT (DATEPART('year', date)<=1977))") + + sql = sql.values("name", "date", "tlf") + sql.filter(name="not") + sql.filter(name="not") + self.assertEqual( + str(sql), "SELECT name, date, tlf FROM users WHERE ((name='jhon') AND NOT (DATEPART('year', date)<=1977))") if __name__ == '__main__': unittest.main()