所以我是一个烧瓶/ 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
答案 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)
会使其更具挑战性。