2017-02-17 4 views
0

Im official Flask documentation for declarative use of SQLalchemy wird die folgende snipped verwendet:SQLalchemy, warum Flaschensets Base.query?

from sqlalchemy import create_engine 
from sqlalchemy.orm import scoped_session, sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 

engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True) 
db_session = scoped_session(sessionmaker(autocommit=False, 
             autoflush=False, 
             bind=engine)) 
Base = declarative_base() 
Base.query = db_session.query_property() 

Nun, ich einfach nicht verstehen, was die letzte Zeile tut. d.h. was macht

Base.query = db_session.query_property() 

Führt aus. Warum ist diese Linie da drin?

In meiner App verwende ich einfach db_session für jede Datenbankoperation. Jetzt habe ich ein wenig damit gespielt und festgestellt, dass diese Zeile im Kontext einer interaktiven Sitzung oder eines einfachen Python-Skripts nichts ausführt!

Zum Beispiel dieses Skript druckt True

import sqlalchemy as sq 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker, scoped_session 
eng = sq.create_engine('sqlite://') 
Base = declarative_base() 
db_session = scoped_session(sessionmaker(bind=eng)) 
Base.query = db_session.query_property() 
Base.query 
print(Base.query == None) 

Und so tut dieses:

import sqlalchemy as sq 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker, scoped_session 
eng = sq.create_engine('sqlite://') 
Base = declarative_base(bind=eng) ### the difference is here 
db_session = scoped_session(sessionmaker(bind=eng)) 
Base.query = db_session.query_property() 
Base.query 
print(Base.query == None) 

Also ich ratlos bin. Das zurückgegebene Basisobjekt scheint eine __setattr__ zu haben, die die Einstellung Base.query nicht zulässt.

  • Was sollte diese Aufgabe tun?
  • Und warum meine Tests ergeben Base.query mit einem None zugeordnet werden?
  • Standardmäßig Base hat keine query Attribut, aber dann wäre es nicht einfacher zu tun Base.query = None?

(P. S. Das ist alles Python 3,6)

Antwort

1

db_session.query_property ist ein Schlagwort, das Sie eine Query liefert basierend auf der Klasse Sie es aus abgerufen. Zum Beispiel, wenn Sie haben

class Foo(Base): 
    pass 

dann ist Foo.query eine Abkürzung für db_session.query(Foo). Dann, weil es keinen Sinn macht zu sagen db_session.query(Base), Base.query ist natürlich None.

+0

Wow, es macht jetzt Sinn. Heh, das ist es, was ich bekomme, wenn ich 'db_session.query' benutze. Danke vielmals. – grochmal