2017-02-17 9 views
0

В official Flask documentation for declarative use of SQLalchemy следующие отрезала используется:SQLalchemy, почему колбы наборы 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() 

Теперь, я просто не понимаю, что делает последняя строка. то есть

Base.query = db_session.query_property() 

Выполняет. Почему эта линия там?

В моем приложении я просто использую db_session для каждой операции с базой данных. Теперь я немного поиграл с этим и обнаружил, что в контексте интерактивного сеанса или простого скрипта python эта строка ничего не выполняет!

Например этот скрипт печатает 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) 

И так это делает один:

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) 

Так что я в недоумении. Возвращенный базовый объект имеет __setattr__, который запретит установку Base.query.

  • Что это должно делать?
  • И почему мои тесты приводят к Base.query, назначаемым None?
  • По умолчанию Base не имеет атрибута query, но тогда было бы проще просто сделать Base.query = None?

(постскриптум Это весь питон 3,6)

ответ

1

db_session.query_property является дескриптором, который возвращает вам Query на основе класса доступа к которому осуществляется с. Например, если у вас есть

class Foo(Base): 
    pass 

затем Foo.query является обобщающим для db_session.query(Foo). Тогда, потому что не имеет смысла говорить db_session.query(Base), Base.query естественно None.

+0

Вау, теперь это имеет смысл. Хех, это то, что я получаю от использования db_session.query'. Большое спасибо. – grochmal