Thread: [SQL-CVS] r2071 - in SQLObject/branches/0.7-bugfix: docs sqlobject sqlobject/tests
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: <sub...@co...> - 2006-11-10 15:07:58
|
Author: phd Date: 2006-11-10 08:07:54 -0700 (Fri, 10 Nov 2006) New Revision: 2071 Modified: SQLObject/branches/0.7-bugfix/docs/News.txt SQLObject/branches/0.7-bugfix/sqlobject/sqlbuilder.py SQLObject/branches/0.7-bugfix/sqlobject/tests/test_subqueries.py Log: The patch 1592104: sqlbuilder.Select with JOINs. Modified: SQLObject/branches/0.7-bugfix/docs/News.txt =================================================================== --- SQLObject/branches/0.7-bugfix/docs/News.txt 2006-11-10 15:07:35 UTC (rev 2070) +++ SQLObject/branches/0.7-bugfix/docs/News.txt 2006-11-10 15:07:54 UTC (rev 2071) @@ -10,6 +10,11 @@ SQLObject 0.7.2 =============== +Features & Interface +-------------------- + +* sqlbuilder.Select now supports JOINs exactly like SQLObject.select. + Bug Fixes --------- Modified: SQLObject/branches/0.7-bugfix/sqlobject/sqlbuilder.py =================================================================== --- SQLObject/branches/0.7-bugfix/sqlobject/sqlbuilder.py 2006-11-10 15:07:35 UTC (rev 2070) +++ SQLObject/branches/0.7-bugfix/sqlobject/sqlbuilder.py 2006-11-10 15:07:54 UTC (rev 2071) @@ -453,7 +453,7 @@ class Select(SQLExpression): def __init__(self, items, where=NoDefault, groupBy=NoDefault, - having=NoDefault, orderBy=NoDefault, limit=NoDefault): + having=NoDefault, orderBy=NoDefault, limit=NoDefault, join=NoDefault): if type(items) is not type([]) and type(items) is not type(()): items = [items] self.items = items @@ -462,10 +462,17 @@ self.having = having self.orderBy = orderBy self.limit = limit + self.join = join def __sqlrepr__(self, db): select = "SELECT %s" % ", ".join([sqlrepr(v, db) for v in self.items]) + join = [] + if self.join is not NoDefault: + if isinstance(self.join, SQLJoin): + join.append(self.join) + else: + join.extend(self.join) tables = {} things = list(self.items) if self.whereClause is not NoDefault: @@ -473,9 +480,20 @@ for thing in things: if isinstance(thing, SQLExpression): tables.update(tablesUsedDict(thing)) + for j in join: + if j.table1 in tables: del tables[j.table1] + if j.table2 in tables: del tables[j.table2] tables = tables.keys() if tables: select += " FROM %s" % ", ".join(tables) + elif join: + select += " FROM " + for j in join: + if tables and j.table1: + sep = ", " + else: + sep = " " + select += sep + sqlrepr(j, db) if self.whereClause is not NoDefault: select += " WHERE %s" % sqlrepr(self.whereClause, db) Modified: SQLObject/branches/0.7-bugfix/sqlobject/tests/test_subqueries.py =================================================================== --- SQLObject/branches/0.7-bugfix/sqlobject/tests/test_subqueries.py 2006-11-10 15:07:35 UTC (rev 2070) +++ SQLObject/branches/0.7-bugfix/sqlobject/tests/test_subqueries.py 2006-11-10 15:07:54 UTC (rev 2071) @@ -62,3 +62,16 @@ insert() select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test"))) assert select.count() == 1 + +def test_6syntax_join(): + insert() + j = LEFTOUTERJOINOn(TestIn2, TestIn1, TestIn1.q.col1==TestIn2.q.col2) + select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test"), join=j)) + assert str(select) == \ + "SELECT test_in1.id, test_in1.col1 FROM test_in1 WHERE ((test_in1.col1) = (SELECT test_in2.col2 FROM test_in2 LEFT OUTER JOIN test_in1 ON ((test_in1.col1) = (test_in2.col2)) WHERE ((test_in2.col2) = ('test'))))" + +def test_6perform_join(): + insert() + j = LEFTOUTERJOINOn(TestIn2, TestIn1, TestIn1.q.col1==TestIn2.q.col2) + select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test"), join=j)) + assert select.count() == 1 |