Hàm tạo lớp bản đồ Python

SQLAlchemy có hai kiểu cấu hình trình ánh xạ riêng biệt, sau đó có các tùy chọn phụ khác về cách chúng được thiết lập. Sự thay đổi trong các kiểu trình ánh xạ hiện diện để phù hợp với danh sách tùy chọn đa dạng của nhà phát triển, bao gồm mức độ trừu tượng của lớp do người dùng định nghĩa từ cách nó được ánh xạ tới các bảng và cột lược đồ quan hệ, loại phân cấp lớp nào đang được sử dụng,

Trong SQLAlchemy hiện đại, sự khác biệt giữa các phong cách này chủ yếu là bề ngoài; . Vì quy trình về cơ bản là giống nhau trong mọi trường hợp, các lớp được ánh xạ từ các kiểu khác nhau luôn hoàn toàn tương thích với nhau

API ánh xạ ban đầu thường được gọi là kiểu "cổ điển", trong khi kiểu ánh xạ tự động hơn được gọi là kiểu "khai báo". SQLAlchemy hiện đề cập đến hai kiểu ánh xạ này là ánh xạ bắt buộc và ánh xạ khai báo

Bất kể kiểu ánh xạ nào được sử dụng, tất cả các ánh xạ ORM kể từ SQLAlchemy 1. 4 bắt nguồn từ một đối tượng duy nhất được gọi là , là sổ đăng ký của các lớp được ánh xạ. Sử dụng sổ đăng ký này, một tập hợp các cấu hình trình ánh xạ có thể được hoàn thiện thành một nhóm và các lớp trong một sổ đăng ký cụ thể có thể tham chiếu đến nhau theo tên trong quy trình cấu hình

Thay đổi trong phiên bản 1. 4. Ánh xạ khai báo và cổ điển hiện được gọi là ánh xạ "khai báo" và "bắt buộc" và được thống nhất nội bộ, tất cả đều bắt nguồn từ cấu trúc đại diện cho một tập hợp các ánh xạ liên quan

ánh xạ khai báo

Ánh xạ khai báo là cách điển hình mà ánh xạ được xây dựng trong SQLAlchemy hiện đại. Mẫu phổ biến nhất là trước tiên xây dựng một lớp cơ sở bằng cách sử dụng hàm, hàm này sẽ áp dụng quy trình ánh xạ khai báo cho tất cả các lớp con xuất phát từ nó. Dưới đây có một cơ sở khai báo, sau đó được sử dụng trong ánh xạ bảng khai báo

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import declarative_base

# declarative base class
Base = declarative_base[]

# an example mapping using the base
class User[Base]:
    __tablename__ = "user"

    id = Column[Integer, primary_key=True]
    name = Column[String]
    fullname = Column[String]
    nickname = Column[String]

Ở trên, khả năng gọi được trả về một lớp cơ sở mới mà từ đó các lớp mới được ánh xạ có thể kế thừa từ đó, như trên một lớp ánh xạ mới

from sqlalchemy.orm import registry

# equivalent to Base = declarative_base[]

mapper_registry = registry[]
Base = mapper_registry.generate_base[]
0 được xây dựng

Lớp cơ sở đề cập đến một đối tượng duy trì một tập hợp các lớp được ánh xạ có liên quan. Trên thực tế, hàm này là cách viết tắt để tạo sổ đăng ký đầu tiên bằng hàm tạo, sau đó tạo một lớp cơ sở bằng phương thức

from sqlalchemy.orm import registry

# equivalent to Base = declarative_base[]

mapper_registry = registry[]
Base = mapper_registry.generate_base[]

Các kiểu ánh xạ Khai báo chính được trình bày chi tiết hơn trong các phần sau

Trong phạm vi của một lớp được ánh xạ khai báo, cũng có hai loại cách siêu dữ liệu có thể được khai báo. Bao gồm các

  • - các định nghĩa riêng lẻ được kết hợp với tên bảng và các đối số bổ sung, trong đó quy trình ánh xạ Khai báo sẽ xây dựng một đối tượng được ánh xạ

  • - Thay vì chỉ định riêng tên bảng và các thuộc tính, một đối tượng được xây dựng rõ ràng được liên kết với một lớp được ánh xạ theo cách khác. Kiểu ánh xạ này là sự kết hợp giữa ánh xạ “khai báo” và “mệnh lệnh”

Tài liệu về ánh xạ khai báo tiếp tục tại Lớp ánh xạ với khai báo

Lập bản đồ bắt buộc

Một ánh xạ bắt buộc hoặc cổ điển đề cập đến cấu hình của một lớp được ánh xạ bằng phương thức, trong đó lớp đích không bao gồm bất kỳ thuộc tính lớp khai báo nào. Phong cách "mệnh lệnh bản đồ" trong lịch sử đã đạt được bằng cách sử dụng chức năng trực tiếp, tuy nhiên, chức năng này hiện mong đợi rằng có mặt

Ở dạng “cổ điển”, siêu dữ liệu bảng được tạo riêng với cấu trúc, sau đó được liên kết với lớp

from sqlalchemy.orm import registry

# equivalent to Base = declarative_base[]

mapper_registry = registry[]
Base = mapper_registry.generate_base[]
0 thông qua phương thức

from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import registry

mapper_registry = registry[]

user_table = Table[
    "user",
    mapper_registry.metadata,
    Column["id", Integer, primary_key=True],
    Column["name", String[50]],
    Column["fullname", String[50]],
    Column["nickname", String[12]],
]


class User:
    pass


mapper_registry.map_imperatively[User, user_table]

Thông tin về các thuộc tính được ánh xạ, chẳng hạn như mối quan hệ với các lớp khác, được cung cấp qua từ điển

from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import registry

mapper_registry = registry[]

user_table = Table[
    "user",
    mapper_registry.metadata,
    Column["id", Integer, primary_key=True],
    Column["name", String[50]],
    Column["fullname", String[50]],
    Column["nickname", String[12]],
]


class User:
    pass


mapper_registry.map_imperatively[User, user_table]
5. Ví dụ dưới đây minh họa một đối tượng thứ hai, được ánh xạ tới một lớp có tên là
from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import registry

mapper_registry = registry[]

user_table = Table[
    "user",
    mapper_registry.metadata,
    Column["id", Integer, primary_key=True],
    Column["name", String[50]],
    Column["fullname", String[50]],
    Column["nickname", String[12]],
]


class User:
    pass


mapper_registry.map_imperatively[User, user_table]
7, sau đó được liên kết với
from sqlalchemy.orm import registry

# equivalent to Base = declarative_base[]

mapper_registry = registry[]
Base = mapper_registry.generate_base[]
0 thông qua

________số 8

Khi sử dụng ánh xạ cổ điển, các lớp phải được cung cấp trực tiếp mà không có lợi ích của hệ thống “tra cứu chuỗi” do Khai báo cung cấp. Các biểu thức SQL thường được chỉ định theo các đối tượng, tôi. e.

address = Table[
    "address",
    metadata_obj,
    Column["id", Integer, primary_key=True],
    Column["user_id", Integer, ForeignKey["user.id"]],
    Column["email_address", String[50]],
]

mapper_registry.map_imperatively[
    User,
    user,
    properties={
        "addresses": relationship[Address, backref="user", order_by=address.c.id]
    },
]

mapper_registry.map_imperatively[Address, address]
1 ở trên cho mối quan hệ
from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import registry

mapper_registry = registry[]

user_table = Table[
    "user",
    mapper_registry.metadata,
    Column["id", Integer, primary_key=True],
    Column["name", String[50]],
    Column["fullname", String[50]],
    Column["nickname", String[12]],
]


class User:
    pass


mapper_registry.map_imperatively[User, user_table]
7 chứ không phải
address = Table[
    "address",
    metadata_obj,
    Column["id", Integer, primary_key=True],
    Column["user_id", Integer, ForeignKey["user.id"]],
    Column["email_address", String[50]],
]

mapper_registry.map_imperatively[
    User,
    user,
    properties={
        "addresses": relationship[Address, backref="user", order_by=address.c.id]
    },
]

mapper_registry.map_imperatively[Address, address]
3, vì
from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import registry

mapper_registry = registry[]

user_table = Table[
    "user",
    mapper_registry.metadata,
    Column["id", Integer, primary_key=True],
    Column["name", String[50]],
    Column["fullname", String[50]],
    Column["nickname", String[12]],
]


class User:
    pass


mapper_registry.map_imperatively[User, user_table]
7 có thể chưa được liên kết với siêu dữ liệu bảng, chúng tôi cũng không thể chỉ định một chuỗi ở đây

Một số ví dụ trong tài liệu vẫn sử dụng cách tiếp cận cổ điển, nhưng lưu ý rằng cách tiếp cận cổ điển cũng như Khai báo hoàn toàn có thể hoán đổi cho nhau. Cả hai hệ thống cuối cùng tạo ra cùng một cấu hình, bao gồm một lớp do người dùng định nghĩa, được liên kết với nhau bằng một. Khi chúng ta nói về “hành vi của”, điều này cũng bao gồm cả khi sử dụng hệ thống Khai báo - nó vẫn được sử dụng, chỉ ở hậu trường

map[] trả về gì trong Python?

hàm map[] trả về một đối tượng bản đồ [là một trình lặp] của các kết quả sau khi áp dụng hàm đã cho cho từng mục của một lần lặp nhất định [danh sách, bộ, v.v. ]

__ init __ có phải là hàm tạo không?

Phương thức đặc biệt __init__ là hàm tạo của Python . Với sự hiểu biết về lập trình hướng đối tượng và các lớp, bây giờ chúng ta hãy xem cách phương thức __init__ hoạt động trong chương trình Python.

Một lớp có thể có 2 hàm tạo trong Python không?

Cung cấp nhiều hàm tạo với @classmethod trong Python. Một kỹ thuật hiệu quả để cung cấp nhiều hàm tạo trong Python là sử dụng @classmethod . Trình trang trí này cho phép bạn biến một phương thức thông thường thành một phương thức lớp. Không giống như các phương thức thông thường, các phương thức lớp không lấy thể hiện hiện tại, self, làm đối số.

Bạn có thể có nhiều __ init __ trong Python không?

Có một số cách mà một phương thức __init__ có thể được gọi nhiều lần . Có thể có nhiều hơn một lệnh gọi rõ ràng đến phương thức trong hệ thống phân cấp của các phương thức __init__. Một lớp sử dụng nhiều kế thừa gọi trực tiếp các phương thức __init__ của các kiểu cơ sở của nó.

Chủ Đề