Как получить указанные столбцы с результатом в виде массива объектов класса таблицы? - PullRequest
1 голос
/ 15 августа 2010

У меня простая проблема.В моей таблице есть столбцы ID, NAME, CONTENT, TIMESTAMP.Если я использую session.query (таблица) .all (), результат - массив объектов класса таблицы.Поэтому у меня нет проблем с изменением одного или нескольких объектов и обновлением или использованием этих объектов в ассоциациях.Но мне нужны только столбцы ID и ИМЯ.Если использовать session.query (table.id, table.name), я получаю в качестве кортежа результата с id и именем.Используя этот кортеж в обновлении, это - может быть - просто, но код это ... ужасно.Как же в ассоциациях.И есть ненужная загрузка базы данных, если я хочу, чтобы только ID создавал ассоциацию.

До сих пор я использовал простой код для получения массива объектов класса таблицы, запрашивающих только указанные столбцы:
for row in session.query(table.id, table.name).all():<br> data.append(table(id=row.id, name=row.name))

Это делает обновления легкими, но использование в ассоциациях является сложным.Например, я получаю 10 строк в массиве табличных объектов из моего кода.Я хочу связать строку 1 с таблицей 2.
Если я использую: session.add(table2(name = 'test', association = data[1])) и зафиксирую,
sqlalchemy хочет создать новую строку таблицы2, новую строку таблицы ассоциации и новую строку таблицы (в первую очередь, связанную с таблицей 2).

Есть ли способ получить результат в виде массива табличных объектов, а не кортежей, с указанными столбцами, если возвращаемые объекты одинаковы, если make query (table)?

Извините за мой английский в любом случае, яникогда не использовал его для описания сложных проблем, до сих пор.

1 Ответ

0 голосов
/ 16 ноября 2010

Если вы хотите уменьшить количество столбцов, загружаемых из базы данных, с помощью .query(Table), тем самым уменьшая накладные расходы, вы можете попробовать отложить ненужные столбцы при определении отношения. Скажите, id и name необходимы для ваших обновлений, а info нет, вы можете указать мапперу отложить info:

mapper(Class, table, properties={
  "info":column_property(table.c.info, deferred=True),
  ... other properties ....
}) 

Итак, когда вы делаете session.query(Class), информация не будет выбрана при выборе. Он будет вызываться, только если где-то в коде у вас есть obj.info, то есть когда вы явно вызываете этот атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...