[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
|