1. 程式人生 > >sqlalchemy多表查詢

sqlalchemy多表查詢

mit lena color clas primary eat select boolean false

技術分享
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()
user_modules.py 技術分享
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)
query.py

sqlalchemy多表查詢