2017-04-07 14 views
0

私はフラスコ/ 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' 

を取得していますということです。私はプロパティがdb.Modelからサブクラス化されたモデルXに存在するということは肯定的です。クエリに関する何かが、私がそれらがデバッガに存在することをはっきりと見ることができますが、私が属性にアクセスするのを妨げています。どんな助けもありがとう。

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 

答えて

1

あなたの例を考えると、あなたの結果は同じように、は属性some_propertyを持っていないオブジェクト例外は言う。 (どちらもXオブジェクトをモデル行いませんが、私はそれがちょうど例のエラー願っています。)

彼らは明示的に第二カラムと最初の列としてモデルXインスタンスとしてtotalのラベルが付いています。あなたが最初の結果行から、どちらかの指標を用い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)はそれをもっと挑戦します。

+0

これはまさに私が探していたものでした。ありがとうございました。 – dcole2929

+0

for-loop内のインスタンスでクラス変数を上書きすることを修正しました。最初に 'it.X'と書いてみたが、解凍して行くつもりだった。 –

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のドキュメント:http://docs.sqlalchemy.org/en/latest/core/dml.html

関連する問題