用 sqlalchemy 進行簡單的查詢:
# -*- coding:utf-8 -*-
__author__ = '東方鶚'
__blog__ = 'http://www.os373.cn'
from models import session, Employee, Department, DeptEmp, DeptManager, Salary, Title
# 初始化數(shù)據(jù)庫連接:
engine = create_engine('mysql+pymysql://root:password@127.0.0.1:3306/employees', echo=True)
# 創(chuàng)建DBSession類型:
DBSession = sessionmaker(bind=engine)
session = DBSession
data = session.query(Employee).all()
session.commit()
for d in data:
print(d.emp_no, d.birth_date, d.first_name, d.last_name, d.gender, d.hire_date)
然后打印出來的結(jié)果如下:
根據(jù)圖片所示,難道 sqlalchemy 把所有的內(nèi)容查詢出來之后,如果要顯示每條的明細,還得從數(shù)據(jù)庫里一條一條的查詢出來嗎???
sqlalchemy把所有內(nèi)容查詢出來后,顯示明細,確實是還需要從數(shù)據(jù)庫中一條一條的查詢出來。
只不過這個查詢不是從物理db中查詢,而是從虛擬內(nèi)存db中查詢。
(注:以下說法均為個人從日常實踐及對sqlalchemy的理解中得出的,官方具體怎么樣沒有實際佐證)
create_engine時會調(diào)用create_all()方法,這時將會在內(nèi)存中創(chuàng)建一個虛擬數(shù)據(jù)庫表。
查詢操作會將數(shù)據(jù)庫中的數(shù)據(jù)加載至內(nèi)存,調(diào)用明細時會對內(nèi)存中的表進行查詢操作。
# 1. 類似于下面的這種操作是不會觸發(fā)物理db的相關操作的,只是生成一段用于在物理db中執(zhí)行的sql
query_str = Model.query.filter(...).order_by(...).with_entities(...)
# 2. query_str執(zhí)行get()、all()、first()、one_or_none()等操作時,才會在鏈接物理db并執(zhí)行操作。
# 3. sqlalchemy會將返回結(jié)果保存至內(nèi)存中,最為緩存,供用戶查詢相關明細。
# 4. 至于查詢明細的方式,本質(zhì)上估計類似于dict.get(key)這種,具體的要看sqlalchemy以什么數(shù)據(jù)結(jié)構(gòu)
# 在內(nèi)存中保存查詢信息了,個人未關注過
# 5. db.commit()操作會觸發(fā)類似flush()的操作,這時會將緩存中的信息清空。例:
# 會在物理db中執(zhí)行select * from model where id = 1;
result = Model.query.get(1)
# 內(nèi)存中去查詢name,不會涉及到物理db
print result.name
# 內(nèi)存清空
db.commit()
# 兩步操作,①select * from model where id = 1;②從內(nèi)存中去拿name
print result.name
# 注:for循環(huán)等遍歷操作會默認觸發(fā)all()方法,例:# 生成sql,select * from model;但未與物理db有相關交互。query = Model.query# 等價于 for res in query.all(),在物理db中執(zhí)行相關sqlfor res in query: # 從內(nèi)存中查詢id print res.id
# 剛上邊那段瞎說了,請忽略,下面為更正信息
# 生成sql,select * from model;但未與物理db有相關交互。
# query現(xiàn)在為一個str,及query = 'select * from model'
query = Model.query
# 等價于 for res in query.all(),在物理db中執(zhí)行相關sql
# 現(xiàn)假設query中有三個結(jié)果[res1, res2, res3]
# 執(zhí)行完后query為查詢結(jié)果集合,query=[res1, res2, res3]
for res in query:
# 從內(nèi)存中查詢id
print res.id
# 清空緩存,但[res1, res2, res3]對象是保留的,及query=[res1, res2, res3]
db.commit()
# 等價于 for res in [res1, res2, res3]:
for res in query:
# 兩部操作:①select * from model where id = res.id,從內(nèi)存中查詢id
# 及commit后res1為detached狀態(tài),res.id后為attached狀態(tài)
print res.id
在SQLAlchemy中一個Session(可以看作)是一個transaction,每個操作(基本上)對應一條或多條SQL語句,這些SQL語句需要發(fā)送到數(shù)據(jù)庫服務器才能被真正執(zhí)行,
附上大佬鏈接https://segmentfault.com/q/10...
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構(gòu),發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。