Вопрос:

Как обновить объект, возвращенный в запросе

python flask sqlalchemy flask-sqlalchemy

830 просмотра

2 ответа

312 Репутация автора

Так что я новичок в колбе / sqlalchemy, но похоже, что все должно быть довольно просто. Тем не менее, на всю жизнь я не могу заставить его работать, и я не могу найти документацию для этого где-либо в Интернете. У меня есть несколько сложный запрос, который я запускаю, который возвращает мне список объектов базы данных.

items = db.session.query(X, func.count(Y.x_id).label('total')).filter(X.size >= size).outerjoin(Y, X.x_id == Y.x_id).group_by(X.x_id).order_by('total ASC')\
    .limit(20).all()

После того, как я получу этот список элементов, я хочу просмотреть список и для каждого элемента обновить какое-либо свойство.

for it in items:
   it.some_property = 'xyz'
   db.session.commit()

Однако происходит то, что я получаю ошибку

it.some_property = 'xyz'
AttributeError: 'result' object has no attribute 'some_property'

Я не сумасшедший. Я уверен, что свойство существует в модели X, которая находится в подклассе от db.Model. Что-то в запросе мешает мне получить доступ к атрибутам, хотя я четко вижу, что они существуют в отладчике. Любая помощь будет оценена.

class X(db.Model):
    x_id = db.Column(db.Integer, primary_key=True)
    size = db.Column(db.Integer, nullable=False)
    oords = db.relationship('Oords', lazy=True, backref=db.backref('x', lazy='joined'))

    def __init__(self, capacity):
        self.size = size
Автор: dcole2929 Источник Размещён: 07.04.2017 07:36

Ответы (2)


1 плюс

550 Репутация автора

Вы должны использовать функцию обновления.

Как это:

from sqlalchemy import update

stmt = update(users).where(users.c.id==5).\
        values(name='user #5')

Или же :

session = self.db.get_session()
session.query(Organisation).filter_by(id_organisation = organisation.id_organisation).\
update(
    {
        "name" : organisation.name,
        "type" : organisation.type,
    }, synchronize_session = False)
session.commit();
session.close()

Документ sqlAlchemy: http://docs.sqlalchemy.org/en/latest/core/dml.html

Автор: PyNico Размещён: 07.04.2017 07:49

1 плюс

28959 Репутация автора

Решение

Учитывая ваш пример, ваши объекты результата не имеют атрибута some_property, как говорит исключение. (Ни один не делает Xобъекты модели , но я надеюсь, что это просто ошибка в примере.)

Они явно помечены totalкак второй столбец, а Xэкземпляр модели - как первый столбец. Если вы хотите получить доступ к свойству Xэкземпляра, сначала получите доступ к нему из строки результатов, используя индекс или неявную метку X :

items = db.session.query(X, func.count(Y.x_id).label('total')).\
    filter(X.size >= size).\
    outerjoin(Y, X.x_id == Y.x_id).\
    group_by(X.x_id).\
    order_by('total ASC').\
    limit(20).\
    all()

# Unpack a result object
for x, total in items:
   x.some_property = 'xyz'

# Please commit after *all* the changes.
db.session.commit()

Как отмечалось в другом ответе, вы также можете использовать массовые операции , хотя это limit(20)будет намного сложнее.

Автор: Ilja Everilä Размещён: 07.04.2017 09:12
Вопросы из категории :
32x32