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, Show 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
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ộcMộ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ó. |