SQLAlchemy案例詳解
一、SQLAlchemy介紹
SQLAlchemy 是 Python SQL 工具包和對(duì)象關(guān)系映射器,為應(yīng)用程序開(kāi)發(fā)人員提供 SQL 的全部功能和靈活性。
SQLAlchemy支持SQLite、PostgreSQL、Oracle、MySQL、MariaDB、Microsoft SQL Server等多種數(shù)據(jù)庫(kù)。
二、SQLAlchemy安裝
我安裝的版本是:SQLAlchemy==2.0.29。注意SQLAlchemy2.x以上的版本和1.x版本差別還是挺大的,注意版本。
因?yàn)镾QLAlchemy不能直接操作數(shù)據(jù)庫(kù),還需要python中的pymysql第三方庫(kù),所以還需要安裝pymysql
PyMySQL==1.1.0.
三、創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)
創(chuàng)建一個(gè)用于測(cè)試的數(shù)據(jù)庫(kù)
其中sqlalchemydb就是測(cè)試數(shù)據(jù)庫(kù)
四、封裝SQLAlchemyDB類(lèi)
在python項(xiàng)目根目錄下創(chuàng)建一個(gè)sqlalchemy_db.py文件,當(dāng)然你也可以在其他目錄下創(chuàng)建。其中內(nèi)容如下:
說(shuō)明1:該文件sqlalchemy_db.py的作用是封裝一個(gè)SQLAlchemy的類(lèi),為實(shí)例化sqlAlchemy對(duì)象做準(zhǔn)備
說(shuō)明2:self.engine是連接數(shù)據(jù)的引擎設(shè)置,只有設(shè)置了engine,我們才能通過(guò)sqlalchemy對(duì)象操作數(shù)據(jù)庫(kù)
說(shuō)明3:self.session可以理解為數(shù)據(jù)庫(kù)的操作對(duì)象,我們對(duì)數(shù)據(jù)庫(kù)的操作都是基于該session實(shí)現(xiàn)的。
說(shuō)明4:engine參數(shù)解釋
- 參數(shù)url:SQLAlchemy要連接的數(shù)據(jù)庫(kù)地址,其格式為:數(shù)據(jù)庫(kù)類(lèi)型+數(shù)據(jù)庫(kù)驅(qū)動(dòng)://數(shù)據(jù)庫(kù)用戶(hù):數(shù)據(jù)庫(kù)密碼@數(shù)據(jù)庫(kù)地址:端口號(hào)/數(shù)據(jù)庫(kù)名稱(chēng)?編碼方式
- 參數(shù)convert_unicode:按照指定的編碼方式對(duì)字符串進(jìn)行編碼解碼
- 參數(shù)isolation_level:設(shè)置事務(wù)的隔離界別
- 參數(shù)pool_recycle:設(shè)置回收鏈接的時(shí)間,單位毫秒
- 參數(shù)pool_pre_ping:每次連接前預(yù)先ping一下
- 參數(shù)pool_size: 鏈接池中保持?jǐn)?shù)據(jù)庫(kù)連接的數(shù)量,默認(rèn)是5
- 參數(shù)max_overflow :當(dāng)鏈接池中的連接數(shù)不夠用的時(shí)候,允許額外再創(chuàng)建的最大鏈接數(shù)量,默認(rèn)是10
- pool_timeout:排隊(duì)等數(shù)據(jù)庫(kù)鏈接時(shí)的超時(shí)時(shí)間
說(shuō)明5:scoped_session創(chuàng)建的session是線程安全的。
五、創(chuàng)建model模型
5.1 SQLAlchemy支持的數(shù)據(jù)類(lèi)型
- Integer:整形
- String:字符串
- Float:浮點(diǎn)型
- DECIMAL:定點(diǎn)型
- Boolean:bool
- Date:日期類(lèi)型
- DateTime:日期+時(shí)間類(lèi)型
- Time:時(shí)間類(lèi)型
- Enum:枚舉類(lèi)型
- Text:文本類(lèi)型
- LongText:長(zhǎng)文本類(lèi)型
5.2 SQLAlchemy字段常用的約束
- default:默認(rèn)值
- nullable:是否可空
- primary_key:是否為主鍵
- unique:是否唯一
- autoincrement:是否自動(dòng)增長(zhǎng)
- name:該屬性在數(shù)據(jù)庫(kù)中的映射字段
5.3 創(chuàng)建測(cè)試的model.py文件
在項(xiàng)目的根目錄或者你需要的地方創(chuàng)建一個(gè)model.py文件,內(nèi)容如下:
說(shuō)明1:為了測(cè)試效果,我們?cè)谶@個(gè)model類(lèi)中盡可能的多展示了不同字段的使用
說(shuō)明2:Base.metadata.create_all() 會(huì)將我們的模型自動(dòng)映射到數(shù)據(jù)庫(kù)中,當(dāng)然也可以手動(dòng)去數(shù)據(jù)庫(kù)中創(chuàng)建表
說(shuō)明3:我們寫(xiě)好的這個(gè)model類(lèi)暫時(shí)還沒(méi)有使用呢 。
六、創(chuàng)建測(cè)試文件
在項(xiàng)目根目錄下或者你需要的地方創(chuàng)建一個(gè)test.py文件,內(nèi)容如下:
這時(shí)我們?cè)趖est.py中就只引入mysql_db和TestModel,其他的先不寫(xiě),然后使用python test.py運(yùn)行該腳本,就會(huì)發(fā)現(xiàn)我們的model模型,已經(jīng)同步到數(shù)據(jù)庫(kù)中了
七、添加測(cè)試數(shù)據(jù)
7.1 單條添加數(shù)據(jù)
修改test.py文件如下,然后python test.py執(zhí)行
執(zhí)行之后,我們?nèi)?shù)據(jù)庫(kù)查看結(jié)果如下:
說(shuō)明1:create_time,update_time,is_delete都是有默認(rèn)值的字段,如果不設(shè)置,會(huì)自動(dòng)顯示默認(rèn)值。
說(shuō)明2:money字段總長(zhǎng)度時(shí)9位,但是可以少于9位,不能多于9位,小數(shù)部位不足時(shí)補(bǔ)0
7.2 批量添加數(shù)據(jù)
再來(lái)演示一下批量增加數(shù)據(jù),代碼如下還是在test.py中
執(zhí)行后的結(jié)果如下:
八、修改刪除
8.1 修改
剛才已經(jīng)演示了增加數(shù)據(jù)的代碼,下面我們看一下修改,代碼如下,還是在test.py文件中
查看一下數(shù)據(jù)庫(kù)
8.2 刪除
可以看到姓名和性別已經(jīng)修改成功。再來(lái)測(cè)試一下刪除數(shù)據(jù)
可以看出,數(shù)據(jù)庫(kù)中已經(jīng)沒(méi)有id=1的數(shù)據(jù)了
九、查詢(xún)
在進(jìn)行查詢(xún)測(cè)試之前,先往數(shù)據(jù)庫(kù)中添加一下測(cè)試數(shù)據(jù)
9.1 query關(guān)鍵字
在做查詢(xún)的時(shí)候我們通常query關(guān)鍵字,它類(lèi)似于SQL中select 關(guān)鍵字,query參數(shù)通常可以填寫(xiě)三類(lèi)參數(shù)
- model模型對(duì)象:指定查找這個(gè)模型中所有的字段
- model模型對(duì)象中的屬性:可以指定只查找某個(gè)model中的幾個(gè)屬性字段
- 聚合函數(shù):func.count(統(tǒng)計(jì)行的數(shù)量),func.avg(求平均數(shù)),func.max(求最大值),func.min(求最小值),func.sum(求和)
查看一下打印結(jié)果
說(shuō)明1:在做查詢(xún)的時(shí)候 .first() 表示查詢(xún)第一個(gè)滿(mǎn)足條件的數(shù)據(jù)
說(shuō)明2:在做查詢(xún)的時(shí)候 .all() 表示查詢(xún)所有數(shù)據(jù)
說(shuō)明3:如果不是查詢(xún)?nèi)孔侄?,只查?xún)部分字段或者聚合函數(shù)的話,結(jié)果返回的是一個(gè)元組,通過(guò)下標(biāo)取數(shù)據(jù)即可
9.2 filter關(guān)鍵字
過(guò)濾是數(shù)據(jù)提取的一個(gè)很重要的功能,以下對(duì)一些常用的過(guò)濾條件進(jìn)行解釋?zhuān)⑶疫@些過(guò)濾條件都是只能通過(guò)filter方法實(shí)現(xiàn),常用的方法有
- 相等: ==
- 不相等: !=
- 模糊查詢(xún):like(%xx$)
- 包含:in_()
- 不包含:~ in_() 注意 ~不是直接加在in前面的,注意看代碼示例
- 空:==None 或者 is_(None)
- 不為空: !=None 或者 isnot(None)
- 并且: and_()或者也可以使用逗號(hào)連接多個(gè)條件
- 或者:or_()
打印結(jié)果如下:
9.3分頁(yè)查詢(xún)
方式1:使用limit+offset實(shí)現(xiàn)
查詢(xún)結(jié)果為:
方式2:使用slice
輸出結(jié)果為:
十、排序
輸出結(jié)果為:
侯哥語(yǔ)錄:我曾經(jīng)是一個(gè)職業(yè)教育者,現(xiàn)在是一個(gè)自由開(kāi)發(fā)者。我希望我的分享可以和更多人一起進(jìn)步。分享一段我喜歡的話給大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么。當(dāng)你還沒(méi)有能力說(shuō)不得時(shí)候,就努力讓自己變得強(qiáng)大,擁有說(shuō)不得權(quán)利。"
到此這篇關(guān)于SQLAlchemy詳解的文章就介紹到這了,更多相關(guān)SQLAlchemy詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MSSQL批量插入數(shù)據(jù)優(yōu)化詳細(xì)
這篇文章主要為大家分享一下批量插入數(shù)據(jù)的方法,有時(shí)候我們需要插入大量的數(shù)據(jù)那么就需要優(yōu)惠了,要不根本受不了2017-07-07sql語(yǔ)句中如何將datetime格式的日期轉(zhuǎn)換為yy-mm-dd格式
sql語(yǔ)句中如何將datetime格式的日期轉(zhuǎn)換為yy-mm-dd格式...2007-10-10SqlServer常用函數(shù)及時(shí)間處理小結(jié)
這篇文章主要介紹了SqlServer常用函數(shù)及時(shí)間處理小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05數(shù)據(jù)轉(zhuǎn)換沖突及轉(zhuǎn)換過(guò)程中大對(duì)象的處理
數(shù)據(jù)轉(zhuǎn)換沖突及轉(zhuǎn)換過(guò)程中大對(duì)象的處理方法,大家可以參考下。2009-07-07sqlserver 中一些常看的指標(biāo)和清除緩存的方法
sqlserver 中一些??吹闹笜?biāo)和清除緩存的方法2009-07-07SQL Server成功與服務(wù)器建立連接但是在登錄過(guò)程中發(fā)生錯(cuò)誤的快速解決方案
這篇文章主要介紹了SQL Server成功與服務(wù)器建立連接但是在登錄過(guò)程中發(fā)生錯(cuò)誤的快速解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09MyBatis實(shí)踐之動(dòng)態(tài)SQL及關(guān)聯(lián)查詢(xún)
MyBatis,大家都知道,半自動(dòng)的ORM框架,原來(lái)叫ibatis,后來(lái)好像是10年apache軟件基金組織把它托管給了goole code,就重新命名了MyBatis,功能相對(duì)以前更強(qiáng)大了。本文給大家介紹MyBatis實(shí)踐之動(dòng)態(tài)SQL及關(guān)聯(lián)查詢(xún),對(duì)mybatis動(dòng)態(tài)sql相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-03-03