2017-02-17 19 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將不會更容易?

(附註:這是所有的Python 3.6)

回答

1

db_session.query_property是根據你訪問它的類將返回一個Query的描述符。舉例來說,如果你有

class Foo(Base): 
    pass 

然後Foo.querydb_session.query(Foo)的簡寫。然後,因爲說db_session.query(Base)毫無意義,Base.query自然是None

+0

哇,現在有道理。嘿,這就是我總是使用'db_session.query'得到的結果。非常感謝。 – grochmal