
- Python 資料持久化教程
- Python 資料持久化 - 首頁
- Python 資料持久化 - 簡介
- Python 資料持久化 - 檔案 API
- 使用 os 模組進行檔案處理
- Python 資料持久化 - 物件序列化
- Python 資料持久化 - Pickle 模組
- Python 資料持久化 - Marshal 模組
- Python 資料持久化 - Shelve 模組
- Python 資料持久化 - dbm 包
- Python 資料持久化 - CSV 模組
- Python 資料持久化 - JSON 模組
- Python 資料持久化 - XML 解析器
- Python 資料持久化 - Plistlib 模組
- Python 資料持久化 - Sqlite3 模組
- Python 資料持久化 - SQLAlchemy
- Python 資料持久化 - PyMongo 模組
- Python 資料持久化 - Cassandra 驅動程式
- 資料持久化 - ZODB
- 資料持久化 - Openpyxl 模組
- Python 資料持久化資源
- Python 資料持久化 - 快速指南
- Python 資料持久化 - 有用資源
- Python 資料持久化 - 討論
Python 資料持久化 - SQLAlchemy
任何關係型資料庫都將資料儲存在表中。表結構定義屬性的資料型別,這些屬性基本上只有基本資料型別,它們對映到 Python 的相應內建資料型別。但是,Python 的使用者定義物件無法持久地儲存和檢索到/從 SQL 表中。
這是 SQL 型別和麵向物件程式語言(如 Python)之間的差異。SQL 沒有等效於字典、元組、列表或任何使用者定義類的其他資料型別。
如果您必須將物件儲存在關係資料庫中,則應先將其例項屬性分解為 SQL 資料型別,然後再執行 INSERT 查詢。另一方面,從 SQL 表檢索到的資料是基本型別。將必須使用 Python 指令碼中使用的所需型別的 Python 物件進行構造。這就是物件關係對映器有用的地方。
物件關係對映器 (ORM)
物件關係對映器 (ORM) 是類和 SQL 表之間的介面。Python 類對映到資料庫中的某個表,以便自動執行物件和 SQL 型別之間的轉換。
用 Python 程式碼編寫的 Students 類對映到資料庫中的 Students 表。因此,所有 CRUD 操作都是透過呼叫類的相應方法來完成的。這消除了在 Python 指令碼中執行硬編碼 SQL 查詢的需要。
因此,ORM 庫充當原始 SQL 查詢之上的抽象層,可以幫助加快應用程式開發。SQLAlchemy 是一個流行的 Python 物件關係對映器。模型物件的任何狀態操作都與其在資料庫表中的相關行同步。
SQLALchemy 庫包括ORM API 和 SQL 表示式語言(SQLAlchemy Core)。表示式語言直接執行關係資料庫的原始結構。
ORM 是構建在 SQL 表示式語言之上的高階和抽象的使用模式。可以說 ORM 是表示式語言的一種應用用法。在本主題中,我們將討論 SQLAlchemy ORM API 並使用 SQLite 資料庫。
SQLAlchemy 透過其各自的 DBAPI 實現使用方言系統與各種型別的資料庫進行通訊。所有方言都需要安裝相應的 DBAPI 驅動程式。包含以下型別資料庫的方言:
- Firebird
- Microsoft SQL Server
- MySQL
- Oracle
- PostgreSQL
- SQLite
- Sybase

SQLAlchemy 的安裝非常簡單直接,可以使用 pip 實用程式。
pip install sqlalchemy
要檢查 SQLalchemy 是否已正確安裝及其版本,請在 Python 提示符下輸入以下內容:
>>> import sqlalchemy >>>sqlalchemy.__version__ '1.3.11'
與資料庫的互動是透過作為create_engine() 函式的返回值獲得的 Engine 物件完成的。
engine =create_engine('sqlite:///mydb.sqlite')
SQLite 允許建立記憶體資料庫。記憶體資料庫的 SQLAlchemy 引擎建立如下:
from sqlalchemy import create_engine engine=create_engine('sqlite:///:memory:')
如果您打算改用 MySQL 資料庫,請使用其 DB-API 模組 – pymysql 和相應的方言驅動程式。
engine = create_engine('mysql+pymydsql://root@localhost/mydb')
create_engine 具有可選的 echo 引數。如果設定為 true,則引擎生成的 SQL 查詢將在終端上回顯。
SQLAlchemy 包含宣告式基類。它充當模型類和對映表的目錄。
from sqlalchemy.ext.declarative import declarative_base base=declarative_base()
下一步是定義模型類。它必須從基類派生——如上所述的 declarative_base 類的物件。
將__tablename__ 屬性設定為要建立在資料庫中的表的名稱。其他屬性對應於欄位。每個屬性都是 SQLAlchemy 中的 Column 物件,其資料型別來自以下列表中的一個:
- BigInteger
- Boolean
- Date
- DateTime
- Float
- Integer
- Numeric
- SmallInteger
- String
- Text
- Time
以下程式碼是名為 Student 的模型類,它對映到 Students 表。
#myclasses.py from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Numeric base=declarative_base() class Student(base): __tablename__='Students' StudentID=Column(Integer, primary_key=True) name=Column(String) age=Column(Integer) marks=Column(Numeric)
要建立一個具有相應結構的 Students 表,請執行為基類定義的 create_all() 方法。
base.metadata.create_all(engine)
現在我們必須宣告我們的 Student 類的物件。所有資料庫事務(例如新增、刪除或從資料庫檢索資料等)都由 Session 物件處理。
from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) sessionobj = Session()
儲存在 Student 物件中的資料透過 session 的 add() 方法物理新增到底層表中。
s1 = Student(name='Juhi', age=25, marks=200) sessionobj.add(s1) sessionobj.commit()
這是在 students 表中新增記錄的完整程式碼。在執行時,相應的 SQL 語句日誌將顯示在控制檯中。
from sqlalchemy import Column, Integer, String from sqlalchemy import create_engine from myclasses import Student, base engine = create_engine('sqlite:///college.db', echo=True) base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) sessionobj = Session() s1 = Student(name='Juhi', age=25, marks=200) sessionobj.add(s1) sessionobj.commit()
控制檯輸出
CREATE TABLE "Students" ( "StudentID" INTEGER NOT NULL, name VARCHAR, age INTEGER, marks NUMERIC, PRIMARY KEY ("StudentID") ) INFO sqlalchemy.engine.base.Engine () INFO sqlalchemy.engine.base.Engine COMMIT INFO sqlalchemy.engine.base.Engine BEGIN (implicit) INFO sqlalchemy.engine.base.Engine INSERT INTO "Students" (name, age, marks) VALUES (?, ?, ?) INFO sqlalchemy.engine.base.Engine ('Juhi', 25, 200.0) INFO sqlalchemy.engine.base.Engine COMMIT
session 物件還提供 add_all() 方法,以便在單個事務中插入多個物件。
sessionobj.add_all([s2,s3,s4,s5]) sessionobj.commit()
現在,記錄已新增到表中,我們希望像 SELECT 查詢一樣從中提取記錄。session 物件具有 query() 方法來執行此任務。Query 物件由 Student 模型上的 query() 方法返回。
qry=seesionobj.query(Student)
使用此 Query 物件的 get() 方法獲取對應於給定主鍵的物件。
S1=qry.get(1)
執行此語句時,在控制檯中回顯的相應 SQL 語句如下:
BEGIN (implicit) SELECT "Students"."StudentID" AS "Students_StudentID", "Students".name AS "Students_name", "Students".age AS "Students_age", "Students".marks AS "Students_marks" FROM "Students" WHERE "Products"."Students" = ? sqlalchemy.engine.base.Engine (1,)
query.all() 方法返回所有物件的列表,可以使用迴圈遍歷這些物件。
from sqlalchemy import Column, Integer, String, Numeric from sqlalchemy import create_engine from myclasses import Student,base engine = create_engine('sqlite:///college.db', echo=True) base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) sessionobj = Session() qry=sessionobj.query(Students) rows=qry.all() for row in rows: print (row)
更新對映表中的記錄非常容易。您只需使用 get() 方法獲取記錄,將新值賦給所需的屬性,然後使用 session 物件提交更改。下面我們將 Juhi 學生的分數更改為 100。
S1=qry.get(1) S1.marks=100 sessionobj.commit()
刪除記錄也同樣容易,只需從 session 中刪除所需的物件即可。
S1=qry.get(1) Sessionobj.delete(S1) sessionobj.commit()