from datetime import datetime from sqlalchemy import Column,Integer,String,Boolean,DateTime,ForeignKey from sqlalchemy.orm import relationship from .connect import Base,session class User(Base): __tablename__='user' id=Column(Integer,primary_key=True,autoincrement=True) username=Column(String(20),nullable=False) passwd=Column(String(50),nullable=False) createtime=Column(DateTime,default=datetime.now) _locked=Column(Boolean,default=False,nullable=False) #在modules中寫好查詢條件,使用時直接調用 @classmethod def all(cls): return session.query(cls).all() @classmethod def by_name(cls,username): return session.query(cls).filter_by(username=username).all() @property def locked(self): return self._locked def __repr__(self): return '<User(id=%s,username=%s,passwd=%s,createtime=%s,_locked=%s)>'%( self.id, self.username, self.passwd, self.createtime, self._locked ) class UserDetails(Base): __tablename__='user_details' id=Column(Integer,primary_key=True,autoincrement=True) id_card=Column(Integer,nullable=True,unique=True) last_login=Column(DateTime) login_num=Column(Integer,default=0) user_id=Column(Integer,ForeignKey('user.id')) #bakcref創建反向索引, userdetails_for_foreignkey=relationship('User',backref='details',uselist=False,cascade='all') def __self__(self): return '<UserDetails(id=%s,id_card=%s,last_login=%s,login_num=%s,user_id=%s)>'%( self.id, self.id_card, self.last_login, self.login_num, self.user_id ) if __name__=='__main__': Base.metadata.create_all()
from data.user_modules import User,session,UserDetails #帶條件查詢 raw=session.query(User).filter_by(username='nanian').all() raw=session.query(User).filter_by(username='nanian') #去掉.all()原生sql raw=session.query(User).filter(User.username =='nanian').all() raw=session.query(User.username).filter(User.username !='nanian').all() raw=session.query(User.username).filter(User.username !='nanian').first() raw=session.query(User.username).filter(User.username !='nanian').one() #若是前面查出的是多條數據則報錯 print(session.query(User).get(2)) #根據主鍵查,會本身找主鍵 print(raw) #限制查詢結果數 print(session.query(User).filter(User.username!='nanian').limit(3).all())#前三行 print(session.query(User).filter(User.username!='nanian').offset(3).all())#第三行之後 print(session.query(User).filter(User.username!='nanian').slice(1,3).all())#2,3行 #排序 from sqlalchemy import desc raw=session.query(User).filter(User.username !='nanian').order_by(User.username).all() raw=session.query(User).filter(User.username !='nanian').order_by(desc(User.username).all()#逆序 #模糊查詢 儘可能少用模糊查詢,效率低 from sqlalchemy import or_ raw=session.query(User).filter(User.username!='nanian').all() raw=session.query(User).filter(User.username.like('n%').all() raw=session.query(User).filter(User.username.notlike('n%').all() raw=session.query(User).filter(User.username.in_(['nanian','a']).all()) #加下劃線表示和python關鍵字做區分 raw=session.query(User).filter(User.username.isnot(None),User.passwd=='123').all()) #多條件 raw=session.query(User).filter(or_(User.username.isnot(None),User.passwd=='123')).all()) #或 raw=session.query(User).filter(User.username==None).all()) #聚合函數 from sqlalchemy import func,extract print(session.query(User.passwd,func.count(User.id)).group_by(User.passwd).all()) print(session.query(User.passwd,func.count(User.id)).group_by(User.passwd).\ having(func.count(User.id)>1) all()) print( session.query(extract('minute',User.createtime).label('minute'),\ func.count(User.id)).group_by('minute').all() ) #提取分鐘,按分鐘分組 #多表查詢 raw=session.query(User,UserDetails).all() raw=session.query(User,UserDetails).filter(UserDetails.id==User.id) all()# cross join raw=session.query(User.username,UserDetails.last_login).\ join(UserDetails, UserDetails.id==User.id) all()# inner join raw=session.query(User.username,UserDetails.last_login).\ outerjoin(UserDetails, UserDetails.id==User.id) all() # outer join表明left join 左鏈接,右鏈接將表反過來(sqlalchemy沒有rightjoin),小表左鏈接右表效率高 q1=session.query(User.id) q2=session.query(UserDetails.id) raw=q1.union(q2).all() from sqlalchemy import all_,any_ sql_0=session.query(UserDetails.last_login).subquery() #聲明子表 raw=session.query(User).filter(User.createtime >all_(sql_0)).all() raw=session.query(User).filter(User.createtime >any_(sql_0)).all() #原生sql sql_1=''' select * from `user` ''' raw=session.execute(sql_1) #print(raw,dir(raw)) #print(raw.fetchone()) #print(raw.fetchmany()) #print(raw.fetchall()) for i in raw: print(i)