您好,登錄后才能下訂單哦!
這篇文章主要介紹python連接數(shù)據(jù)庫操作sqlalchemy的方式,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
sqlalchemy是什么呢?其實它就是一個程序,是經(jīng)常使用的關(guān)系程序,應(yīng)用十分廣泛,所以學(xué)習(xí)好sqlalchemy是非常重要的,結(jié)合知識點以及下面示例,很輕松的學(xué)會這部分內(nèi)容。
1、ORM框架
常見的ORM框架
1)SQLAlchemy:SQLAlchemy
2)SQLObject
3)Storm
4)Django's ORM
2、SQLAlchemy介紹
sqlalchemy是Python ORM的開源框架,使用它可以快速方便的構(gòu)建數(shù)據(jù)庫模型。
SQLALchemy本身無法操作數(shù)據(jù)庫,需要依賴pymysql第三方模塊,Dialect用于和數(shù)據(jù)API進行交流,根據(jù)配置文件的不同調(diào)用不同的數(shù)據(jù)庫API,從而實現(xiàn)對數(shù)據(jù)庫的操作
使用pymysql連接數(shù)據(jù)庫格式:
mysql + pymysql: / / <username>:<password>@<host> / <dbname>[?<options>]
3、安裝SQLAlchemy與檢查是否安裝成功
#安裝 pip install SQLAlchemy #檢查是否安裝成功 C:\Users\lsl\Desktop>python Python 3.7.0rc1 (v3.7.0rc1:dfad352267, Jun 12 2018, 07:05:25) [MSC v.1914 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sqlalchemy >>> sqlalchemy.__version__ '1.3.18'復(fù)制代碼
4、使用SQLAlchemy操作數(shù)據(jù)庫的表——創(chuàng)建對象
from sqlalchemy import create_engine # 連接本地test數(shù)據(jù)庫 engine = create_engine('mysql+pymysql://root:root@localhost:3306/testdab',#數(shù)據(jù)庫類型是mysql,采用pymysql數(shù)據(jù)庫驅(qū)動來連接,用戶名是root,密碼也是root,連接本地數(shù)據(jù)庫testdab(連接的數(shù)據(jù)庫要是已存在的,就是你本地已有的數(shù)據(jù)庫) encoding='utf-8', # 編碼格式 echo=True, # 是否開啟sql執(zhí)行語句的日志輸出 pool_recycle=-1, # 多久之后對線程池中的線程進行一次連接的回收(重置) (默認為-1),其實session并不會被close poolclass=NullPool # 無限制連接數(shù) )復(fù)制代碼
5、簡單查詢——使用SQL語句
result = engine.execute("select * from students")//在execute()里的參數(shù)是查詢的sql語句 print(result.fetchall()) //打印出查詢的結(jié)果復(fù)制代碼
6、創(chuàng)建映射
創(chuàng)建一個py文件來做數(shù)據(jù)表的映射text2.py
#引入要使用的declarative_base from sqlalchemy.ext.declarative import declarative_base #在要映射的數(shù)據(jù)表students中有id,name兩個字段,所以要引入Integer對應(yīng)id,String對應(yīng)name from sqlalchemy import Column, Integer, String #聲名Base Base = declarative_base() #User類就是對應(yīng)于 __tablename__ 指向的表,也就是數(shù)據(jù)表students的映射 class User(Base): #students表是我本地數(shù)據(jù)庫testdab中已存在的 __tablename__ = 'students' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(64),nullable=False) __table_args__ = { "mysql_charset": "utf8" }復(fù)制代碼
7、查詢
查詢students表中所有的數(shù)據(jù)
result = mySession.query(News).all() print(result[0])復(fù)制代碼
查詢students表中第一條數(shù)據(jù)
result = mySession.query(User).first() print(result.name) #打印對象屬性復(fù)制代碼
通過id查詢數(shù)據(jù)(id=2)
result = mySession.query(User).filter_by(id=2).first() print(result.name)復(fù)制代碼
自定義過濾條件
result = mySession.query(User).filter(text("id>:id")).params(id=2).all()復(fù)制代碼
根據(jù)主鍵查詢
result = mySession.query(User).get(2)復(fù)制代碼
8、增加數(shù)據(jù)
user = User(name="小紅") mySession.add(user) mySession.commit() 復(fù)制代碼
9、刪除數(shù)據(jù)
mySession.query(User).filter(User.id == 1).delete() mySession.commit()復(fù)制代碼
10、修改數(shù)據(jù)
mySession.query(User).filter(User.name=="小紅").update({"name":"小白"}) mySession.commit()復(fù)制代碼
11、常用條件查詢代碼
表名: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_ 條件或者關(guān)系 #查詢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復(fù)制代碼
流程總代碼:
#import 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 #創(chuàng)建連接對象也就是為了連接到本地的數(shù)據(jù)庫 engine = create_engine('mysql+pymysql://root:root@localhost:3306/testdab', encoding='utf-8', # 編碼格式 echo=True, # 是否開啟sql執(zhí)行語句的日志輸出 pool_recycle=-1, # 多久之后對線程池中的線程進行一次連接的回收(重置) (默認為-1),其實session并不會被close poolclass=NullPool # 無限制連接數(shù) ) #聲名Base Base = declarative_base() # 創(chuàng)建會話 session = sessionmaker(engine) mySession = session() # 創(chuàng)建類,繼承基類,用基本類型描述數(shù)據(jù)庫結(jié)構(gòu) class User(Base): __tablename__ = 'students' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(64),nullable=False) __table_args__ = { "mysql_charset": "utf8" } #sql語句查詢 result = engine.execute("select * from students") print(result.fetchall()) # 查詢第一條 result = mySession.query(User).first() print(result.name) #打印對象屬性 # 查詢所有 result = mySession.query(User).all() print(result[0]) # 查詢id為2的 result = mySession.query(User).filter_by(id=2).first() print(result.name) # 分頁查詢 0,2 result = mySession.query(User).filter(User.id>1).limit(2).offset(0).all() print(result) #插入新數(shù)據(jù) user = User(name="小紅") mySession.add(user) mySession.commit() result = mySession.query(User).filter_by(name="小紅").first() print(result.name) #修改已有數(shù)據(jù) mySession.query(User).filter(User.name=="小紅").update({"name":"小白"}) mySession.commit() result = mySession.query(User).filter_by(name="小白").first() print(result.name) #刪除數(shù)據(jù) mySession.query(User).filter(User.id == 1).delete() mySession.commit() result = mySession.query(User).first() print(result.name) #打印對象屬性復(fù)制代碼
以上是python連接數(shù)據(jù)庫操作sqlalchemy的方式的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。