From 6d22c9318196eee8d5e5e6646a26f9953095a0e7 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 8 Jun 2006 17:38:37 +0000 Subject: [PATCH] separated standalone between(), column.between(), put literal checking for both, favor column.between() --- lib/sqlalchemy/sql.py | 21 ++++++++++++++++----- test/sql/select.py | 2 ++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index 48c9f87546..7ac28babe7 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -125,10 +125,15 @@ def not_(clause): clause.parens=True return BooleanExpression(TextClause("NOT"), clause, None) -def between_(ctest, cleft, cright): - """ returns BETWEEN predicate clause (clausetest BETWEEN clauseleft AND clauseright) """ - return BooleanExpression(ctest, and_(cleft, cright), 'BETWEEN') -between = between_ +def between(ctest, cleft, cright): + """ returns BETWEEN predicate clause (clausetest BETWEEN clauseleft AND clauseright). + + this is better called off a ColumnElement directly, i.e. + + column.between(value1, value2). + """ + return BooleanExpression(ctest, and_(_check_literal(cleft, ctest.type), _check_literal(cright, ctest.type)), 'BETWEEN') +between_ = between def case(whens, value=None, else_=None): """ SQL CASE statement -- whens are a sequence of pairs to be translated into "when / then" clauses; @@ -168,6 +173,12 @@ def union_all(*selects, **params): def alias(*args, **params): return Alias(*args, **params) +def _check_literal(value, type): + if _is_literal(value): + return literal(value, type) + else: + return value + def literal(value, type=None): """returns a literal clause, bound to a bind parameter. @@ -551,7 +562,7 @@ class CompareMixin(object): def distinct(self): return CompoundClause(None,"DISTINCT", self) def between(self, cleft, cright): - return between_(self, self._check_literal(cleft), self._check_literal(cright)) + return BooleanExpression(self, and_(self._check_literal(cleft), self._check_literal(cright)), 'BETWEEN') def op(self, operator): return lambda other: self._compare(operator, other) # and here come the math operators: diff --git a/test/sql/select.py b/test/sql/select.py index e246ece89d..2481e04aed 100644 --- a/test/sql/select.py +++ b/test/sql/select.py @@ -566,6 +566,8 @@ FROM mytable, myothertable WHERE mytable.myid = myothertable.otherid AND mytable Column('date', Date)) self.runtest(table.select(table.c.date.between(datetime.date(2006,6,1), datetime.date(2006,6,5))), "SELECT dt.date FROM dt WHERE dt.date BETWEEN :dt_date AND :dt_da_1", checkparams={'dt_date':datetime.date(2006,6,1), 'dt_da_1':datetime.date(2006,6,5)}) + self.runtest(table.select(sql.between(table.c.date, datetime.date(2006,6,1), datetime.date(2006,6,5))), "SELECT dt.date FROM dt WHERE dt.date BETWEEN :literal AND :liter_1", checkparams={'literal':datetime.date(2006,6,1), 'liter_1':datetime.date(2006,6,5)}) + class CRUDTest(SQLTest): def testinsert(self): # generic insert, will create bind params for all columns -- 2.47.2