Я не уверен, что это лучший подход, но вот что я обычно делаю, чтобы получить набор записей, используя модуль, совместимый с DB-API 2:
cursor.execute("""SELECT foo, bar, baz, quux FROM table WHERE id = %s;""",
(interesting_record_id,))
for foo, bar, baz, quux in cursor.fetchall():
frobnicate(foo + bar, baz * quux)
Метод форматирования запроса является одним из стандартов DB-API, но оказывается предпочтительным методом для Psycopg2; другие адаптеры DB-API могут предложить другое соглашение, которое подойдет.
Написание таких запросов, когда неявная распаковка кортежей используется для работы с результирующим набором, обычно для меня более эффективно, чем пытаться беспокоиться о сопоставлении имен переменных Python с именами столбцов SQL (которые я обычно использую только для удаления префиксов и только в том случае, если я работаю с подмножеством имен столбцов, так что префиксы больше не помогают прояснить ситуацию), и это намного лучше, чем запоминание числовых идентификаторов столбцов.
Этот стиль также помогает вам избежать SELECT * FROM table...
, что является просто катастрофой для обслуживания чего угодно, кроме самых простых таблиц и запросов.
Итак, не совсем тот ответ, который вы просили, но, тем не менее, возможно, просветляющий.