Thread: [SQL-CVS] r1192 - in SQLObject/trunk/sqlobject: . tests
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: <sub...@co...> - 2005-11-02 20:33:41
|
Author: phd Date: 2005-11-02 20:33:36 +0000 (Wed, 02 Nov 2005) New Revision: 1192 Added: SQLObject/trunk/sqlobject/tests/test_index_get.py Modified: SQLObject/trunk/sqlobject/dbconnection.py SQLObject/trunk/sqlobject/index.py SQLObject/trunk/sqlobject/main.py Log: Patch 1341999 index.get() for every unique index by Leandro Lucarella <lu...@ll...>. Modified: SQLObject/trunk/sqlobject/dbconnection.py =================================================================== --- SQLObject/trunk/sqlobject/dbconnection.py 2005-11-02 20:14:37 UTC (rev 1191) +++ SQLObject/trunk/sqlobject/dbconnection.py 2005-11-02 20:33:36 UTC (rev 1192) @@ -617,11 +617,19 @@ self.sqlrepr(so.id))) def _SO_selectOneAlt(self, cls, columnNames, column, value): - return self.queryOne("SELECT %s FROM %s WHERE %s = %s" % + if isinstance(column, str): + column = (column,) + value = (value,) + if len(column) != len(value): + raise ValueError, "'column' and 'value' tuples must be of the same size" + columns = [] + for i in xrange(len(column)): + columns.append("%s = %s" % (column[i], self.sqlrepr(value[i]))) + condition = ' AND '.join(columns) + return self.queryOne("SELECT %s FROM %s WHERE %s" % (", ".join(columnNames), cls.sqlmeta.table, - column, - self.sqlrepr(value))) + condition)) def _SO_delete(self, so): self.query("DELETE FROM %s WHERE %s = %s" % Modified: SQLObject/trunk/sqlobject/index.py =================================================================== --- SQLObject/trunk/sqlobject/index.py 2005-11-02 20:14:37 UTC (rev 1191) +++ SQLObject/trunk/sqlobject/index.py 2005-11-02 20:33:36 UTC (rev 1192) @@ -14,6 +14,29 @@ self.descriptions = self.convertColumns(columns) self.unique = unique + def get(self, *args, **kw): + if not self.unique: + raise AttributeError, ( + "'%s' object has no attribute 'get' (index is not unique)" % self.name) + connection = col.popKey(kw, 'connection', None) + if args and kw: + raise TypeError, "You cannot mix named and unnamed arguments" + columns = [d['column'] for d in self.descriptions + if d.has_key('column')] + if kw: + args = [] + for i in xrange(len(columns)): + args.append(kw[columns[i].name]) + del kw[columns[i].name] + if kw or len(args) != len(columns): + raise TypeError, ("get() takes exactly %d argument and an optional " + "named argument 'connection' (%d given)" % ( + len(columns), len(args)+len(kw))) + cols = [c.name for c in columns] + dbcols = [c.dbName for c in columns] + return self.soClass._SO_fetchAlternateID(cols, dbcols, args, + connection=connection, idxName=self.name) + def convertColumns(self, columns): """ Converts all the columns to dictionary descriptors; Modified: SQLObject/trunk/sqlobject/main.py =================================================================== --- SQLObject/trunk/sqlobject/main.py 2005-11-02 20:14:37 UTC (rev 1191) +++ SQLObject/trunk/sqlobject/main.py 2005-11-02 20:33:36 UTC (rev 1192) @@ -579,6 +579,7 @@ cls.indexDefinitions.append(indexDef) index = indexDef.withClass(cls.soClass) cls.indexes.append(index) + setattr(cls.soClass, index.name, index) addIndex = classmethod(addIndex) ######################################## @@ -1291,10 +1292,17 @@ value), None _findAlternateID = classmethod(_findAlternateID) - def _SO_fetchAlternateID(cls, name, dbName, value, connection=None): + def _SO_fetchAlternateID(cls, name, dbName, value, connection=None, idxName=None): result, obj = cls._findAlternateID(name, dbName, value, connection) if not result: - raise SQLObjectNotFound, "The %s by alternateID %s=%s does not exist" % (cls.__name__, name, repr(value)) + if idxName is None: + raise SQLObjectNotFound, "The %s by alternateID %s = %s does not exist" % (cls.__name__, name, repr(value)) + else: + names = [] + for i in xrange(len(name)): + names.append("%s = %s" % (name[i], repr(value[i]))) + names = ', '.join(names) + raise SQLObjectNotFound, "The %s by unique index %s(%s) does not exist" % (cls.__name__, idxName, names) if obj: return obj if connection: Added: SQLObject/trunk/sqlobject/tests/test_index_get.py =================================================================== --- SQLObject/trunk/sqlobject/tests/test_index_get.py 2005-11-02 20:14:37 UTC (rev 1191) +++ SQLObject/trunk/sqlobject/tests/test_index_get.py 2005-11-02 20:33:36 UTC (rev 1192) @@ -0,0 +1,47 @@ +from sqlobject import * +from sqlobject.tests.dbtest import * + +class Person(SQLObject): + firstName = StringCol() + lastName = StringCol() + age = IntCol(alternateID=True) + nameIndex = DatabaseIndex(firstName, lastName, unique=True) + +def test_1(): + setupClass(Person) + + Person(firstName='Eric', lastName='Idle', age=62) + Person(firstName='Terry', lastName='Gilliam', age=65) + Person(firstName='John', lastName='Cleese', age=66) + + Person.get(1) + Person.nameIndex.get('Terry', 'Gilliam') + Person.nameIndex.get(firstName='John', lastName='Cleese') + + try: + print Person.nameIndex.get(firstName='Graham', lastName='Chapman') + except Exception, e: + pass + else: + raise AssertError + + try: + print Person.nameIndex.get('Terry', lastName='Gilliam') + except Exception, e: + pass + else: + raise AssertError + + try: + print Person.nameIndex.get('Terry', 'Gilliam', 65) + except Exception, e: + pass + else: + raise AssertError + + try: + print Person.nameIndex.get('Terry') + except Exception, e: + pass + else: + raise AssertError |