Source code for sqlobject.tests.test_subqueries
from sqlobject import ForeignKey, SQLObject, StringCol
from sqlobject.sqlbuilder import EXISTS, IN, LEFTOUTERJOINOn, NOTEXISTS, \
Outer, Select
from sqlobject.tests.dbtest import setupClass
########################################
# Subqueries (subselects)
########################################
[docs]class SOTestIn1(SQLObject):
col1 = StringCol()
[docs]class SOTestIn2(SQLObject):
col2 = StringCol()
[docs]class SOTestOuter(SQLObject):
fk = ForeignKey('SOTestIn1')
[docs]def setup():
setupClass(SOTestIn1)
setupClass(SOTestIn2)
[docs]def insert():
setup()
SOTestIn1(col1=None)
SOTestIn1(col1='')
SOTestIn1(col1="test")
SOTestIn2(col2=None)
SOTestIn2(col2='')
SOTestIn2(col2="test")
[docs]def test_1syntax_in():
setup()
select = SOTestIn1.select(IN(SOTestIn1.q.col1, Select(SOTestIn2.q.col2)))
assert str(select) == \
"SELECT so_test_in1.id, so_test_in1.col1 " \
"FROM so_test_in1 WHERE so_test_in1.col1 IN " \
"(SELECT so_test_in2.col2 FROM so_test_in2)"
select = SOTestIn1.select(IN(SOTestIn1.q.col1, SOTestIn2.select()))
assert str(select) == \
"SELECT so_test_in1.id, so_test_in1.col1 " \
"FROM so_test_in1 WHERE so_test_in1.col1 IN " \
"(SELECT so_test_in2.id FROM so_test_in2 WHERE 1 = 1)"
[docs]def test_3syntax_exists():
setup()
select = SOTestIn1.select(NOTEXISTS(
Select(SOTestIn2.q.col2,
where=(Outer(SOTestIn1).q.col1 == SOTestIn2.q.col2))))
assert str(select) == \
"SELECT so_test_in1.id, so_test_in1.col1 " \
"FROM so_test_in1 WHERE NOT EXISTS " \
"(SELECT so_test_in2.col2 FROM so_test_in2 " \
"WHERE ((so_test_in1.col1) = (so_test_in2.col2)))"
setupClass(SOTestOuter)
select = SOTestOuter.select(NOTEXISTS(
Select(SOTestIn1.q.col1,
where=(Outer(SOTestOuter).q.fk == SOTestIn1.q.id))))
assert str(select) == \
"SELECT so_test_outer.id, so_test_outer.fk_id " \
"FROM so_test_outer WHERE NOT EXISTS " \
"(SELECT so_test_in1.col1 FROM so_test_in1 " \
"WHERE ((so_test_outer.fk_id) = (so_test_in1.id)))"
[docs]def test_4syntax_direct():
setup()
select = SOTestIn1.select(SOTestIn1.q.col1 == Select(SOTestIn2.q.col2,
where=(SOTestIn2.q.col2 == "test")))
assert str(select) == \
"SELECT so_test_in1.id, so_test_in1.col1 " \
"FROM so_test_in1 WHERE ((so_test_in1.col1) = " \
"(SELECT so_test_in2.col2 FROM so_test_in2 " \
"WHERE ((so_test_in2.col2) = ('test'))))"
[docs]def test_6syntax_join():
insert()
j = LEFTOUTERJOINOn(SOTestIn2, SOTestIn1,
SOTestIn1.q.col1 == SOTestIn2.q.col2)
select = SOTestIn1.select(SOTestIn1.q.col1 == Select(SOTestIn2.q.col2,
where=(SOTestIn2.q.col2 == "test"), join=j))
assert str(select) == \
"SELECT so_test_in1.id, so_test_in1.col1 " \
"FROM so_test_in1 WHERE ((so_test_in1.col1) = " \
"(SELECT so_test_in2.col2 FROM so_test_in2 " \
"LEFT OUTER JOIN so_test_in1 ON " \
"((so_test_in1.col1) = (so_test_in2.col2)) " \
"WHERE ((so_test_in2.col2) = ('test'))))"