如何更新查询

时间:2017-04-07 07:36:43

标签: python flask sqlalchemy flask-sqlalchemy

所以我是一个烧瓶/ 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

2 个答案:

答案 0 :(得分:1)

您应该使用更新功能。

就像那样:

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 doc:http://docs.sqlalchemy.org/en/latest/core/dml.html

答案 1 :(得分:1)

根据您的示例,您的结果对象没有属性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()

正如其他答案中所述,您也可以使用bulk operations,但您的limit(20)会使其更具挑战性。