Author: phd
Date: 2008-01-30 06:20:07 -0700 (Wed, 30 Jan 2008)
New Revision: 3229
Modified:
SQLObject/branches/0.10/docs/News.txt
SQLObject/branches/0.10/sqlobject/main.py
SQLObject/branches/0.10/sqlobject/sqlbuilder.py
SQLObject/branches/0.10/sqlobject/tests/test_foreignKey.py
SQLObject/branches/0.10/sqlobject/tests/test_sqlbuilder_joins_instances.py
SQLObject/branches/0.10/sqlobject/tests/test_views.py
Log:
Allow MyTable.select(MyTable.q.foreignKey == object) where object is an instance of SQLObject.
Modified: SQLObject/branches/0.10/docs/News.txt
===================================================================
--- SQLObject/branches/0.10/docs/News.txt 2008-01-16 16:24:08 UTC (rev 3228)
+++ SQLObject/branches/0.10/docs/News.txt 2008-01-30 13:20:07 UTC (rev 3229)
@@ -56,18 +56,19 @@
override it in the inheritable sqlmeta class; this makes asDict() to work
properly on inheritable sqlobjects.
-* Changed the implementation type in BoolCol under SQLite from TINYINT to
- BOOLEAN and made fromDatabase machinery to recognize it.
+* Allow MyTable.select(MyTable.q.foreignKey == object) where object is
+ an instance of SQLObject.
* Added rich comparison methods; SQLObjects of the same class are
considered equal is they have the same id; other methods return
NotImplemented.
+* Changed the implementation type in BoolCol under SQLite from TINYINT to
+ BOOLEAN and made fromDatabase machinery to recognize it.
+
* MySQLConnection (and DB URI) accept a number of SSL-related parameters:
ssl_key, ssl_cert, ssl_ca, ssl_capath.
-* A number of changes ported from `SQLObject 0.7.10`_.
-
SQLObject 0.9.3
===============
Modified: SQLObject/branches/0.10/sqlobject/main.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/main.py 2008-01-16 16:24:08 UTC (rev 3228)
+++ SQLObject/branches/0.10/sqlobject/main.py 2008-01-30 13:20:07 UTC (rev 3229)
@@ -1554,6 +1554,9 @@
self.id,
' '.join(['%s=%s' % (name, repr(value)) for name, value in self._reprItems()]))
+ def __sqlrepr__(self, db):
+ return str(self.id)
+
def sqlrepr(cls, value, connection=None):
return (connection or cls._connection).sqlrepr(value)
@@ -1584,9 +1587,6 @@
setConnection = classmethod(setConnection)
- def __sqlrepr__(self, db):
- return sqlbuilder.sqlrepr(self.__class__.q.id==self.id)
-
def tablesUsedImmediate(self):
return [self.__class__.q]
Modified: SQLObject/branches/0.10/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/sqlbuilder.py 2008-01-16 16:24:08 UTC (rev 3228)
+++ SQLObject/branches/0.10/sqlobject/sqlbuilder.py 2008-01-30 13:20:07 UTC (rev 3229)
@@ -392,35 +392,22 @@
raise AttributeError
if attr == 'id':
return self._getattrFromID(attr)
- elif attr+'ID' in [k for (k, v) in self.soClass.sqlmeta.columns.items() if v.foreignKey]:
- column = self.soClass.sqlmeta.columns[attr+'ID']
- return self._getattrFromForeignKey(column, attr)
- elif attr in [x.joinMethodName for x in self.soClass.sqlmeta.joins]:
- join = [x for x in self.soClass.sqlmeta.joins if x.joinMethodName == attr][0]
- return self._getattrFromJoin(join, attr)
- elif attr not in self.soClass.sqlmeta.columns:
- raise AttributeError("%s instance has no attribute '%s'" % (self.soClass.__name__, attr))
- else:
+ elif attr in self.soClass.sqlmeta.columns:
column = self.soClass.sqlmeta.columns[attr]
if hasattr(column, "dbEncoding"):
return self._getattrFromUnicodeColumn(column, attr)
else:
return self._getattrFromColumn(column, attr)
+ elif attr+'ID' in [k for (k, v) in self.soClass.sqlmeta.columns.items() if v.foreignKey]:
+ attr += 'ID'
+ column = self.soClass.sqlmeta.columns[attr]
+ return self._getattrFromColumn(column, attr)
+ else:
+ raise AttributeError("%s instance has no attribute '%s'" % (self.soClass.__name__, attr))
def _getattrFromID(self, attr):
return self.FieldClass(self.tableName, self.soClass.sqlmeta.idName, attr)
- def _getattrFromForeignKey(self, column, attr):
- ret = getattr(self, column.name)==getattr(self.soClass, '_SO_class_'+column.foreignKey).q.id
- return ret
-
- def _getattrFromJoin(self, join, attr):
- if hasattr(join, 'otherColumn'):
- return AND(join.otherClass.q.id == Field(join.intermediateTable, join.otherColumn),
- Field(join.intermediateTable, join.joinColumn) == self.soClass.q.id)
- else:
- return getattr(join.otherClass.q, join.joinColumn)==self.soClass.q.id
-
def _getattrFromColumn(self, column, attr):
return self.FieldClass(self.tableName, column.dbName, attr)
Modified: SQLObject/branches/0.10/sqlobject/tests/test_foreignKey.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/tests/test_foreignKey.py 2008-01-16 16:24:08 UTC (rev 3228)
+++ SQLObject/branches/0.10/sqlobject/tests/test_foreignKey.py 2008-01-30 13:20:07 UTC (rev 3229)
@@ -24,23 +24,46 @@
# Select by usual way
s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9')
+ assert s.count() == 1
assert s[0]==w1
# selectBy object.id
s = TestWorkKey.selectBy(composer=c.id, title='Symphony No. 9')
+ assert s.count() == 1
assert s[0]==w1
# selectBy object
s = TestWorkKey.selectBy(composer=c, title='Symphony No. 9')
+ assert s.count() == 1
assert s[0]==w1
# selectBy id
s = TestWorkKey.selectBy(id=w1.id)
+ assert s.count() == 1
assert s[0]==w1
# is None handled correctly?
s = TestWorkKey.selectBy(composer=None, title=None)
+ assert s.count() == 1
assert s[0]==w2
s = TestWorkKey.selectBy()
assert s.count() == 2
+ # select with objects
+ s = TestWorkKey.select(TestWorkKey.q.composerID==c.id)
+ assert s.count() == 1
+ assert s[0]==w1
+ s = TestWorkKey.select(TestWorkKey.q.composer==c.id)
+ assert s.count() == 1
+ assert s[0]==w1
+ s = TestWorkKey.select(TestWorkKey.q.composerID==c)
+ assert s.count() == 1
+ assert s[0]==w1
+ s = TestWorkKey.select(TestWorkKey.q.composer==c)
+ assert s.count() == 1
+ assert s[0]==w1
+ s = TestWorkKey.select((TestWorkKey.q.composer==c) & \
+ (TestWorkKey.q.title=='Symphony No. 9'))
+ assert s.count() == 1
+ assert s[0]==w1
+
def test2():
TestWorkKey._connection = getConnection()
InstalledTestDatabase.drop(TestWorkKey)
Modified: SQLObject/branches/0.10/sqlobject/tests/test_sqlbuilder_joins_instances.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/tests/test_sqlbuilder_joins_instances.py 2008-01-16 16:24:08 UTC (rev 3228)
+++ SQLObject/branches/0.10/sqlobject/tests/test_sqlbuilder_joins_instances.py 2008-01-30 13:20:07 UTC (rev 3229)
@@ -9,13 +9,13 @@
name = StringCol()
addresses = SQLMultipleJoin('SBAddress', joinColumn='personID')
sharedAddresses = SQLRelatedJoin('SBAddress', addRemoveName='SharedAddress')
-
+
class SBAddress(SQLObject):
city = StringCol()
person = ForeignKey('SBPerson')
sharedPeople = SQLRelatedJoin('SBPerson')
-
+
def setup_module(mod):
setupClass([SBPerson, SBAddress])
mod.ppl = inserts(SBPerson, [('James',),
@@ -30,33 +30,16 @@
mod.ppl[1].addSharedAddress(mod.adds[0])
def testJoin():
- assert list(SBPerson.select(AND(SBPerson.q.addresses,SBAddress.q.city=='London'))) == \
- list(SBPerson.select(AND(SBPerson.q.id==SBAddress.q.personID, SBAddress.q.city=='London'))) == \
- list(SBAddress.selectBy(city='London').throughTo.person)
-
-def testFK():
- assert list(SBPerson.select(AND(SBAddress.q.person, SBAddress.q.city=='London'))) == \
- list(SBPerson.select(AND(SBPerson.q.id==SBAddress.q.personID, SBAddress.q.city=='London')))
+ assert list(SBPerson.select(AND(SBPerson.q.id==SBAddress.q.personID, SBAddress.q.city=='London'))) == \
+ list(SBAddress.selectBy(city='London').throughTo.person)
-def testJoin2():
- assert list(SBAddress.select(AND(SBPerson.q.addresses, SBPerson.q.name=='Julia'))) == \
- list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.name=='Julia'))) == \
- list(SBPerson.selectBy(name='Julia').throughTo.addresses)
-
-def testFK2():
- assert list(SBAddress.select(AND(SBAddress.q.person, SBPerson.q.name=='Julia'))) == \
- list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.name=='Julia')))
+ assert list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.name=='Julia'))) == \
+ list(SBPerson.selectBy(name='Julia').throughTo.addresses)
def testRelatedJoin():
- assert list(SBAddress.select(AND(SBAddress.q.sharedPeople, SBPerson.q.name=='Julia'))) == \
- list(SBPerson.selectBy(name='Julia').throughTo.sharedAddresses) == \
- list(ppl[1].sharedAddresses)
+ assert list(SBPerson.selectBy(name='Julia').throughTo.sharedAddresses) == \
+ list(ppl[1].sharedAddresses)
def testInstance():
- assert list(SBAddress.select(AND(SBAddress.q.person, ppl[0]))) == \
- list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.id==ppl[0].id))) == \
- list(ppl[0].addresses)
-
-def testInstance2():
- assert list(SBAddress.select(AND(SBPerson.q.addresses, ppl[0]))) == \
- list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.id==ppl[0].id)))
\ No newline at end of file
+ assert list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.id==ppl[0].id))) == \
+ list(ppl[0].addresses)
Modified: SQLObject/branches/0.10/sqlobject/tests/test_views.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/tests/test_views.py 2008-01-16 16:24:08 UTC (rev 3228)
+++ SQLObject/branches/0.10/sqlobject/tests/test_views.py 2008-01-30 13:20:07 UTC (rev 3229)
@@ -6,17 +6,17 @@
number = StringCol()
calls = SQLMultipleJoin('PhoneCall')
incoming = SQLMultipleJoin('PhoneCall', joinColumn='toID')
-
+
class PhoneCall(SQLObject):
phoneNumber = ForeignKey('PhoneNumber')
to = ForeignKey('PhoneNumber')
minutes = IntCol()
-
+
class ViewPhoneCall(ViewSQLObject):
class sqlmeta:
idName = PhoneCall.q.id
clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id
-
+
minutes = IntCol(dbName=PhoneCall.q.minutes)
number = StringCol(dbName=PhoneNumber.q.number)
phoneNumber = ForeignKey('PhoneNumber', dbName=PhoneNumber.q.id)
@@ -26,7 +26,7 @@
class sqlmeta:
idName = PhoneNumber.q.id
clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id
-
+
minutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes))
numberOfCalls = IntCol(dbName=func.COUNT(PhoneCall.q.phoneNumberID))
number = StringCol(dbName=PhoneNumber.q.number)
@@ -39,7 +39,7 @@
class sqlmeta:
idName = ViewPhone.q.id
clause = ViewPhone.q.id == PhoneCall.q.toID
-
+
number = StringCol(dbName=ViewPhone.q.number)
timesCalled = IntCol(dbName=func.COUNT(PhoneCall.q.toID))
timesCalledLong = IntCol(dbName=func.COUNT(PhoneCall.q.toID))
@@ -49,8 +49,8 @@
class ViewPhoneMore2(ViewPhoneMore):
class sqlmeta:
table = 'vpm'
-
+
class ViewPhoneInnerAggregate(ViewPhone):
twiceMinutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes)*2)
@@ -122,12 +122,12 @@
assert s.count() == len(phones)
s = ViewPhoneCall.select()
assert s.count() == len(calls)
-
+
def testSelect2():
s = ViewPhone.select(ViewPhone.q.number==phones[0].number)
assert s.getOne().phoneNumber == phones[0]
-
+
def testDistinctCount():
# This test is for SelectResults non-* based count when distinct
# We're really just checking this doesn't raise anything due to lack of sqlrepr'ing
- assert ViewPhone.select(distinct=True).count() == 2
\ No newline at end of file
+ assert ViewPhone.select(distinct=True).count() == 2
|