sqlalchemy的使用總結

sqlalchemy的概念已經太多網站可以查到,在這裏不再贅述,直接說如何使用

  1. 創建,創建的表和MySQL中的表要一一對應,實際上這個就是和MySQL的表的映射關係
  2. 增加
			xz_adcodes = XzBranches.session.query(XzBranches).all()
            for i in xz_adcodes:
                article1 = CodeBranches(name=i.name, adcode=i.adcode,citycode=i.citycode)
                CodeBranches.session.add(article1)
                CodeBranches.session.commit()
        其中XzBranches和CodeBranches是兩個數據表,以上的操作等價於

insert into gd_adcode_count(name,adcode,citycode) select name,adcode,citycode from xz_city_adcode
將表xz_city_adcode 中的數據複製到gd_adcode_count這個表中。

xz_adcodes = XzBranches.session.query(XzBranches).all() -------------> all() 函數表示獲取到全部的信息,但是這裏的信息必須要遍歷纔會出現,否則會返回一個對象

article1 = CodeBranches(name=i.name, adcode=i.adcode,citycode=i.citycode)
CodeBranches.session.add(article1)
這兩句話是指將獲取到的值依次的插入到表CodeBranches 中

最後要注意,一定要提交,否則是無效的
3. 更新

sql2 = "update gd_adcode_count set keywords='%s' where keywords is null"%self.names[i]

等價於:

CodeBranches.session.query(CodeBranches).filter_by(keywords=None).update({"keywords": self.names[i]})
CodeBranches.session.commit()

整句話用中文解釋一下就是: 將關鍵字爲空的字段,全部填寫爲self.names[0] 的字段。
其中,值得一提的是,我們要如何表達關鍵字爲空,在這裏,網上的很多用法都是錯誤的
我們應該寫成keywords=None,不是== , 並且None 也不需要加引號。

還有就是,update是需要寫成字典的形式,而不是依次賦值,這樣也是錯的。

4 查詢

今天寫查詢的時候發現,查詢key不爲空的時候,無法查詢,所以看了一下別人都是怎麼寫的,發現不僅僅有filter_by() 這個函數,還有filter() 這個函數,filter() 中可以使用 != 等符號,但是filter_by 是不可以的

還有就是查詢之後的函數的使用:

print( session.query(User).filter(User.username=='jingqi').all() )
print( session.query(User).filter(User.username=='jingqi').first())
print( session.query(User).filter(User.username=='jingqi').one())#結果爲一個時正常,多了就報錯
print( session.query(User).get(2))#通過id查詢

使用limit offset slice等函數進行查詢

#限制查詢返回結果
print( session.query(User).filter(User.username!='jingqi').limit(2).all())
print( session.query(User).filter(User.username!='jingqi').offset(2).all())
print( session.query(User).filter(User.username!='jingqi').slice(2,3).all())
 #可以排序之後再進行限制
 from sqlalchemy import desc
 print( session.query(User).filter(User.username!='budong').order_by(User.username).all())
 print( session.query(User).filter(User.username!='budong').order_by(desc(User.username)).slice(1,3).all())

第一個是限制返回條數,從第一條開始;第二個是從第三條開始返回查詢結果;第三個是切片返回記錄。

order_by默認是順序,desc是降序。

其他的函數查詢,注意:模糊匹配是十分耗費時間的,能不用就儘量不要用。

#不等於
print( session.query(User).filter(User.username!='jingqi').all() )
#模糊匹配 like
print( session.query(User).filter(User.username.like('jingqi')).all() )
print( session.query(User).filter(User.username.notlike('jingqi')).all() )
#成員屬於  in_
print( session.query(User).filter(User.username.in_(['jingqi','jingqi1'])).all() )
#成員不屬於  notin_
print( session.query(User).filter(User.username.notin_(['jingqi','jingqi2'])).all() )
#空判斷
print( session.query(User).filter(User.username==None).all() )
print( session.query(User).filter(User.username.is_(None)).all() )
print( session.query(User).filter(User.username.isnot(None)).all() )
#多條件
print( session.query(User).filter(User.username.isnot(None),User.password=='qwe123').all() )
#選擇條件
from sqlalchemy import or_,and_,all_,any_
print( session.query(User).filter(or_(User.username=='jingqi',User.password=='qwe123')).all() )
print( session.query(User).filter(and_(User.username=='jingqi2',User.password=='111')).all() )

聚合函數的使用

from sqlalchemy import func,extract
print( session.query(User.password,func.count(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.count(User.id)).group_by(User.password).having(func.count(User.id)>1).all() )
print( session.query(User.password,func.sum(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.max(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.min(User.id)).group_by(User.password).all() )
#使用extract提取時間中的分鐘或者天來分組
print( session.query(extract('minute', User.creatime).label('minute'),func.count('*').label('count')).group_by('minute').all() )
print( session.query(extract('day', User.creatime).label('day'),func.count('*').label('count')).group_by('day').all() )

這裏只是告訴大家的用法,其中group_by是分組,如果要使用聚合函數,就必須導入func,label是取別名的意思 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章