1.什么是sqlalchemy?
sqlalchemy是Python ORM的開源框架妈嘹,使用它可以快速方便的構建數(shù)據(jù)庫模型
2.如何使用sqlalchemy柳琢?
1.安裝
pip3 install sqlalchemy
2.導包
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import NullPool
3.連接
engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:3306/test?charset=utf8',
max_overflow=0, # 超過連接池大小外最多創(chuàng)建的連接,為0表示超過5個連接后,其他連接請求會阻塞 (默認為10)
encoding='utf-8', # 編碼格式
echo=True, # 是否開啟sql執(zhí)行語句的日志輸出
pool_timeout=30, # 連接線程池中柬脸,沒有連接時最多等待的時間他去,不設置無連接時直接報錯 (默認為30)
pool_recycle=-1, # 多久之后對線程池中的線程進行一次連接的回收(重置) (默認為-1),其實session并不會被close
poolclass=NullPool # 無限制連接數(shù)
)
4.創(chuàng)建 session
#聲名Base
Base = declarative_base()
# 創(chuàng)建數(shù)據(jù)表
Base.metadata.create_all(engine)
#創(chuàng)建session
db_session = sessionmaker(bind=engine)
5.創(chuàng)建表
# 創(chuàng)建類,繼承基類倒堕,用基本類型描述數(shù)據(jù)庫結構
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, )
name = Column(String(64))
psw = Column(String(64))
psw_remark = Column(String(128))
__table_args__ = {
"mysql_charset": "utf8"
}
def obj_2_json(self):
return {
'id': self.id,
'name': self.name,
'psw': self.psw,
'psw_remark': self.psw_remark
}
def __repr__(self):
return 'id:%d,name=%s,psw=%s,psw_remark=%s' % (self.id if self.id else 0, self.name, self.psw, self.psw_remark)
6.操作表
# 保存記錄
def save(user):
is_success = True
session = db_session()
try:
session.add(user)
session.commit()
print(user)
except BaseException:
is_success = False
print('error=', traceback.format_exc())
session.close()
return is_success
# 根據(jù)ID刪除
def delete(id):
is_success = True
session = db_session()
try:
print(user)
session.query(User).filter(User.id == id).delete()
session.commit()
except BaseException:
is_success = False
print('error=', traceback.format_exc())
session.close()
return is_success
# 修改
def update(user):
is_success = True
session = db_session()
try:
print(user)
session.query(User).filter(User.id == user.id).update({User.name: user.name})
session.commit()
except BaseException:
is_success = False
print('error=', traceback.format_exc())
session.close()
return is_success
# 查詢單條
def queryOne(name):
session = db_session()
user = session.query(User).filter(User.name == name).limit(1).one()
session.close()
return user
# 條件查詢
def query():
session = db_session()
list = session.query(User).filter(User.name == '唐人').all()
session.close()
return list
#查詢所有
def queryAll():
session = db_session()
list = session.query(User).all()
session.close()
return list
7.條件查詢總結
表名:User
1.條件查詢
session.query(User).filter(User.name=='張三'){
.all() 查詢所有
.one() 查詢單個(如果存在多個會異常)
.first() 查詢符合條件的第一個
.limit(1).one() limit限制查詢灾测,limit(1).one()升級第一個
.count() 查詢符合條件的總個數(shù)
}
2.主鍵查詢
session.query(User).get(0) 查詢主鍵ID=0
3.offset(n) 限制前面n個,顯示后面n+1個
#查詢出第三個后面的所有
session.query(User).offset(3).all()
4.slice()切片
#slice(1,3) 與python的slice一致垦巴,從0開始 左閉右開媳搪,顯示1,2兩個元素
session.query(User).slice(1,,3).all()
5.order_by() 默認升序
session.query(User).order_by(User.id).all()
6.desc() 降序
session.query(User).order_by(desc(User.id)).all()
7.like 模糊匹配,與sql一樣
session.query(User).filter(User.neme.like('%吳')).add()
8.notlike 與7相反
form operator import *
9.in_() 包含
#查詢是否包含唐人骤宣、吳新喜這個用戶的信息
session.query(User).filter(User.name.in_(['唐人','吳新喜'])).all()
10.notin_() 不包含
11.is_ 兩種表達方式 None
#查詢所有手機號為null的信息
session.query(User).filter(User.phone==None).all()
session.query(User).filter(User.phone.is_(None)).all()
12. isnot()
13. or_ 條件或者關系
#查詢name==吳新喜或者唐人的用戶信息
session.query(User).filter(or_(User.name=='唐人',User.name=='吳新喜'))
聚合函數(shù)
1.count group_by
#查詢所有的密碼并且計算其相同的個數(shù)
from sqlalchemy import func
ssession.query(db_user.psw,func.count(db_user.psw)).group_by(db_user.psw).all()
2.having
having字句可以讓我們篩選成組后的各種數(shù)據(jù)秦爆,where字句在聚合前先篩選記錄,也就是說作用在group by和having字句前憔披。
而having子句在聚合后對組記錄進行篩選等限。真實表中沒有此數(shù)據(jù),這些數(shù)據(jù)是通過一些函數(shù)生存芬膝。
即先成組在篩選
#查詢所有的密碼并且計算其相同的個數(shù),having條件相同密碼總數(shù)大于1的數(shù)據(jù)
ssession.query(db_user.psw,func.count(db_user.psw)).group_by(db_user.psw).having(func.count(db_user.psw)>1).all()
3.sum
#計算所有id的總和
ssession.query(func.sum(db_user.id)).all()
4.max
#最大的ID
ssession.query(func.max(db_user.id)).all()
5.min
#最小的id
ssession.query(func.min(db_user.id)).all()
6.lable 別名
lable別名不能用在having中
7.extract 提取時間元素
from sqlalchemy import extract