SQLAlchemy查詢sql
結果查詢:session
1 from databases.wechat import User 2 from config import session 3 4 5 def search(): 6 result = session.query(User).all() # 查詢全部 7 result = result[0] # 索引取值 8 print(result.username) # 對象屬性查詢 9 session.query(User).first() # 查詢第一條 10 11 session.query(User).filter(User.username == 'bob').all() # 按條件查詢全部 12 13 14 if __name__ == '__main__': 15 search()
條件查詢函數
1 from databases.wechat import User 2 from config import session 3 4 5 def search(): 6 # query接收一個查詢範圍,fillter增長查詢條件的約束 7 result = session.query(User.username).filter(User.username=='bob').all() # [('bob',)] 8 result = session.query(User.username).filter_by(username='bob').all() # [('bob',)] 9 """ 10 fillter和filter_by 11 fillter能夠進行比較運算(==, >, < ...)來對條件進行靈活的運用, 不一樣的條件用','(逗號)分割 12 fillter_by只能指定參數傳參來獲取查詢結果 13 """ 14 15 16 17 if __name__ == '__main__': 18 search()
query接收一個查詢範圍多個範圍用逗號隔開,fillter增長查詢條件的約束
fillter和filter_by
fillter能夠進行比較運算(==, >, < ...)來對條件進行靈活的運用, 不一樣的條件用','(逗號)分割
fillter_by只能指定參數傳參來獲取查詢結果
模糊查詢fetch
1 from databases.wechat import User 2 from config import session 3 4 5 def search(): 6 # like裏面傳入一個字符串,不肯定的位置用%代替便可 7 result = session.query(User.username).filter(User.username.like('b%')).all() # [('bob',)] 8 # notlike取like的取反結果 9 result = session.query(User.username).filter(User.username.notlike('b%')).all() 10 # is_ 至關於 == 11 result = session.query(User.username).filter(User.username.is_(None)).all() 12 result = session.query(User.username).filter(User.username == None).all() 13 # isnot 至關於 != 14 result = session.query(User.username).filter(User.username.isnot(None)).all() 15 result = session.query(User.username).filter(User.username != None).all() 16 # in_傳入一個可迭代對象,對前面的username進行約束, notin_ 和in_取反 17 result = session.query(User.username).filter(User.username.in_(['bob', 'ivy1'])).all() 18 result = session.query(User.username).filter(User.username.notin_(['bob', 'ivy1'])).all() 19 # limit 限制數量查詢, limit裏傳入一個整型來約束查看的數量, 當limit裏面的參數大於實例表中的數量時,會返回全部的查詢結果 20 result = session.query(User.username).limit(6).all() 21 # offset 偏移量查詢,offset中傳入一個整型,從表中的該位置開始查詢,offset能夠和limit混用來進行限制 22 result = session.query(User.username).offset(1).all() 23 result = session.query(User.username).offset(1).limit(6).all() 24 # slice 切片查詢,遵循左閉右開原則,能夠和offset、limit混用 25 result = session.query(User.username).slice(1, 3).offset(2).limit(6).all() 26 # one 獲取查詢對象的一條,且查詢的結果有且僅有一條,但查詢結果多了的時候會報錯 27 result = session.query(User.username).filter_by(username='bob').one() 28 29 30 31 32 if __name__ == '__main__': 33 search()
like裏面傳入一個字符串,不肯定的位置用%代替便可
notlike取like的取反結果
is_ 至關於 ==
isnot 至關於 !=
in_傳入一個可迭代對象,對前面的username進行約束, notin_ 和in_取反
limit 限制數量查詢, limit裏傳入一個整型來約束查看的數量, 當limit裏面的參數大於實例表中的數量時,會返回全部的查詢結果
offset 偏移量查詢,offset中傳入一個整型,從表中的該位置開始查詢,offset能夠和limit混用來進行限制
slice 切片查詢,遵循左閉右開原則,能夠和offset、limit混用
one 獲取查詢對象的一條,且查詢的結果有且僅有一條,但查詢結果多了的時候會報錯
1 from databases.wechat import User 2 from config import session 3 from sqlalchemy import desc 4 5 def search(): 6 # 升序排列 7 result = session.query(User.username, User.id).order_by(User.id).all() 8 # 降序排列 9 result = session.query(User.username, User.id).order_by(desc(User.id)).all() 10 # 結合filter查詢 11 result = session.query(User.username, User.id).order_by(User.id).filter(User.username != 'bob').all() 12 result = session.query(User.username, User.id).filter(User.username != 'bob').order_by(User.id).all() 13 14 15 16 17 if __name__ == '__main__': 18 search()
排序查詢,排序查詢可結合filter、limit、slice等綜合運用spa
聚合函數code
1 from databases.wechat import User 2 from databases.config import session 3 from sqlalchemy import func, extract 4 5 6 def search(): 7 # count 8 result = session.query(User.password, func.count(User.id)).group_by(User.password).all() 9 # sum 10 result = session.query(User.password, func.sum(User.id)).group_by(User.password).all() 11 # max 12 result = session.query(User.password, func.max(User.id)).group_by(User.password).all() 13 # min 14 result = session.query(User.password, func.min(User.id)).group_by(User.password).all() 15 # having 16 result = session.query(User.password, func.count(User.id)).group_by(User.password).having(func.count(User.id) > 1).all() 17 # label extract 18 result = session.query( 19 extract('minute',User.create_time).label('minute'), 20 func.count(User.id) 21 ).group_by('minute') 22 # 想當於-->SELECT EXTRACT(minute FROM user.create_time) AS minute, count(user.id) AS count_1 FROM user GROUP BY minute 23 24 if __name__ == '__main__': 25 search()
多表查詢對象
1 from databases.config import Base 2 from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey 3 from datetime import datetime 4 5 class User(Base): 6 __tablename__ = 'user' 7 id = Column(Integer, primary_key=True, autoincrement=True) 8 username = Column(String(20)) 9 password = Column(String(20)) 10 create_time = Column(DateTime, default=datetime.now()) 11 is_login = Column(Boolean, default=False, nullable=False) 12 13 14 class UserDetails(Base): 15 __tablename__ = 'userdetails' 16 id = Column(Integer, primary_key=True, autoincrement=True) 17 id_card = Column(Integer, nullable=True, unique=True) 18 last_login = Column(DateTime) 19 login_num = Column(Integer, default=0) 20 user_id = Column(Integer, ForeignKey('user.id')) # user.id 表名+屬性名 21 22 23 24 if __name__ == '__main__': 25 Base.metadata.create_all()
新建表blog
1 from databases.wechat import User, UserDetails 2 from databases.config import session 3 4 5 def search(): 6 # 笛卡爾鏈接 7 result = session.query(User, UserDetails) 8 # SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.create_time AS user_create_time, user.is_login AS user_is_login, userdetails.id AS userdetails_id, userdetails.id_card AS userdetails_id_card, userdetails.last_login AS userdetails_last_login, userdetails.login_num AS userdetails_login_num, userdetails.user_id AS userdetails_user_id FROM user, userdetails 9 # 加filter查詢 10 result = session.query(User, UserDetails).filter(UserDetails.id==User.id).all() 11 result = session.query(User.username, UserDetails.id_card).join(UserDetails, UserDetails.id==User.id).filter(UserDetails.id==User.id) 12 # SELECT user.username AS user_username, userdetails.id_card AS userdetails_id_card FROM user INNER JOIN userdetails ON userdetails.id = user.id WHERE userdetails.id = user.id 13 14 15 16 17 18 if __name__ == '__main__': 19 search()
原生sql查詢sqlalchemy
1 from databases.config import session 2 3 4 def search(): 5 sql = 'select * from user ' 6 result = session.execute(sql) 7 result.fetchone() 8 result.fetchmany() 9 result.fetchone() 10 11 12 13 14 if __name__ == '__main__': 15 search()