SQLAlchemy ORM - Khai báo ánh xạ

Mục tiêu chính của API ánh xạ quan hệ đối tượng của SQLAlchemy là tạo điều kiện liên kết các lớp Python do người dùng định nghĩa với các bảng cơ sở dữ liệu và các đối tượng của các lớp đó với các hàng trong bảng tương ứng của chúng. Các thay đổi về trạng thái của các đối tượng và hàng được khớp đồng bộ với nhau. SQLAlchemy cho phép thể hiện các truy vấn cơ sở dữ liệu theo các lớp do người dùng xác định và các mối quan hệ được xác định của chúng.

ORM được xây dựng trên ngôn ngữ biểu thức SQL. Đây là một kiểu sử dụng cấp cao và trừu tượng. Trên thực tế, ORM là một cách sử dụng được áp dụng của Ngôn ngữ Biểu thức.

Mặc dù một ứng dụng thành công có thể được tạo riêng bằng Object Relational Mapper, nhưng đôi khi một ứng dụng được xây dựng bằng ORM có thể sử dụng trực tiếp Ngôn ngữ Biểu thức khi cần có các tương tác cơ sở dữ liệu cụ thể.

Khai báo ánh xạ

Trước hết, hàm create_engine () được gọi để thiết lập một đối tượng động cơ sau đó được sử dụng để thực hiện các hoạt động SQL. Hàm có hai đối số, một là tên của cơ sở dữ liệu và một là tham số echo khi được đặt thành True sẽ tạo ra nhật ký hoạt động. Nếu nó không tồn tại, cơ sở dữ liệu sẽ được tạo. Trong ví dụ sau, một cơ sở dữ liệu SQLite được tạo.

from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)

Engine thiết lập một kết nối DBAPI thực với cơ sở dữ liệu khi một phương thức như Engine.execute () hoặc Engine.connect () được gọi. Sau đó, nó được sử dụng để phát ra SQLORM không sử dụng trực tiếp Engine; thay vào đó, nó được ORM sử dụng ở hậu trường.

Trong trường hợp ORM, quá trình cấu hình bắt đầu bằng cách mô tả các bảng cơ sở dữ liệu và sau đó bằng cách xác định các lớp sẽ được ánh xạ tới các bảng đó. Trong SQLAlchemy, hai tác vụ này được thực hiện cùng nhau. Điều này được thực hiện bằng cách sử dụng hệ thống Khai báo; các lớp được tạo bao gồm các chỉ thị để mô tả bảng cơ sở dữ liệu thực tế mà chúng được ánh xạ tới.

Một lớp cơ sở lưu trữ một danh mục các lớp và các bảng được ánh xạ trong hệ thống Khai báo. Đây được gọi là lớp cơ sở khai báo. Thường sẽ chỉ có một phiên bản của cơ sở này trong một mô-đun thường được nhập. Chức năng khai báo_base () được sử dụng để tạo lớp cơ sở. Hàm này được định nghĩa trong mô-đun sqlalchemy.ext.decl Compare.

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

Khi lớp cơ sở được khai báo, bất kỳ số lượng lớp được ánh xạ nào cũng có thể được định nghĩa theo nó. Mã sau xác định lớp của Khách hàng. Nó chứa bảng được ánh xạ tới, tên và kiểu dữ liệu của các cột trong đó.

class Customers(Base):
   __tablename__ = 'customers'
   
   id = Column(Integer, primary_key = True)
   name = Column(String)
   address = Column(String)
   email = Column(String)

Một lớp trong Khai báo phải có __tablename__ thuộc tính và ít nhất một Columnlà một phần của khóa chính. Khai báo thay thế tất cảColumn các đối tượng có trình truy cập Python đặc biệt được gọi là descriptors. Quá trình này được gọi là thiết bị đo đạc cung cấp phương tiện để tham chiếu đến bảng trong ngữ cảnh SQL và cho phép duy trì và tải giá trị của các cột từ cơ sở dữ liệu.

Lớp được ánh xạ này giống như một lớp Python bình thường có các thuộc tính và phương thức theo yêu cầu.

Thông tin về lớp trong hệ thống Khai báo, được gọi là siêu dữ liệu bảng. SQLAlchemy sử dụng đối tượng Bảng để biểu diễn thông tin này cho một bảng cụ thể được tạo bởi Khai báo. Đối tượng Table được tạo theo các thông số kỹ thuật và được liên kết với lớp bằng cách xây dựng một đối tượng Mapper. Đối tượng ánh xạ này không được sử dụng trực tiếp mà được sử dụng nội bộ làm giao diện giữa lớp và bảng được ánh xạ.

Mỗi đối tượng Bảng là một thành viên của tập hợp lớn hơn được gọi là MetaData và đối tượng này có sẵn bằng cách sử dụng .metadatathuộc tính của lớp cơ sở khai báo. CácMetaData.create_all()là, chuyển vào Công cụ của chúng tôi như một nguồn kết nối cơ sở dữ liệu. Đối với tất cả các bảng chưa được tạo, nó đưa ra các câu lệnh CREATE TABLE cho cơ sở dữ liệu.

Base.metadata.create_all(engine)

Tập lệnh hoàn chỉnh để tạo cơ sở dữ liệu và bảng cũng như ánh xạ lớp Python được đưa ra bên dưới:

from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Customers(Base):
   __tablename__ = 'customers'
   id = Column(Integer, primary_key=True)

   name = Column(String)
   address = Column(String)
   email = Column(String)
Base.metadata.create_all(engine)

Khi được thực thi, bảng điều khiển Python sẽ lặp lại sau khi biểu thức SQL được thực thi:

CREATE TABLE customers (
   id INTEGER NOT NULL,
   name VARCHAR,
   address VARCHAR,
   email VARCHAR,
   PRIMARY KEY (id)
)

Nếu chúng ta mở Sales.db bằng công cụ đồ họa SQLiteStudio, nó sẽ hiển thị bảng khách hàng bên trong nó với cấu trúc đã đề cập ở trên.