Mọi thứ bạn cần biết về Python và Bản đồ quan hệ đối tượng

Mọi thứ bạn cần biết về Python và Bản đồ quan hệ đối tượng

Bạn có thể đã nghe nói về ánh xạ quan hệ đối tượng (ORM). Bạn thậm chí có thể đã sử dụng một cái, nhưng chính xác thì chúng là gì? Và làm thế nào để bạn sử dụng chúng trong Python?





Đây là mọi thứ bạn cần biết về ORM và Python.





ORM là gì?

Ánh xạ quan hệ đối tượng (ORM) là một kỹ thuật lập trình được sử dụng để truy cập cơ sở dữ liệu. Nó hiển thị cơ sở dữ liệu của bạn thành một loạt các đối tượng. Bạn không phải viết các lệnh SQL để chèn hoặc truy xuất dữ liệu, bạn sử dụng một loạt các thuộc tính và phương thức được gắn vào các đối tượng.





Nghe có vẻ phức tạp và không cần thiết, nhưng chúng có thể giúp bạn tiết kiệm rất nhiều thời gian và giúp kiểm soát quyền truy cập vào cơ sở dữ liệu của bạn.

Đây là một ví dụ. Nói rằng bất cứ khi nào bạn chèn mật khẩu vào cơ sở dữ liệu của mình, bạn muốn băm mật khẩu đó, như đã giải thích trong bảo mật mật khẩu trang web. Đây không phải là vấn đề đối với các trường hợp sử dụng đơn giản --- bạn thực hiện tính toán trước khi chèn. Nhưng điều gì sẽ xảy ra nếu bạn cần chèn một bản ghi ở nhiều nơi trong mã? Điều gì sẽ xảy ra nếu một lập trình viên khác chèn vào bảng của bạn và bạn không biết về nó?



Bằng cách sử dụng ORM, bạn có thể viết mã để đảm bảo rằng bất cứ khi nào và ở đâu bất kỳ hàng hoặc trường nào trong cơ sở dữ liệu của bạn đều được truy cập, mã tùy chỉnh khác của bạn sẽ được thực thi trước tiên.

Đây cũng hoạt động như một 'nguồn sự thật duy nhất'. Nếu bạn muốn thay đổi một phép tính tùy chỉnh, bạn chỉ phải thay đổi nó ở một nơi, không phải nhiều nơi. Có thể thực hiện nhiều nguyên tắc này với lập trình định hướng đối tượng (OOP) bằng Python , nhưng ORM hoạt động song song với các nguyên tắc OOP để kiểm soát quyền truy cập vào cơ sở dữ liệu.





Có một số điều cần chú ý khi sử dụng ORM và có những trường hợp bạn có thể không muốn sử dụng, nhưng chúng thường được coi là điều tốt cần có, đặc biệt là trong một cơ sở mã lớn.

ORM trong Python Sử dụng SQLAlchemy

Giống như nhiều tác vụ trong Python, việc nhập một mô-đun nhanh hơn và dễ dàng hơn so với việc viết của riêng bạn. Tất nhiên, có thể viết ORM của riêng bạn, nhưng tại sao phải phát minh lại bánh xe?





Các ví dụ sau đây đều sử dụng SQLAlchemy , một ORM Python phổ biến, nhưng nhiều nguyên tắc được áp dụng bất kể việc triển khai như thế nào.

Thiết lập Python cho SQLAlchemy

Trước khi bắt đầu ngay lập tức, bạn sẽ cần thiết lập máy của mình để phát triển Python với SQLAlchemy.

Bạn sẽ cần sử dụng Python 3.6 để làm theo các ví dụ này. Trong khi các phiên bản cũ hơn sẽ hoạt động, mã bên dưới sẽ cần một số sửa đổi trước khi chạy. Không chắc chắn về sự khác biệt? Câu hỏi thường gặp về Python của chúng tôi bao gồm tất cả các điểm khác biệt.

Trước khi viết mã, bạn nên thiết lập môi trường Python, môi trường này sẽ ngăn chặn các vấn đề với các gói Python đã nhập khác.

Hãy chắc chắn rằng bạn có PIP, trình quản lý gói Python được cài đặt, đi kèm với hầu hết các phiên bản Python hiện đại.

Khi đã sẵn sàng, bạn có thể bắt đầu bằng cách chuẩn bị sẵn SQLAlchemy. Từ bên trong môi trường Python của bạn trong dòng lệnh, hãy cài đặt SQLAlchemy với cài đặt pip chỉ huy:

pip install SQLAlchemy-1.2.9

Các 1.2.9 là số phiên bản. Bạn có thể bỏ qua điều này để tải gói mới nhất, nhưng thực hành tốt là bạn phải cụ thể. Bạn không biết khi nào bản phát hành mới có thể phá vỡ mã hiện tại của bạn.

Bây giờ bạn đã sẵn sàng để bắt đầu viết mã. Bạn có thể cần chuẩn bị cơ sở dữ liệu của mình để chấp nhận kết nối Python, nhưng tất cả các ví dụ sau đều sử dụng SQLite cơ sở dữ liệu được tạo trong bộ nhớ bên dưới.

Mô hình trong SQLAlchemy

Một trong những thành phần chính của ORM là người mẫu . Đây là một lớp Python phác thảo bảng trông như thế nào và nó sẽ hoạt động như thế nào. Đây là phiên bản ORM của TẠO BẢNG câu lệnh trong SQL. Bạn cần một mô hình cho mỗi bảng trong cơ sở dữ liệu của mình.

Mở trình soạn thảo văn bản hoặc IDE yêu thích của bạn và tạo một tệp mới có tên test.py . Nhập mã khởi động này, lưu tệp và chạy nó:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('sqlite://') # Create the database in memory
Base.metadata.create_all(engine) # Create all the tables in the database

Mã này thực hiện một số điều. Việc nhập là cần thiết để Python hiểu nơi tìm các mô-đun SQLAlchemy mà nó cần. Mô hình của bạn sẽ sử dụng căn cứ khai báo sau đó, và nó cấu hình bất kỳ mô hình mới nào để hoạt động như mong đợi.

Các create_engine phương pháp tạo một kết nối mới đến cơ sở dữ liệu của bạn. Nếu bạn đã có cơ sở dữ liệu, bạn sẽ cần thay đổi sqlite: // vào URI cơ sở dữ liệu của bạn. Như vậy, mã này sẽ chỉ tạo một cơ sở dữ liệu mới trong bộ nhớ. Cơ sở dữ liệu sẽ bị hủy sau khi mã của bạn hoàn tất quá trình thực thi.

cuối cùng create_all phương thức tạo tất cả các bảng được xác định trong các chế độ của bạn trong cơ sở dữ liệu của bạn. Khi bạn chưa xác định bất kỳ mô hình nào, sẽ không có gì xảy ra. Hãy tiếp tục và chạy mã này, để đảm bảo bạn không gặp bất kỳ sự cố hoặc lỗi chính tả nào.

Hãy làm một mô hình. Thêm một lần nhập khác vào đầu tệp của bạn:

from sqlalchemy import Column, Integer, String

Điều này nhập khẩu Cột , Số nguyên , và Dây mô-đun từ SQLAlchemy. Chúng xác định cách hoạt động của các bảng, trường, cột và kiểu dữ liệu trong cơ sở dữ liệu.

Bên dưới căn cứ khai báo , tạo lớp mô hình của bạn:

class Cars(Base):
__tablename__ = 'cars'
id = Column(Integer, primary_key=True)
make = Column(String(50), nullable=False)
color = Column(String(50), nullable=False)

Ví dụ đơn giản này sử dụng ô tô, nhưng các bảng của bạn có thể chứa bất kỳ dữ liệu nào.

Mỗi lớp phải kế thừa Cơ sở . Tên bảng cơ sở dữ liệu của bạn được xác định trong __tablename__ . Tên này phải giống với tên lớp, nhưng đây chỉ là đề xuất và sẽ không có gì phá vỡ nếu chúng không khớp.

Cuối cùng, mỗi cột được định nghĩa là một biến python trong lớp. Các kiểu dữ liệu khác nhau được sử dụng và khóa chính thuộc tính yêu cầu SQLAlchemy tạo Tôi làm khóa chính.

Hãy tiếp tục và thêm một lần nhập cuối cùng, lần này cho ForeignKey mô-đun. Thêm cái này cùng với của bạn Cột nhập khẩu:

from sqlalchemy import Column, ForeignKey, Integer, String

Bây giờ tạo một lớp mô hình thứ hai. Lớp này được gọi là CarOwners và thông tin chi tiết về chủ sở hữu cửa hàng của những chiếc xe cụ thể được lưu trữ trong Ô tô bàn:

class CarOwners(Base):
__tablename__ = 'carowners'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
age = Column(Integer, nullable=False)
car_id = Column(Integer, ForeignKey('cars.id'))
car = relationship(Cars)

Có một số thuộc tính mới được giới thiệu ở đây. Các car_id trường được định nghĩa là một khóa ngoại. Nó được liên kết với Tôi bên trong ô tô bàn. Chú ý cách tên bảng viết thường được sử dụng, bên trong tên lớp viết hoa.

Cuối cùng, một thuộc tính của xe ô tô được định nghĩa là một mối quan hệ . Điều này cho phép mô hình của bạn truy cập vào Ô tô bảng thông qua biến này. Điều này được chứng minh dưới đây.

Nếu bạn chạy mã này ngay bây giờ, bạn sẽ thấy rằng không có gì xảy ra. Điều này là do bạn chưa yêu cầu nó làm bất cứ điều gì đáng chú ý.

Đối tượng trong SQLAlchemy

Bây giờ các mô hình của bạn đã được tạo, bạn có thể bắt đầu truy cập các đối tượng và đọc và ghi dữ liệu. Bạn nên đặt logic của mình vào lớp và tệp của riêng nó, nhưng hiện tại, nó có thể ở cùng với các mô hình.

Viết dữ liệu

Trong ví dụ này, bạn cần phải chèn một số dữ liệu vào cơ sở dữ liệu trước khi bạn có thể đọc nó. Nếu bạn đang sử dụng cơ sở dữ liệu hiện có, bạn có thể đã có dữ liệu. Dù bằng cách nào, nó vẫn rất hữu ích khi biết cách chèn dữ liệu.

Bạn có thể quen với việc viết CHÈN câu lệnh trong SQL. SQLAlchemy xử lý việc này cho bạn. Đây là cách chèn một hàng vào Ô tô người mẫu. Bắt đầu với một lần nhập mới cho người phiên dịch :

from sqlalchemy.orm import sessionmaker

Điều này là cần thiết để tạo phiên họpDBSession các đối tượng, được sử dụng để đọc và ghi dữ liệu:

DBSession = sessionmaker(bind=engine)
session = DBSession()

Bây giờ đặt cái này bên dưới của bạn create_all tuyên bố:

car1 = Cars(
make='Ford',
color='silver'
)
session.add(car1)
session.commit()

Hãy chia nhỏ mã đó. Biến car1 được định nghĩa là một đối tượng dựa trên Ô tô người mẫu. Kiểu dáng và màu sắc của nó được đặt làm thông số. Điều này giống như nói 'làm cho tôi một chiếc ô tô, nhưng đừng ghi nó vào cơ sở dữ liệu'. Chiếc xe này tồn tại trong ký ức nhưng đang chờ được viết.

Thêm xe vào phiên với session.add , và sau đó ghi nó vào cơ sở dữ liệu với session.commit .

Bây giờ, hãy thêm chủ sở hữu:

owner1 = CarOwners(
name='Joe',
age='99',
car_id=(car1.id)
)
session.add(owner1)
session.commit()

Mã này gần như giống với đoạn chèn trước đó cho Ô tô người mẫu. Sự khác biệt chính ở đây là car_id là một khóa ngoại vì vậy cần một id hàng tồn tại trong bảng khác. Điều này được truy cập thông qua car1.id bất động sản.

Bạn không phải truy vấn cơ sở dữ liệu hoặc trả về bất kỳ id nào, vì SQLAlchemy xử lý việc này cho bạn (miễn là bạn cam kết dữ liệu trước).

Đọc dữ liệu

Khi bạn đã viết một số dữ liệu, bạn có thể bắt đầu đọc lại nó. Đây là cách truy vấn Ô tôCarOwners những cái bàn:

result = session.query(Cars).all()

Nó là đơn giản. Bằng cách sử dụng truy vấn phương pháp được tìm thấy trong phiên họp , bạn chỉ định mô hình, và sau đó sử dụng tất cả các phương pháp để lấy tất cả các kết quả. Nếu bạn biết sẽ chỉ có một kết quả, thì bạn có thể sử dụng đầu tiên phương pháp:

result = session.query(Cars).first()

Khi bạn đã truy vấn mô hình và lưu trữ kết quả trả về của mình trong một biến, bạn có thể truy cập dữ liệu thông qua đối tượng:

print(result[0].color)

Điều này sẽ in ra màu 'bạc', vì bản ghi đó là hàng đầu tiên. Bạn có thể lặp lại đối tượng kết quả nếu bạn muốn.

Khi bạn xác định mối quan hệ trong mô hình của mình, bạn có thể truy cập dữ liệu trong các bảng liên quan mà không cần chỉ định một phép nối:

result = session.query(CarOwners).all()
print(result[0].name)
print(result[0].car.color)

Điều này hoạt động vì mô hình của bạn chứa các chi tiết về cấu trúc bảng của bạn và xe ô tô thuộc tính được xác định là một liên kết đến ô tô bàn.

Có gì không thích về ORM?

Hướng dẫn này chỉ bao gồm những điều rất cơ bản, nhưng khi bạn đã nắm rõ những điều đó, bạn có thể chuyển sang các chủ đề nâng cao. Có một số nhược điểm tiềm ẩn đối với ORM:

  • Bạn phải viết mô hình của mình trước khi có thể chạy bất kỳ truy vấn nào.
  • Đó là một cú pháp mới khác để tìm hiểu.
  • Nó có thể quá phức tạp đối với những nhu cầu đơn giản.
  • Bạn phải có một thiết kế cơ sở dữ liệu tốt để bắt đầu.

Bản thân những vấn đề này không phải là vấn đề lớn, nhưng chúng là những điều cần chú ý. Nếu bạn đang làm việc với một cơ sở dữ liệu hiện có, bạn có thể gặp khó khăn.

Nếu bạn không tin rằng ORM là công cụ phù hợp với bạn, thì hãy đảm bảo rằng bạn đã đọc về các lệnh SQL quan trọng mà lập trình viên nên biết .

Đăng lại Đăng lại tiếng riu ríu E-mail Bạn có nên nâng cấp lên Windows 11 ngay lập tức không?

Windows 11 sắp ra mắt, nhưng bạn nên cập nhật càng sớm càng tốt hay đợi vài tuần? Hãy cùng tìm hiểu.

Đọc tiếp
Chủ đề liên quan
  • Lập trình
  • Python
  • SQL
  • Hướng dẫn viết mã
Giới thiệu về tác giả Joe Coburn(136 bài báo đã xuất bản)

Joe tốt nghiệp ngành Khoa học Máy tính tại Đại học Lincoln, Vương quốc Anh. Anh ấy là một nhà phát triển phần mềm chuyên nghiệp và khi anh ấy không lái máy bay không người lái hay viết nhạc, anh ấy thường có thể bị bắt gặp chụp ảnh hoặc sản xuất video.

2 ứng dụng trình phát trên các thiết bị riêng biệt
Xem thêm từ Joe Coburn

Theo dõi bản tin của chúng tôi

Tham gia bản tin của chúng tôi để biết các mẹo công nghệ, đánh giá, sách điện tử miễn phí và các ưu đãi độc quyền!

Bấm vào đây để đăng ký