2016-08-03 12 views
0

Neu bei sqlalchemy und etwas Anfänger mit Programmierung und Python. Ich wollte einen Tisch abfragen. Es scheint, dass ich die all() - Funktion beim Abfragen verwenden kann, aber nicht filtern kann, ohne eine Klasse zu erstellen.Warum verwenden Sie sqlalchemy deklarative API?

1.) Kann ich filtern, ohne eine Klasse zu erstellen und die deklarative API zu verwenden? Ist das unten aufgeführte Filterbeispiel falsch? 2.) Wann wäre es angebracht, deklarative API in sqlalchemy zu verwenden und wann wäre es nicht angemessen?

import sqlalchemy as sql 
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.orm import sessionmaker 

db = sql.create_engine('postgresql://postgres:[email protected]:5432/postgres') 
engine = db.connect() 
meta = MetaData(engine) 
session = sessionmaker(bind=engine) 
session = session() 

files = Table('files',meta, 
Column('file_id',Integer,primary_key=True), 
Column('file_name',String(256)), 
Column('query',String(256)), 
Column('results',Integer), 
Column('totalresults',Integer), 
schema='indeed') 

session.query(files).all() #ok 
session.query(files).filter(files.file_name = 'test.json') #not ok 

Antwort

1

Wenn Sie von einem Table Konstrukt filtern möchten, sollte es sein:

session.query(files).filter(files.c.file_name == 'test.json') 

Sie müssen kartiert Klassen erstellen, wenn Sie die ORM-Funktionen von SQLAlchemy verwenden möchten. Zum Beispiel mit dem Code, den Sie zur Zeit haben, um ein Update Sie

session.execute(files.update().values(...)) 

Im Gegensatz zu tun haben zu tun:

file = session.query(File).first() 
file.file_name = "new file name" 
session.commit() 

Die deklarative API die einfachste Art und Weise des Konstruierens abgebildet werden passiert Klassen, verwenden Sie es also, wenn Sie das ORM verwenden möchten.

+0

Danke! Es scheint, dass ich 'execute()' für 'Table'/core-Konstrukte verwenden müsste, da ich ein 'Schlüsselwort kann kein Ausdruck' bekommen kann. – Jimmy

+1

@Jimmy "Schlüsselwort kann kein Ausdruck sein" ist ein SyntaxError, der angibt, dass Sie den Zuweisungsoperator '=' anstelle des Gleichheitsvergleichsoperators '==' verwenden. – univerio

+0

@univerlo Doh! Danke, es funktioniert jetzt. – Jimmy

1

Filter auf diese Weise deklarative api mit:

session.query(files).filter(files.file_name == 'test.json').all() 

Sie auch rohe SQL-Abfragen (docs) verwenden können.

Ob die Verwendung von deklarativen APIs oder nicht, hängt von der Komplexität Ihrer Abfragen ab, da sqlalchemy sie manchmal nicht richtig optimiert.

+0

Danke! Es scheint, dass deklarative ist der Weg zu gehen, da die Ausdrücke einfacher sind. Ich müsste 'execute()' verwenden und sonst root sql eingeben. – Jimmy

Verwandte Themen