Author: phd
Date: 2008-01-30 06:27:54 -0700 (Wed, 30 Jan 2008)
New Revision: 3231
Modified:
SQLObject/trunk/docs/News.txt
SQLObject/trunk/sqlobject/main.py
SQLObject/trunk/sqlobject/sqlbuilder.py
SQLObject/trunk/sqlobject/tests/test_foreignKey.py
SQLObject/trunk/sqlobject/tests/test_sqlbuilder_joins_instances.py
Log:
Allow MyTable.select(MyTable.q.foreignKey == object) where object is an instance of SQLObject.
Modified: SQLObject/trunk/docs/News.txt
===================================================================
--- SQLObject/trunk/docs/News.txt 2008-01-30 13:27:23 UTC (rev 3230)
+++ SQLObject/trunk/docs/News.txt 2008-01-30 13:27:54 UTC (rev 3231)
@@ -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/trunk/sqlobject/main.py
===================================================================
--- SQLObject/trunk/sqlobject/main.py 2008-01-30 13:27:23 UTC (rev 3230)
+++ SQLObject/trunk/sqlobject/main.py 2008-01-30 13:27:54 UTC (rev 3231)
@@ -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/trunk/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/trunk/sqlobject/sqlbuilder.py 2008-01-30 13:27:23 UTC (rev 3230)
+++ SQLObject/trunk/sqlobject/sqlbuilder.py 2008-01-30 13:27:54 UTC (rev 3231)
@@ -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/trunk/sqlobject/tests/test_foreignKey.py
===================================================================
--- SQLObject/trunk/sqlobject/tests/test_foreignKey.py 2008-01-30 13:27:23 UTC (rev 3230)
+++ SQLObject/trunk/sqlobject/tests/test_foreignKey.py 2008-01-30 13:27:54 UTC (rev 3231)
@@ -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/trunk/sqlobject/tests/test_sqlbuilder_joins_instances.py
===================================================================
--- SQLObject/trunk/sqlobject/tests/test_sqlbuilder_joins_instances.py 2008-01-30 13:27:23 UTC (rev 3230)
+++ SQLObject/trunk/sqlobject/tests/test_sqlbuilder_joins_instances.py 2008-01-30 13:27:54 UTC (rev 3231)
@@ -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)
|