Python SQLAlchemy入門(mén)教程(基本用法)
本文將以Mysql舉例,介紹sqlalchemy的基本用法。其中,Python版本為2.7,sqlalchemy版本為1.1.6。
一. 介紹
SQLAlchemy是Python中最有名的ORM工具。
關(guān)于ORM:
全稱Object Relational Mapping(對(duì)象關(guān)系映射)。
特點(diǎn)是操縱Python對(duì)象而不是SQL查詢,也就是在代碼層面考慮的是對(duì)象,而不是SQL,體現(xiàn)的是一種程序化思維,這樣使得Python程序更加簡(jiǎn)潔易讀。
具體的實(shí)現(xiàn)方式是將數(shù)據(jù)庫(kù)表轉(zhuǎn)換為Python類(lèi),其中數(shù)據(jù)列作為屬性,數(shù)據(jù)庫(kù)操作作為方法。
優(yōu)點(diǎn):
- 簡(jiǎn)潔易讀:將數(shù)據(jù)表抽象為對(duì)象(數(shù)據(jù)模型),更直觀易讀
- 可移植:封裝了多種數(shù)據(jù)庫(kù)引擎,面對(duì)多個(gè)數(shù)據(jù)庫(kù),操作基本一致,代碼易維護(hù)
- 更安全:有效避免SQL注入
為什么要用sqlalchemy?
雖然性能稍稍不及原生SQL,但是操作數(shù)據(jù)庫(kù)真的很方便!
二. 使用
概念和數(shù)據(jù)類(lèi)型
概念
概念 | 對(duì)應(yīng)數(shù)據(jù)庫(kù) | 說(shuō)明 |
---|---|---|
Engine | 連接 | 驅(qū)動(dòng)引擎 |
Session | 連接池,事務(wù) | 由此開(kāi)始查詢 |
Model | 表 | 類(lèi)定義 |
Column | 列 | |
Query | 若干行 | 可以鏈?zhǔn)教砑佣鄠€(gè)條件 |
常見(jiàn)數(shù)據(jù)類(lèi)型
數(shù)據(jù)類(lèi)型 | 數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型 | python數(shù)據(jù)類(lèi)型 | 說(shuō)明 |
---|---|---|---|
Integer | int | int | 整形,32位 |
String | varchar | string | 字符串 |
Text | text | string | 長(zhǎng)字符串 |
Float | float | float | 浮點(diǎn)型 |
Boolean | tinyint | bool | True / False |
Date | date | datetime.date | 存儲(chǔ)時(shí)間年月日 |
DateTime | datetime | datetime.datetime | 存儲(chǔ)年月日時(shí)分秒毫秒等 |
Time | time | datetime.datetime | 存儲(chǔ)時(shí)分秒 |
創(chuàng)建數(shù)據(jù)庫(kù)表
1.安裝
pip install SQLalchemy
2. 創(chuàng)建連接
from sqlalchemy import create_engine engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8")
這行代碼初始化創(chuàng)建了Engine,Engine內(nèi)部維護(hù)了一個(gè)Pool(連接池)和Dialect(方言),方言來(lái)識(shí)別具體連接數(shù)據(jù)庫(kù)種類(lèi)。
創(chuàng)建好了Engine的同時(shí),Pool和Dialect也已經(jīng)創(chuàng)建好了,但是此時(shí)并沒(méi)有真正與數(shù)據(jù)庫(kù)連接,等到執(zhí)行具體的語(yǔ)句.connect()等時(shí)才會(huì)連接到數(shù)據(jù)庫(kù)。
create_engine還有其它可選的參數(shù),比如:
engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8", echo=True, pool_size=8, pool_recycle=60*30 )
- echo: 當(dāng)設(shè)置為T(mén)rue時(shí)會(huì)將orm語(yǔ)句轉(zhuǎn)化為sql語(yǔ)句打印,一般debug的時(shí)候可用
- pool_size: 連接池的大小,默認(rèn)為5個(gè),設(shè)置為0時(shí)表示連接無(wú)限制
- pool_recycle: 設(shè)置時(shí)間以限制數(shù)據(jù)庫(kù)多久沒(méi)連接自動(dòng)斷開(kāi)
3. 創(chuàng)建數(shù)據(jù)庫(kù)表類(lèi)(模型)
前面有提到ORM的重要特點(diǎn),那么我們操作表的時(shí)候就需要通過(guò)操作對(duì)象來(lái)實(shí)現(xiàn),現(xiàn)在我們來(lái)創(chuàng)建一個(gè)類(lèi),以常見(jiàn)的用戶表舉例:
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Users(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) name = Column(String(64), unique=True) email = Column(String(64)) def __init__(self, name, email): self.name = name self.email = email
declarative_base()是sqlalchemy內(nèi)部封裝的一個(gè)方法,通過(guò)其構(gòu)造一個(gè)基類(lèi),這個(gè)基類(lèi)和它的子類(lèi),可以將Python類(lèi)和數(shù)據(jù)庫(kù)表關(guān)聯(lián)映射起來(lái)。
數(shù)據(jù)庫(kù)表模型類(lèi)通過(guò)__tablename__和表關(guān)聯(lián)起來(lái),Column表示數(shù)據(jù)表的列。
4. 生成數(shù)據(jù)庫(kù)表
Base.metadata.create_all(engine)
創(chuàng)建表,如果存在則忽略,執(zhí)行以上代碼,就會(huì)發(fā)現(xiàn)在db中創(chuàng)建了users表。
操作數(shù)據(jù)
表創(chuàng)建好了就是操作數(shù)據(jù)了,常見(jiàn)的操作增刪改查,我們一一介紹。
session
sqlalchemy中使用session用于創(chuàng)建程序和數(shù)據(jù)庫(kù)之間的會(huì)話,所有對(duì)象的載入和保存都需要通過(guò)session對(duì)象 。
通過(guò)sessionmaker調(diào)用創(chuàng)建一個(gè)工廠,并關(guān)聯(lián)Engine以確保每個(gè)session都可以使用該Engine連接資源:
from sqlalchemy.orm import sessionmaker # 創(chuàng)建session DbSession = sessionmaker(bind=engine) session = DbSession()
session的常見(jiàn)操作方法包括:
- flush:預(yù)提交,提交到數(shù)據(jù)庫(kù)文件,還未寫(xiě)入數(shù)據(jù)庫(kù)文件中
- commit:提交了一個(gè)事務(wù)
- rollback:回滾
- close:關(guān)閉
增
舉個(gè)最簡(jiǎn)單的例子:
add_user = Users("test", "test123@qq.com") session.add(add_user) session.commit()
session.add()將會(huì)把Model加入當(dāng)前session維護(hù)的持久空間(可以從session.dirty看到)中,直到commit時(shí)提交到數(shù)據(jù)庫(kù)。
Q1:add之后如何直接返回對(duì)象的屬性?
可以在add之后執(zhí)行db.session.flush(),這樣便可在session中g(shù)et到對(duì)象的屬性。
Q2:如何進(jìn)行批量插入,性能比較?
批量插入共有以下幾種方法,對(duì)它們的批量做了比較,分別是:
session.add_all() < bulk_save_object() < bulk_insert_mappings() < SQLAlchemy_core()
查
查詢是最常用的一個(gè)操作了,舉個(gè)最簡(jiǎn)單的查詢例子:
users = session.query(Users).filter_by(id=1).all() for item in users: print(item.name)
通常我們通過(guò)以上查詢模式獲取數(shù)據(jù),需要注意的是,通過(guò)session.query()我們查詢返回了一個(gè)Query對(duì)象,此時(shí)還沒(méi)有去具體的數(shù)據(jù)庫(kù)中查詢,只有當(dāng)執(zhí)行具體的.all(),.first()等函數(shù)時(shí)才會(huì)真的去操作數(shù)據(jù)庫(kù)。
其中,query有filter和filter_by兩個(gè)過(guò)濾方法,上述例子也可寫(xiě)為:
users = session.query(Users).filter_by(Users.id == 1).all()
通常這兩個(gè)方法都會(huì)用到的,所以一定要掌握它們的區(qū)別:
改
更新數(shù)據(jù)有兩種方法,一種是使用query中的update方法:
filter | filter_by |
---|---|
支持所有比較運(yùn)算符,相等比較用比較用== | 只能使用"=","!="和"><" |
過(guò)濾用類(lèi)名.屬性名 | 過(guò)濾用屬性名 |
不支持組合查詢,只能連續(xù)調(diào)用filter變相實(shí)現(xiàn) | 參數(shù)是**kwargs,支持組合查詢 |
支持and,or和in等 |
改
更新數(shù)據(jù)有兩種方法,一種是使用query中的update方法:
session.query(Users).filter_by(id=1).update({'name': "Jack"})
另一種是操作對(duì)應(yīng)的表模型:
users = session.query(Users).filter_by(name="Jack").first() users.name = "test" session.add(users)
這兩種方式呢,一般批量更新的話我會(huì)選前者,而要對(duì)查詢獲取對(duì)象屬性之后再更新的場(chǎng)景就需要使用后者。
刪
和更新數(shù)據(jù)類(lèi)似,刪除數(shù)據(jù)也有兩種方法,第一種:
delete_users = session.query(Users).filter(Users.name == "test").first() if delete_users: session.delete(delete_users) session.commit()
第二種:
session.query(Users).filter(Users.name == "test").delete() session.commit()
批量刪除時(shí)推薦使用第二種。
以上,就是Python sqlalchemy的基本用法。
代碼可參照:my github
總結(jié)
以上所述是小編給大家介紹的Python SQLAlchemy入門(mén)教程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Python HTMLTestRunner如何下載生成報(bào)告
這篇文章主要介紹了Python HTMLTestRunner如何下載生成報(bào)告,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Python使用Keras庫(kù)中的LSTM模型生成新文本內(nèi)容教程
Python語(yǔ)言使用金庸小說(shuō)文本庫(kù),對(duì)文本進(jìn)行預(yù)處理,然后使用Keras庫(kù)中的LSTM模型創(chuàng)建和訓(xùn)練了模型,根據(jù)這個(gè)模型,我們可以生成新的文本,并探索小說(shuō)的不同應(yīng)用2024-01-01python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽基本操作
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽基本操作,需要的朋友可以參考下2020-02-02使用Python對(duì)微信好友進(jìn)行數(shù)據(jù)分析
這篇文章主要介紹了使用Python對(duì)微信好友進(jìn)行數(shù)據(jù)分析的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06解決項(xiàng)目pycharm能運(yùn)行,在終端卻無(wú)法運(yùn)行的問(wèn)題
今天小編就為大家分享一篇解決項(xiàng)目pycharm能運(yùn)行,在終端卻無(wú)法運(yùn)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python pytesseract驗(yàn)證碼識(shí)別庫(kù)用法解析
這篇文章主要介紹了Python pytesseract驗(yàn)證碼識(shí)別庫(kù)用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06python如何在pygame中設(shè)置字體并顯示中文詳解
再簡(jiǎn)單的游戲界面中均涉及文字處理,下面這篇文章主要給大家介紹了關(guān)于python如何在pygame中設(shè)置字體并顯示中文的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01