diff --git a/sqlquerybuilder/__init__.py b/sqlquerybuilder/__init__.py index cc72bf2..86c382a 100644 --- a/sqlquerybuilder/__init__.py +++ b/sqlquerybuilder/__init__.py @@ -1,14 +1,22 @@ from __future__ import unicode_literals - +import sys import copy import datetime +PYTHON3 = True +if sys.version_info[0] < 3: + PYTHON3 = False + VERSION = "0.0.13" +def is_map(obj): + return PYTHON3 and isinstance(obj, map) def ensureUtf(s): try: - if type(s) == unicode: + if isinstance(s, str): + return s + else: return s.encode('utf8', 'ignore') except: return str(s) @@ -138,7 +146,7 @@ class Q(QMixin): if isinstance(value, datetime.date): return "'%s'" % value.strftime(self.date_format) - if isinstance(value, list) or isinstance(value, set) or isinstance(value, map): + if isinstance(value, list) or isinstance(value, set) or is_map(value): return ", ".join([self._get_value(item) for item in value]) if isinstance(value, F) or isinstance(value, QMixin) or isinstance(value, SQLQuery): @@ -226,6 +234,7 @@ class SQLQuery(object): self._extra = {} self._limits = None self._sql = sql + self._nolock = False def has_filters(self,): return self._order_by or self._group_by or self._joins\ @@ -252,6 +261,11 @@ class SQLQuery(object): clone._values = list(args) return clone + def with_nolock(self, enabled=True): + clone = self._clone() + clone._nolock = enabled + return clone + def filter(self, *args, **kwargs): clone = self._clone() clone._filters &= self._q(*args, **kwargs) @@ -346,6 +360,11 @@ class SQLCompiler(object): if self._joins: return " ".join(self._joins) + def get_nolock(self,): + if self._nolock: + return " WITH (NOLOCK)" + return "" + def get_limits(self,): if self._limits and self.sql_mode != "SQL_SERVER": offset = self._limits.start @@ -370,7 +389,8 @@ class SQLCompiler(object): table = self.get_table() sql = ["SELECT", self.get_top(), self.get_columns(), - "FROM", table, "WITH (NOLOCK)", + "FROM", table, + self.get_nolock(), self.get_joins(), self.get_where(), self.get_group_by(), self.get_order_by(), self.get_limits()] @@ -389,7 +409,8 @@ class SQLCompiler(object): return ["SELECT * FROM (", "SELECT", ",".join([paginate, self.get_columns()]), "FROM", table, - self.get_joins(), self.get_where(), + self.get_joins(), + self.get_where(), self.get_group_by(), self.get_limits(), ") as tbl_paginated WHERE ", conds] diff --git a/sqlquerybuilder/tests.py b/sqlquerybuilder/tests.py index a94f992..3874a0e 100644 --- a/sqlquerybuilder/tests.py +++ b/sqlquerybuilder/tests.py @@ -1,3 +1,5 @@ +#encoding: utf-8 +from __future__ import unicode_literals import unittest import datetime from sqlquerybuilder import Q, Queryset, F @@ -89,9 +91,8 @@ class TestSqlBuilder(unittest.TestCase): str(sql), "SELECT * FROM users WHERE (name in ('jose', 'andres'))") sql = Queryset("users") - sql = sql.filter(year__in=[2012, 2014, u"José"]) - self.assertEqual( - unicode(sql), u"SELECT * FROM users WHERE (year in (2012, 2014, 'José'))") + sql = sql.filter(year__in=[2012, 2014, "Jose"]) + self.assertEqual(str(sql), "SELECT * FROM users WHERE (year in (2012, 2014, 'Jose'))") user = Queryset("users").filter(id=100).values("id") self.assertEqual(str(user), "SELECT id FROM users WHERE (id=100)")