sqlalchemy-查詢


User這個類創建的表                                User1這個類創建的表

 

 

基本查詢結果

# 1 查看sql原生語句
rs =session.query(User).filter(User.username=='budong')
print(rs)
# 2 query(module) .all()
rs =session.query(User).filter(User.username=='budong').all()  #  .all list
print(rs, type(rs[0]))          # 索引取值 當query(module) 類型為User類的實例對象
print(rs[0].username,rs[0].id)       # rs[0]這個實例對象通過.username,.id取得值
# 3 hasattr() getattr()
# 沒有這條數據則會報錯超出索引 先判斷是否存在hasattr() ,再取值getattr()數據不存在報錯
print(hasattr(rs[0], 'username'))   # 判斷是否有這個username屬性  返回值True False
if hasattr(rs[0], 'username'):
    print(getattr(rs[0],'username'))  # 安全取值
    print(rs[0].username)     

>>> True
>>> budong
>>> budong
# 4 .first()  [0]
rs =session.query(User).filter(User.username=='budong').first() # 返回一條數據,無則返回none
rs1 =session.query(User).filter(User.username=='budong')[0] # 取第一條數據無則報錯
print(rs, rs1,sep='\n')
print(rs.id, rs1.username)   # 取出值
if rs != None:
    print(rs)
>>> <User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>
   <User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)> >>> 1 budong >>> <User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>
# 5 query(module的屬性)
rs =session.query(User.id).filter(User.username=='tj').all() # all返回list
print(rs)     # list
print(rs[0])   #query(module的屬性) 返回結果為元祖
print(rs[0][0])

>>> [(2,)]
>>> (2,)
>>> 2
# 6 條件查詢
# filter_by(直接跟module的屬性,以字典形式傳參)  並且只能判斷 =
rs = session.query(User).filter_by(username='budong').all()
print(rs)
# filter(module.屬性)  能判斷 == != >=  常用
rs = session.query(User).filter(User.username=='budong').all()
print(rs)

>>> [<User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>, <User(id=5,username=budong,password=qweq,createtime=2018-03-08 05:10:38)>]
>>> [<User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>, <User(id=5,username=budong,password=qweq,createtime=2018-03-08 05:10:38)>]

模糊查詢

# 7 模糊查詢
    # like_  notlike
rs = session.query(User).filter(User.username.like('%don%')).all()
print(rs)
rs = session.query(User).filter(User.username.notlike('%don%')).all() # 相反
print(rs)
>>> [<User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>, <User(id=5,username=budong,password=qweq,createtime=2018-03-08 05:10:38)>] >>> [<User(id=2,username=tj,password=123qwe1,createtime=2018-03-07 16:54:09)>, <User(id=3,username=tj1,password=123qwe2,createtime=2018-03-07 16:58:09)>,
   <User(id=4,username=tj2,password=123qwe3,createtime=2018-03-07 16:07:09)>]
# 8 in_ notin                     滿足一個條件即可
rs = session.query(User).filter(User.username.in_(['budong','tj'])).all() print(rs) rs = session.query(User).filter(User.username.notin_(['budong','tj'])).all() # 相反 print(rs) >>> [<User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>, <User(id=2,username=tj,password=123qwe1,createtime=2018-03-07 16:54:09)>,
   <User(id=5,username=budong,password=qweq,createtime=2018-03-08 05:10:38)>] >>> [<User(id=3,username=tj1,password=123qwe2,createtime=2018-03-07 16:58:09)>, <User(id=4,username=tj2,password=123qwe3,createtime=2018-03-07 16:07:09)>]
# 9 is_ isnot is 用來判斷是否為空 是空則取值
rs = session.query(User.username).filter(User.username.is_(None)).all()
print(rs)
rs = session.query(User.username).filter(User.username.isnot(None)).all()  # 相反
print(rs)

>>> []
>>> [('budong',), ('tj',), ('tj1',), ('tj2',), ('budong',)]
# 10 limit  限制數據條數
rs =session.query(User).filter(User.username=='budong').all()
print(rs)
rs =session.query(User).filter(User.username=='budong').limit(1).all()
print(rs)

>>> [<User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>, <User(id=5,username=budong,password=qweq,createtime=2018-03-08 05:10:38)>]
>>> [<User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>]
# 11 offset(n) 不取前n條數據 稱為 偏移量:偏移n條數據
rs = session.query(User).filter(User.username=='budong').offset(1).all()
print(rs)

>>> [<User(id=5,username=budong,password=qweq,createtime=2018-03-08 05:10:38)>]
# 12 slice 切片 左閉右開
rs = session.query(User).filter(User.username=='budong').slice(0,1).all()
print(rs)

>>> [<User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>]
# 13 one 只有一條數據則取值 反之 報錯
# rs = session.query(User).filter(User.username=='budong').one()  # 滿足條件的超過1條,報錯
rs = session.query(User).filter(User.username=='tj').one()
print(rs)
>>> <User(id=2,username=tj,password=123qwe1,createtime=2018-03-07 16:54:09)>
# 14 order_by(*args) 排序(按asc)
    # 升序
rs = session.query(User.id).filter(User.username=='budong').order_by(User.id).all()
print(rs)
    # 降序 需導入降序desc
from sqlalchemy import desc
rs = session.query(User.id).filter(User.username=='budong').order_by(desc(User.id)).all()
print(rs)

>>> [(1,), (5,)]
>>> [(5,), (1,)]
# 15 group_by
from sqlalchemy import func,extract
    # 按query的屬性 進行分組 再統計該屬性的所有值出現的次數
rs = session.query(User.username,func.count(User.id)).group_by(desc(User.username)).all()
print(rs)

>>> [('tj2', 1), ('tj1', 1), ('tj', 1), ('budong', 2)]
# 16 group_by + having(判斷條件 常跟func的count sum avg 等使用) 先分組在執行having
rs = session.query(User.username,func.count(User.id)).group_by(desc(User.username)).\
    having(func.count(User.id)>1).all()
print(rs)
rs = session.query(User.username,func.max(User.id)).group_by(User.username).all()
print(rs)    # 通過username分組 多條數據的取id最大的那條
rs = session.query(User.username,func.min(User.id)).group_by(User.username).all()
print(rs)    # 通過username分組 多條數據的取id最小的那條

>>> [('budong', 2)]
>>> [('budong', 5), ('tj', 2), ('tj1', 3), ('tj2', 4)]
>>> [('budong', 1), ('tj', 2), ('tj1', 3), ('tj2', 4)]
# 17 extract 能獲取某部分時間(year,month,day,hour,minute,second) 進行分組及統計
rs = session.query(extract('minute',User.creatime).label('minute'),func.count('minute')).\
    group_by('minute').all()            # label 取別名
print(rs)

>>> [(7, 1), (10, 1), (54, 1), (57, 1), (58, 1)]
# 18 or_ 或者 滿足其中一個條件即可   類似in_ notin
rs = session.query(User.username).filter(or_(User.password=='qwe123',User.id>2)).all()
print(rs)

>>> [('budong',), ('tj1',), ('tj2',), ('budong',)]

User這個類創建的表                                User1這個類創建的表

 

# 19 多表查詢              
# mysql中的 內鏈接cross join 內鏈接inner join 兩者沒區別, 內鏈接的結果會產生笛卡兒積 table1(的每條數據) X table2(的所有數據)
rs = session.query(User.username,User1.name).filter(User.id==User1.id).all()   # 通過,直接query兩張表= select * from table1,table2 屬於內鏈接cross join
print(rs)
rs = session.query(User.username,User1.name).join(User1,User.id==User1.id).all() # join =內鏈接inner join
print(rs)
# mysql中的 外鏈接left join 和 外鏈接left outer join也沒區別
# 外鏈接outerjoin = left outer join     -- sqlalchemy  沒有right outer join
rs = session.query(User.username,User1.name).outerjoin(User1,User.id==User1.id).all()
print(rs)we
# 已左表為准   兩個表的數據並排顯示,左表有多少條數據則顯示多少,右邊有多余的數據則不取,少於的數據則顯示為None數據鏈接到左表
rs = session.query(User1.name,User.username).outerjoin(User,User.id==User1.id).all() #與上面相比交換表的位置
print(rs)

>>> [('budong', 'D'), ('tj', 'A'), ('tj1', 'B'), ('tj2', 'C')]
>>> [('budong', 'D'), ('tj', 'A'), ('tj1', 'B'), ('tj2', 'C')]
>>> [('budong', 'D'), ('tj', 'A'), ('tj1', 'B'), ('tj2', 'C'), ('budong', None)]
>>> [('D', 'budong'), ('A', 'tj'), ('B', 'tj1'), ('C', 'tj2')]
# 20 聯合查詢 兩個表並排顯示
rs1 = session.query(User1.name)
rs2 = session.query(User.username)
print(rs1.union(rs2).all())        # union 去重 
print(rs1.union_all(rs2).all())    # 顯示所有包括重復的數據  'budong'為重復的數據

>>> [('D',), ('A',), ('B',), ('C',), ('budong',), ('tj',), ('tj1',), ('tj2',)]
>>> [('D',), ('A',), ('B',), ('C',), ('budong',), ('tj',), ('tj1',), ('tj2',), ('budong',)]
# 21 子表查詢   cross join 產生笛卡兒積
# 原生sql是 select * from table1,table2; table2是這兒的子表 # 聲明子表subquery() 子表可以是多個表取出的數據 所以比直接使用 cross join or inner join 能查更多表的相關數據 sql = session.query(User1.name).subquery() # 父表的每一條數據都匹配子表的所有數據 print(session.query(User.username,sql.c.name).all()) # 固定寫法 申明子表的sql.c.屬性 >>> [('budong', 'D'), ('tj', 'D'), ('tj1', 'D'), ('tj2', 'D'), ('budong', 'D'), ('budong', 'A'), ('tj', 'A'), ('tj1', 'A'), ('tj2', 'A'), ('budong', 'A'),
   ('budong', 'B'), ('tj', 'B'), ('tj1', 'B'), ('tj2', 'B'), ('budong', 'B'), ('budong', 'C'), ('tj', 'C'), ('tj1', 'C'), ('tj2', 'C'), ('budong', 'C')]

 原生sql語句查詢

# 原生SQL查詢
sql_1='select username from `user`'
row = session.execute(sql_1)      # row =5條數據  row是一個對象 可以 for in 取值 dir(對象)
print(row.fetchone())   # 取出第一條數據  row -1 =4
print(row.fetchmany(2)) # 去出兩條數據    row -2 =2
print(row.fetchall())  # 取出所有的數據  row =0

>>> ('budong',)
>>> [('tj',), ('tj1',)]
>>> [('tj2',), ('budong',)]

   sql是字符串 可以用到字符串拼接

sql = '''
    select * from user where id<%s;
''' %(3)
row = session.execute(sql)
for i in row:
    print(i)   # 元祖

>>> (1, 'budong', 'qwe123', datetime.datetime(2018, 3, 7, 16, 57, 9))
>>> (2, 'tj', '123qwe1', datetime.datetime(2018, 3, 7, 16, 54, 9))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM