天天看點

[4]資料庫程式設計-【4】ORM

作者:測開人小江

Python中的ORM(對象關系映射)是一種資料庫程式設計技術,它允許開發人員使用面向對象的方式來操作資料庫,而不必直接使用SQL語句。ORM将資料庫表映射到Python對象,使得資料庫操作更加簡潔和友善。在本篇學習教程中,我們将介紹Python中ORM的基本概念、使用方法以及一些常見的ORM庫。

什麼是ORM?

ORM是一種程式設計技術,它将資料庫表和Python對象之間建立了一種映射關系,使得開發人員可以使用面向對象的方式來操作資料庫,而不必直接編寫SQL語句。ORM将資料庫表的結構映射到Python類的屬性,将資料庫表的行映射到Python類的執行個體,進而使得對資料庫的操作變得類似于對Python對象的操作。

ORM的優點包括:

  • 抽象了資料庫的底層細節,屏蔽了SQL語句,使得資料庫操作更加簡潔和友善。
  • 提供了面向對象的程式設計方式,使得代碼更加可讀性和可維護性更好。
  • 可以實作資料庫的平台無關性,通過更換ORM庫,可以輕松切換不同資料庫系統。

Python中的ORM庫

Python中有許多優秀的ORM庫可供選擇,包括但不限于:

  • SQLAlchemy:一個功能強大、靈活且廣泛使用的ORM庫,支援多種資料庫系統,包括MySQL、SQLite、PostgreSQL等。
  • Django ORM:Django架構内置的ORM,提供了強大的資料庫操作功能,适用于Django項目。
  • peewee:一個簡單且易用的ORM庫,支援SQLite、MySQL、PostgreSQL等資料庫系統。

在本篇學習教程中,我們以SQLAlchemy為例,介紹Python中ORM的基本使用方法。

安裝和導入SQLAlchemy

首先,我們需要安裝SQLAlchemy庫。可以使用pip指令來安裝:

pip install sqlalchemy
           

安裝完成後,我們可以在Python代碼中導入SQLAlchemy庫:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
           

在這裡,我們導入了SQLAlchemy庫的一些基本子產品,包括create_engine、Column、Integer、String、declarative_base和sessionmaker。

定義模型類

在使用ORM時,我們首先需要定義一個模型類,該類将映射到資料庫中的一張表。在SQLAlchemy中,我們可以通過繼承declarative_base()類來定義模型類。

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
		age = Column(Integer)           

在上面的示例中,我們定義了一個名為User的模型類,它繼承自Base類。Base類是SQLAlchemy庫中的基類,它提供了一些ORM的基本功能。

在User模型類中,我們使用__tablename__屬性定義了資料庫中對應的表名為users。接着,我們定義了兩個屬性id和name,它們分别映射到了資料庫表中的id和name列。Column類是SQLAlchemy庫中的一個類,它表示了資料庫表中的列,并且可以指定列的類型、屬性等。

在上面的示例中,我們使用了Integer和String作為列的類型,分别表示整數和字元串。primary_key=True表示這個列是表的主鍵,用于唯一辨別每一行資料。

連接配接資料庫

在使用ORM操作資料庫之前,我們需要先連接配接到資料庫。在SQLAlchemy中,我們使用create_engine()函數來建立一個資料庫引擎,用于和資料庫進行互動。

from sqlalchemy import create_engine

# 建立資料庫引擎
engine = create_engine('mysql://username:password@localhost/dbname')
           

在上面的示例中,我們使用了MySQL資料庫作為例子,通過在create_engine()函數中傳入資料庫的連接配接資訊,包括使用者名、密碼、主機名和資料庫名,來建立了一個MySQL資料庫引擎。你需要根據自己的資料庫情況來修改連接配接資訊。

建立表

在使用ORM時,我們不需要手動建立資料庫表,ORM會根據我們定義的模型類自動建立表結構。我們可以使用Base.metadata.create_all()方法來建立所有定義的模型類對應的資料庫表。

Base.metadata.create_all(engine)
           

在上面的示例中,Base.metadata.create_all()方法會根據我們之前定義的User模型類建立一個名為users的資料庫表。

插入資料

使用ORM插入資料到資料庫表中也非常簡單,我們隻需要建立一個模型類的執行個體,并将其添加到一個資料庫會話(session)中,然後送出會話即可。

from sqlalchemy.orm import sessionmaker

# 建立會話
Session = sessionmaker(bind=engine)
session = Session()

# 建立一個User對象
user = User(name='John')

# 添加到會話中
session.add(user)

# 送出會話
session.commit()

# 關閉會話
session.close()
           

在上面的示例中,我們首先建立了一個會話,然後建立了一個名為user的User對象,并将其添加到會話中。最後,我們調用commit()方法送出會話,将資料插入到資料庫表中,并關閉會話。

查詢資料

使用ORM查詢資料也非常簡便,我們可以通過會話的查詢接口來執行查詢操作。

from sqlalchemy.orm import sessionmaker

# 建立會話
Session = sessionmaker(bind=engine)
session = Session()

# 查詢所有的使用者
users = session.query(User).all()

# 查詢第一個使用者
user = session.query(User).first()

# 查詢特定條件的使用者
users = session.query(User).filter_by(name='John').all()

# 查詢特定條件的使用者(使用filter()方法)
from sqlalchemy import text
users = session.query(User).filter(text("name = 'John'")).all()

# 查詢特定條件的使用者(使用filter()方法和邏輯運算符)
from sqlalchemy import and_, or_
users = session.query(User).filter(and_(User.name == 'John', User.age >= 18)).all()

# 查詢特定條件的使用者(使用filter()方法和模糊查詢)
users = session.query(User).filter(User.name.like('%John%')).all()

# 查詢特定條件的使用者(使用filter()方法和in操作)
users = session.query(User).filter(User.id.in_([1, 2, 3])).all()

# 查詢特定條件的使用者并排序
users = session.query(User).filter(User.age >= 18).order_by(User.name.asc()).all()

# 查詢特定條件的使用者并限制結果集數量
users = session.query(User).filter(User.age >= 18).limit(10).all()

# 查詢特定條件的使用者并偏移結果集
users = session.query(User).filter(User.age >= 18).offset(5).all()

# 查詢特定條件的使用者并統計結果數量
count = session.query(User).filter(User.age >= 18).count()

# 關閉會話
session.close()           

在上面的示例中,我們使用了query()方法來建構查詢,并通過鍊式調用不同的方法來添加查詢條件,如filter_by()、filter()、like()、in_()等。我們還可以通過order_by()方法來排序查詢結果,通過limit()和offset()方法來限制結果集數量和偏移結果集,以及通過count()方法來統計結果數量。

更新資料

使用ORM更新資料也非常簡單,我們隻需要先查詢到需要更新的資料,然後修改其屬性,并送出會話即可。

from sqlalchemy.orm import sessionmaker

# 建立會話
Session = sessionmaker(bind=engine)
session = Session()

# 查詢需要更新的使用者
user = session.query(User).filter_by(name='John').first()

# 更新使用者的屬性
user.name = 'John Smith'
user.age = 30

# 送出會話
session.commit()

# 關閉會話
session.close()
           

在上面的示例中,我們首先查詢到名為John的使用者,并将其屬性修改為John Smith和30,然後送出會話,将修改儲存到資料庫中。

删除資料

使用ORM删除資料也非常簡單,我們隻需要先查詢到需要删除的資料,然後從會話中删除并送出會話即可。

from sqlalchemy.orm import sessionmaker

# 建立會話
Session = sessionmaker(bind=engine)
session = Session()

# 查詢需要删除的使用者
user = session.query(User).filter_by(name='John').first()

# 删除使用者
session.delete(user)

# 送出會話
session.commit()

# 關閉會話
session.close()
           

在上面的示例中,我們首先查詢到名為John的使用者,并将其從會話中删除,然後送出會話,從資料庫中删除該使用者。

總結

這就是一個簡單的Python中使用ORM進行資料庫操作的學習教程。通過SQLAlchemy這樣強大的ORM工具,我們可以友善地進行資料庫的增、查、改、删操作,而不必直接操作SQL語句。ORM将資料庫表映射為Python類,使得資料庫操作更加面向對象化和Pythonic,提供了更加靈活和友善的方式來操作資料庫。

需要注意的是,在使用ORM進行資料庫操作時,我們需要先建立模型類來定義資料庫表的結構,然後通過會話來執行資料庫操作。會話是一個臨時的工作環境,可以用于執行多個資料庫操作,并在完成後進行送出,進而将修改持久化到資料庫中。

希望這個簡單的學習教程對于學習Python中ORM的基本用法和概念有所幫助。通過深入學習SQLAlchemy的文檔和實際的實踐,你可以進一步掌握ORM的進階功能和更複雜的資料庫操作。

繼續閱讀