Python SQLAlchemy入门教程
原文:https://www.cnblogs.com/ybjourney/p/11832045.html
Python SQLAlchemy入門教程
- 一、介紹
- 關(guān)于ORM
- 為什么用sqlalchemy
- 二、使用方法
- 概念和數(shù)據(jù)類型
- 使用步驟
- 1.安裝包
- 2.創(chuàng)建連接
- 3.創(chuàng)建數(shù)據(jù)庫表類(模型)
- 4.生成數(shù)據(jù)庫表
- 三、增刪改查
- 增加
- 查詢
- 修改
- 刪除
本文將以Mysql舉例,介紹sqlalchemy的基本用法。其中,Python版本為3.8,sqlalchemy版本為1.4.22(原文中為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程序更加簡潔易讀。
具體的實(shí)現(xiàn)方式是將數(shù)據(jù)庫表轉(zhuǎn)換為Python類,其中數(shù)據(jù)列作為屬性,數(shù)據(jù)庫操作作為方法。
優(yōu)點(diǎn)
- 簡潔易讀:將數(shù)據(jù)表抽象為對(duì)象(數(shù)據(jù)模型),更直觀易讀
- 可移植:封裝了多種數(shù)據(jù)庫引擎,面對(duì)多個(gè)數(shù)據(jù)庫,操作基本一致,代碼易維護(hù)
- 更安全:有效避免SQL注入
為什么用sqlalchemy
雖然性能稍稍不及原生SQL,但是操作數(shù)據(jù)庫真的很方便!
二、使用方法
概念和數(shù)據(jù)類型
對(duì)應(yīng)數(shù)據(jù)庫中的概念
| Engine | 連接 | 驅(qū)動(dòng)引擎 |
| Session | 連接池、事務(wù) | 由此開始查詢 |
| Model | 表 | 類定義 |
| Colum | 列 | 對(duì)應(yīng)數(shù)據(jù)庫字段 |
| Query | 若干行 | 可以鏈?zhǔn)教砑佣鄠€(gè)條件 |
常見數(shù)據(jù)庫類型
| Integer | int | int | 整型,32位 |
| String | varchar | string | 字符串 |
| Text | text | string | 長字符串 |
| Float | float | float | 浮點(diǎn)型 |
| Boolean | tinyint | bool | True/False |
| Date | date | datetime.date | 存儲(chǔ)時(shí)間(年月日) |
| Time | time | datetime.datetime | 存儲(chǔ)時(shí)分秒 |
使用步驟
1.安裝包
pip install SQLalchemy2.創(chuàng)建連接
from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/springbootdb?charset=utf8")這行代碼初始化創(chuàng)建了Engine,Engine內(nèi)部維護(hù)了一個(gè)Pool(連接池)和Dialect(方言),方言來識(shí)別具體連接數(shù)據(jù)庫種類。
創(chuàng)建好了Engine的同時(shí),Pool和Dialect也已經(jīng)創(chuàng)建好了,但是此時(shí)并沒有真正與數(shù)據(jù)庫連接,等到執(zhí)行具體的語句.connect()等時(shí)才會(huì)連接到數(shù)據(jù)庫。
create_engine還有其它可選的參數(shù),比如:
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/springbootdb?charset=utf8",echo=True, pool_size=8, pool_recycle=60 * 30)- echo: 當(dāng)設(shè)置為True時(shí)會(huì)將orm語句轉(zhuǎn)化為sql語句打印,一般debug的時(shí)候可用
- pool_size: 連接池的大小,默認(rèn)為5個(gè),設(shè)置為0時(shí)表示連接無限制
- pool_recycle: 設(shè)置時(shí)間以限制數(shù)據(jù)庫多久沒連接自動(dòng)斷開
3.創(chuàng)建數(shù)據(jù)庫表類(模型)
前面有提到ORM的重要特點(diǎn),那么我們操作表的時(shí)候就需要通過操作對(duì)象來實(shí)現(xiàn),現(xiàn)在我們來創(chuàng)建一個(gè)類,以常見的用戶表舉例:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String# 創(chuàng)建數(shù)據(jù)庫表類(模型) 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 = nameself.email = emaildeclarative_base()是sqlalchemy內(nèi)部封裝的一個(gè)方法,通過其構(gòu)造一個(gè)基類,這個(gè)基類和它的子類,可以將Python類和數(shù)據(jù)庫表關(guān)聯(lián)映射起來。
數(shù)據(jù)庫表模型類通過__tablename__和表關(guān)聯(lián)起來,Column表示數(shù)據(jù)表的列。
4.生成數(shù)據(jù)庫表
# 生成數(shù)據(jù)庫表 Base.metadata.create_all(engine)創(chuàng)建表,如果存在則忽略,執(zhí)行以上代碼,就會(huì)發(fā)現(xiàn)在db中創(chuàng)建了users表。
操作數(shù)據(jù)
表創(chuàng)建好了就是操作數(shù)據(jù)了,常見的操作增刪改查,我們一一介紹。
session
sqlalchemy中使用session用于創(chuàng)建程序和數(shù)據(jù)庫之間的會(huì)話,所有對(duì)象的載入和保存都需要通過session對(duì)象 。
通過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的常見操作方法包括:
flush:預(yù)提交,提交到數(shù)據(jù)庫文件,還未寫入數(shù)據(jù)庫文件中
commit:提交了一個(gè)事務(wù)
rollback:回滾
close:關(guā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ù)庫。
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()
查詢
users = session.query(Users).filter_by(id=1).all() for item in users:print(item.name)通常我們通過以上查詢模式獲取數(shù)據(jù),需要注意的是,通過session.query()我們查詢返回了一個(gè)Query對(duì)象,此時(shí)還沒有去具體的數(shù)據(jù)庫中查詢,只有當(dāng)執(zhí)行具體的.all(),.first()等函數(shù)時(shí)才會(huì)真的去操作數(shù)據(jù)庫。
其中,query有filter和filter_by兩個(gè)過濾方法,上述例子也可寫為:
users = session.query(Users).filter(Users.id == 5).all()通常這兩個(gè)方法都會(huì)用到的,所以一定要掌握它們的區(qū)別:
| 支持所有比較運(yùn)算符,相等比較用== | 只能使用"=","!=“和”><" |
| 過濾用類名.屬性名 | 過濾用屬性名 |
| 不支持組合查詢,只能連續(xù)調(diào)用filters變相實(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ì)象屬性之后再更新的場景就需要使用后者。
刪除
和更新數(shù)據(jù)類似,刪除數(shù)據(jù)也有兩種方法,第一種:
delete_users = session.query(Users).filter(Users.name == "test").first() if delete_users:session.delete(delete_users)session.commit()批量刪除時(shí)推薦使用第二種。
session.query(Users).filter(Users.name == "test").delete() session.commit()總結(jié)
以上是生活随笔為你收集整理的Python SQLAlchemy入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hdu_3068 Manacger算法的
- 下一篇: 医学影像中用 python 读取 nrr