Here is my initial diff: diff --git a/lib/sqlalchemy/cextension/resultproxy.c b/lib/sqlalchemy/cextension/resultproxy.c index 9c4d0c7..3e40ec1 100644 --- a/lib/sqlalchemy/cextension/resultproxy.c +++ b/lib/sqlalchemy/cextension/resultproxy.c @@ -271,6 +271,8 @@ BaseRowProxy_subscript(BaseRowProxy *self, PyObject *key) if ((index == -1) && PyErr_Occurred()) /* -1 can be either the actual value, or an error flag. */ return NULL; + if (index < 0) + index += BaseRowProxy_length(self); } else if (PySlice_Check(key)) { values = PyObject_GetItem(self->row, key); if (values == NULL) diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py index cc4ac74..47f87f3 100644 --- a/lib/sqlalchemy/engine/result.py +++ b/lib/sqlalchemy/engine/result.py @@ -67,6 +67,8 @@ except ImportError:
def __getitem__(self, key): try: + if isinstance(key, util.int_types) and key < 0: + key += len(self) processor, obj, index = self._keymap[key] except KeyError: processor, obj, index = self._parent._key_fallback(key) diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py index 5ea5d35..06f7863 100644 --- a/test/engine/test_execute.py +++ b/test/engine/test_execute.py @@ -951,6 +951,20 @@ class ResultProxyTest(fixtures.TestBase): {'key': (None, None, 0), 0: (None, None, 0)}) assert isinstance(row, collections.Sequence) + def test_rowproxy_getitem(self): + from sqlalchemy.engine import RowProxy + + row = RowProxy( + object(), ['value1', 'value2'], [None, None], + {'key1': (None, None, 0), + 'key2': (None, None, 1), + 0: (None, None, 0), + 1: (None, None, 1)}) + assert row['key1'] == 'value1' + assert row[0] == 'value1' + assert row[-1] == 'value2' + assert row[1:0:-1] == ('value2',) + @testing.requires.cextensions def test_row_c_sequence_check(self): import csv I failed to find the "opposite" of @testing.requires.cextensions: how can I exercise both implementations (that is, C and pure Python)? Thanks for any feedback, ciao, lele. -- nickname: Lele Gaifax | Quando vivrò di quello che ho pensato ieri real: Emanuele Gaifas | comincerò ad aver paura di chi mi copia. l...@metapensiero.it | -- Fortunato Depero, 1929. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.