SQLAlchemy ORM - Xây dựng mối quan hệ

Phiên này mô tả việc tạo một bảng khác có liên quan đến một bảng đã tồn tại trong cơ sở dữ liệu của chúng tôi. Bảng khách hàng chứa dữ liệu chính của khách hàng. Bây giờ chúng ta cần tạo bảng hóa đơn có thể có bất kỳ số lượng hóa đơn nào thuộc về một khách hàng. Đây là trường hợp của một đến nhiều mối quan hệ.

Sử dụng tính năng khai báo, chúng tôi xác định bảng này cùng với lớp được ánh xạ của nó, Hóa đơn như được đưa ra bên dưới -

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

class Customer(Base):
   __tablename__ = 'customers'

   id = Column(Integer, primary_key = True)
   name = Column(String)
   address = Column(String)
   email = Column(String)

class Invoice(Base):
   __tablename__ = 'invoices'
   
   id = Column(Integer, primary_key = True)
   custid = Column(Integer, ForeignKey('customers.id'))
   invno = Column(Integer)
   amount = Column(Integer)
   customer = relationship("Customer", back_populates = "invoices")

Customer.invoices = relationship("Invoice", order_by = Invoice.id, back_populates = "customer")
Base.metadata.create_all(engine)

Điều này sẽ gửi một truy vấn CREATE TABLE tới SQLite engine như bên dưới:

CREATE TABLE invoices (
   id INTEGER NOT NULL,
   custid INTEGER,
   invno INTEGER,
   amount INTEGER,
   PRIMARY KEY (id),
   FOREIGN KEY(custid) REFERENCES customers (id)
)

Chúng tôi có thể kiểm tra bảng mới được tạo trong sales.db với sự trợ giúp của công cụ SQLiteStudio.

Lớp hóa đơn áp dụng cấu trúc ForeignKey trên thuộc tính custid. Chỉ thị này chỉ ra rằng các giá trị trong cột này phải được giới hạn là các giá trị có trong cột id trong bảng khách hàng. Đây là một tính năng cốt lõi của cơ sở dữ liệu quan hệ và là “chất keo” biến tập hợp các bảng không được kết nối thành có các mối quan hệ chồng chéo phong phú.

Chỉ thị thứ hai, được gọi là mối quan hệ (), cho ORM biết rằng lớp Hóa đơn nên được liên kết với lớp Khách hàng bằng cách sử dụng thuộc tính Invoice.customer. Mối quan hệ () sử dụng các mối quan hệ khóa ngoài giữa hai bảng để xác định bản chất của mối liên kết này, xác định rằng nó là nhiều đối với một.

Một chỉ thị quan hệ () bổ sung được đặt trên lớp được ánh xạ Khách hàng trong thuộc tính Customer.invoices. Tham số mối quan hệ.back_popates được chỉ định để tham chiếu đến các tên thuộc tính bổ sung, để mỗi mối quan hệ () có thể đưa ra quyết định thông minh về mối quan hệ tương tự như được biểu thị ngược lại. Ở một mặt, Invoices.customer đề cập đến phiên bản Hóa đơn và ở mặt khác, Customer.invoices đề cập đến danh sách các phiên bản Khách hàng.

Hàm quan hệ là một phần của API quan hệ của gói ORM SQLAlchemy. Nó cung cấp mối quan hệ giữa hai lớp được ánh xạ. Điều này tương ứng với mối quan hệ cha-con hoặc bảng kết hợp.

Sau đây là các Mẫu mối quan hệ cơ bản được tìm thấy:

Một đến nhiều

Mối quan hệ Một đến Nhiều đề cập đến phụ huynh với sự trợ giúp của khóa ngoại trên bảng con. Mối quan hệ () sau đó được chỉ định trên cha mẹ, như tham chiếu đến một tập hợp các mục được đại diện bởi con. Tham số mối quan hệ.back_popates được sử dụng để thiết lập mối quan hệ hai chiều trong một-nhiều, trong đó mặt "ngược lại" là nhiều đối một.

Nhiều thành một

Mặt khác, quan hệ Many to One đặt khóa ngoại trong bảng cha để tham chiếu đến phần tử con. Mối quan hệ () được khai báo trên cha, nơi một thuộc tính giữ vô hướng mới sẽ được tạo. Ở đây một lần nữa, tham số Mối quan hệ.back_popates được sử dụng cho Hai chiều.

One To One

Mối quan hệ One To One về bản chất là mối quan hệ hai chiều. Cờ danh sách sử dụng cho biết vị trí của thuộc tính vô hướng thay vì tập hợp ở phía "nhiều" của mối quan hệ. Để chuyển đổi một-nhiều thành loại quan hệ một-một, hãy đặt tham số danh sách sử dụng thành false.

Nhiều nhiều

Mối quan hệ Many to Many được thiết lập bằng cách thêm một bảng kết hợp liên quan đến hai lớp bằng cách xác định các thuộc tính bằng khóa ngoại của chúng. Nó được chỉ ra bởi đối số phụ của mối quan hệ (). Thông thường, Bảng sử dụng đối tượng MetaData được liên kết với lớp cơ sở khai báo, để các chỉ thị ForeignKey có thể xác định vị trí các bảng từ xa cần liên kết. Tham số mối quan hệ.back_popates cho mỗi mối quan hệ () thiết lập mối quan hệ hai chiều. Cả hai mặt của mối quan hệ đều chứa một tập hợp.