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 einemNone
zugeordnet werden? - Standardmäßig
Base
hat keinequery
Attribut, aber dann wäre es nicht einfacher zu tunBase.query = None
?
(P. S. Das ist alles Python 3,6)
Wow, es macht jetzt Sinn. Heh, das ist es, was ich bekomme, wenn ich 'db_session.query' benutze. Danke vielmals. – grochmal