2017-04-07 1 views
0

Also ich bin ein Kolben/sqlalchemy Neuling, aber das scheint wie es sollte ziemlich einfach sein. Doch für das Leben von mir kann ich es nicht zur Arbeit bringen und ich kann keine Dokumentation dafür online finden. Ich habe eine etwas komplexe Abfrage ausgeführt, die mir eine Liste von Datenbankobjekten zurückgibt.Wie aktualisiert Objekt zurückgegeben in Abfrage

nachdem ich diese Liste der Elemente, die ich durch die Liste durchlaufen möchten, und für jedes Element aktualisieren einige Eigenschaft auf es.

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

jedoch, was passiert ist, dass ich einen Fehler bekommen

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

ich bin nicht verrückt. Ich bin sicher, dass die Eigenschaft auf Modell X existiert, das von db.Model abgeleitet ist. Etwas an der Abfrage verhindert, dass ich auf die Attribute zugreife, obwohl ich deutlich erkenne, dass sie im Debugger vorhanden sind. Jede Hilfe wäre willkommen.

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 

Antwort

1

Ihr Beispiel Ihr Ergebnis Objekte Gegeben haben nicht das Attribut some_property, genau wie die Ausnahme sagt. (Auch nicht X Objekte modellieren, aber ich hoffe, das ist nur ein Fehler im Beispiel.)

Sie haben die explizit total als zweite Säule und die Modell X Instanz als erste Spalte markiert. Wenn Sie eine Eigenschaft der X Instanz zugreifen bedeuten zu, den Zugang, die zuerst von der Ergebniszeile, entweder Index verwenden oder die implizite Label 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() 

Wie in der anderen Antwort darauf hingewiesen, könnten Sie bulk operations verwenden als gut, obwohl Ihre limit(20) wird das viel schwieriger machen.

+0

Das war genau das, was ich gesucht habe. Vielen Dank. – dcole2929

+0

Das Überschreiben der Klassenvariablen mit den Instanzen in der for-Schleife wurde korrigiert. Ein Überbleibsel vom ersten Gedanken daran, 'it.X' zu schreiben, aber dann mit dem Auspacken. –

1

Sie sollten die Update-Funktion verwenden.

wie folgt aus:

from sqlalchemy import update 

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

Oder:

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() 

Die sqlalchemy doc: http://docs.sqlalchemy.org/en/latest/core/dml.html

Verwandte Themen