怎么在Python中使用SQLAlchemy?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)主營烏拉特前網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā),烏拉特前h5小程序設(shè)計搭建,烏拉特前網(wǎng)站營銷推廣歡迎烏拉特前等地區(qū)企業(yè)咨詢一. 介紹
SQLAlchemy是Python中最有名的ORM工具。
關(guān)于ORM:
全稱Object Relational Mapping(對象關(guān)系映射)。
特點是操縱Python對象而不是SQL查詢,也就是在代碼層面考慮的是對象,而不是SQL,體現(xiàn)的是一種程序化思維,這樣使得Python程序更加簡潔易讀。
具體的實現(xiàn)方式是將數(shù)據(jù)庫表轉(zhuǎn)換為Python類,其中數(shù)據(jù)列作為屬性,數(shù)據(jù)庫操作作為方法。
優(yōu)點:
簡潔易讀:將數(shù)據(jù)表抽象為對象(數(shù)據(jù)模型),更直觀易讀
可移植:封裝了多種數(shù)據(jù)庫引擎,面對多個數(shù)據(jù)庫,操作基本一致,代碼易維護
更安全:有效避免SQL注入
為什么要用sqlalchemy?
雖然性能稍稍不及原生SQL,但是操作數(shù)據(jù)庫真的很方便!
二. 使用
概念和數(shù)據(jù)類型
概念
概念 | 對應(yīng)數(shù)據(jù)庫 | 說明 |
---|---|---|
Engine | 連接 | 驅(qū)動引擎 |
Session | 連接池,事務(wù) | 由此開始查詢 |
Model | 表 | 類定義 |
Column | 列 | |
Query | 若干行 | 可以鏈?zhǔn)教砑佣鄠€條件 |
常見數(shù)據(jù)類型
數(shù)據(jù)類型 | 數(shù)據(jù)庫數(shù)據(jù)類型 | python數(shù)據(jù)類型 | 說明 |
---|---|---|---|
Integer | int | int | 整形,32位 |
String | varchar | string | 字符串 |
Text | text | string | 長字符串 |
Float | float | float | 浮點型 |
Boolean | tinyint | bool | True / False |
Date | date | datetime.date | 存儲時間年月日 |
DateTime | datetime | datetime.datetime | 存儲年月日時分秒毫秒等 |
Time | time | datetime.datetime | 存儲時分秒 |
創(chuàng)建數(shù)據(jù)庫表
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)部維護了一個Pool(連接池)和Dialect(方言),方言來識別具體連接數(shù)據(jù)庫種類。
創(chuàng)建好了Engine的同時,Pool和Dialect也已經(jīng)創(chuàng)建好了,但是此時并沒有真正與數(shù)據(jù)庫連接,等到執(zhí)行具體的語句.connect()等時才會連接到數(shù)據(jù)庫。
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è)置為True時會將orm語句轉(zhuǎn)化為sql語句打印,一般debug的時候可用
pool_size: 連接池的大小,默認為5個,設(shè)置為0時表示連接無限制
pool_recycle: 設(shè)置時間以限制數(shù)據(jù)庫多久沒連接自動斷開
3. 創(chuàng)建數(shù)據(jù)庫表類(模型)
前面有提到ORM的重要特點,那么我們操作表的時候就需要通過操作對象來實現(xiàn),現(xiàn)在我們來創(chuàng)建一個類,以常見的用戶表舉例:
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òu)造一個基類,這個基類和它的子類,可以將Python類和數(shù)據(jù)庫表關(guān)聯(lián)映射起來。
數(shù)據(jù)庫表模型類通過__tablename__和表關(guān)聯(lián)起來,Column表示數(shù)據(jù)表的列。
4. 生成數(shù)據(jù)庫表
Base.metadata.create_all(engine)
創(chuàng)建表,如果存在則忽略,執(zhí)行以上代碼,就會發(fā)現(xiàn)在db中創(chuàng)建了users表。
操作數(shù)據(jù)
表創(chuàng)建好了就是操作數(shù)據(jù)了,常見的操作增刪改查,我們一一介紹。
session
sqlalchemy中使用session用于創(chuàng)建程序和數(shù)據(jù)庫之間的會話,所有對象的載入和保存都需要通過session對象 。
通過sessionmaker調(diào)用創(chuàng)建一個工廠,并關(guān)聯(lián)Engine以確保每個session都可以使用該Engine連接資源:
from sqlalchemy.orm import sessionmaker # 創(chuàng)建session DbSession = sessionmaker(bind=engine) session = DbSession()
session的常見操作方法包括:
flush:預(yù)提交,提交到數(shù)據(jù)庫文件,還未寫入數(shù)據(jù)庫文件中
commit:提交了一個事務(wù)
rollback:回滾
close:關(guān)閉
增
舉個最簡單的例子:
add_user = Users("test", "test123@qq.com") session.add(add_user) session.commit()
session.add()將會把Model加入當(dāng)前session維護的持久空間(可以從session.dirty看到)中,直到commit時提交到數(shù)據(jù)庫。
Q1:add之后如何直接返回對象的屬性?
可以在add之后執(zhí)行db.session.flush(),這樣便可在session中g(shù)et到對象的屬性。
Q2:如何進行批量插入,性能比較?
批量插入共有以下幾種方法,對它們的批量做了比較,分別是:
session.add_all() < bulk_save_object() < bulk_insert_mappings() < SQLAlchemy_core()
查
查詢是最常用的一個操作了,舉個最簡單的查詢例子:
users = session.query(Users).filter_by(id=1).all() for item in users: print(item.name)
通常我們通過以上查詢模式獲取數(shù)據(jù),需要注意的是,通過session.query()我們查詢返回了一個Query對象,此時還沒有去具體的數(shù)據(jù)庫中查詢,只有當(dāng)執(zhí)行具體的.all(),.first()等函數(shù)時才會真的去操作數(shù)據(jù)庫。
其中,query有filter和filter_by兩個過濾方法,上述例子也可寫為:
users = session.query(Users).filter_by(Users.id == 1).all()
通常這兩個方法都會用到的,所以一定要掌握它們的區(qū)別:
filterfilter_by支持所有比較運算符,相等比較用比較用==只能使用"=","!="和"><"過濾用類名.屬性名過濾用屬性名不支持組合查詢,只能連續(xù)調(diào)用filter變相實現(xiàn)參數(shù)是**kwargs,支持組合查詢支持and,or和in等
改
更新數(shù)據(jù)有兩種方法,一種是使用query中的update方法:
filter | filter_by |
---|---|
支持所有比較運算符,相等比較用比較用== | 只能使用"=","!="和"><" |
過濾用類名.屬性名 | 過濾用屬性名 |
不支持組合查詢,只能連續(xù)調(diào)用filter變相實現(xiàn) | 參數(shù)是**kwargs,支持組合查詢 |
支持and,or和in等 |
改
更新數(shù)據(jù)有兩種方法,一種是使用query中的update方法:
session.query(Users).filter_by(id=1).update({'name': "Jack"})
另一種是操作對應(yīng)的表模型:
users = session.query(Users).filter_by(name="Jack").first() users.name = "test" session.add(users)
這兩種方式呢,一般批量更新的話我會選前者,而要對查詢獲取對象屬性之后再更新的場景就需要使用后者。
刪
和更新數(shù)據(jù)類似,刪除數(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()
看完上述內(nèi)容,你們掌握怎么在Python中使用SQLAlchemy的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前文章:怎么在Python中使用SQLAlchemy-創(chuàng)新互聯(lián)
鏈接URL:http://muchs.cn/article8/cdopip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、面包屑導(dǎo)航、微信公眾號、網(wǎng)站制作、響應(yīng)式網(wǎng)站、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)