+4

From SQLAIchemy to Migrate database in project (Part 1)

Chào các bạn đến với bài viết của mình, đã rất lâu rồi mình mới có thể ngồi lại và chia sẻ một số kiến thức mà mình đã tìm hiểu được cho các bạn đọc. Trong một dự án AI có yêu cầu lưu trữ dữ liệu, việc sử dụng cơ sở dữ liệu là cần thiết. Mình đã chọn SQLAlchemy để thực hiện việc này, và đó chính là lý do bài viết này được hoàn thành.

Cảm ơn các bạn đã lựa chọn bài viết này để tham khảo, nếu có bất cứ thắc mắc gì hãy comment bến dưới nhé! Bắt đầu thôi nào.

SQLAlchemy

SQLAlchemy

SQLAlchemy là khái niệm phổ biến trong python nếu bạn sử dụng đến database trong một dự án. Bởi lẽ, nó được xây dựng và thiết kế nhằm mục đích làm việc với cơ sở dữ liệu quan hệ ( Relational Database Management System - RMBMS) như MySQL, PostgreSQL, SQLite và nhiều loại khác. Nó cung cấp một công cụ mạnh mẽ để quán lý cơ sở dữ liệu một cách hiệu quả và dễ dàng.

Hai phần quan trọng nhất của SQLAlchenmy là Object Relational Mapping (ORM)Core

1. ORM

ORM giúp chúng ta dễ dàng thao tác với dữ liệu với Database lớn, giúp cho chúng ta dễ code, dễ maintain hơn. Bạn có thể tương tác với cơ sở dữ liệu thông qua các objects Python thay vì phải viết các câu lệnh SQL thủ công

Các thành phần chính của ORM:

  • Declarative Base: Sử dụng để định nghĩa các class ánh xạ tới các bảng trong database
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
  • Class Mapping: Định nghĩa các lớp tương ứng với các bảng trong databse
from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)
  • Session: Quản lý các các phiên làm việc (session) với database, giúp quản lý các thao tác CRUD (Create, Read, Update, Delete) một cách hiệu quả và đồng bộ hóa các thay đổi với cơ sở dữ liệu
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
  • Query: Cho phép thực hiện các truy vấn trên các đối tượng
users = session.query(User).all()
for user in users:
    print(user.name, user.age)

2. SQLAlchemy Core

SQLAlchemy Core là lớp trừu trượng thấp hơn, cho phép bạn viết các câu lệnh SQL một các trực tiếp nhưng vẫn tận dụng được các tính năng quản lý kết nối và tối ưu hóa.

Core cung cấp một cách làm việc với SQL thông qua các đội tượng "Table", "Column", "Expression".

Các thành phần của SQLAlchemy Core

  • Engine: Quán lý kết nối với cơ sở dữ liệu và là giao diện chính để tương tác với cơ sở dữ liệu
from sqlalchemy import create_engine
engine = create_engine('sqlite:///example.db')
  • MetaData: Lưu trữ thông tin về cấu trúc bảng và mối quan hệ giữa các bảng
from sqlalchemy import MetaData
metadata = MetaData()
  • Table: Đại diện cho một bảng trong database
from sqlalchemy import Table, Column, Integer, String
users = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('age', Integer)
)
  • Column: Đại diện cho một cột trong bảng
Column('name', String)

3. So sánh SQLAlchemy Core và ORM

  • SQLAlchemy Core:
    • Làm việc trực tiếp với SQL, có tính linh hoạt cao
    • Phù hợp với các tác vụ điều chỉnh nhiều và phức tạp
    • Cần hiểu rõ về SQL và cấu trúc của cơ sở dữ liệu
  • ORM:
    • Dễ sử dụng và làm việc với dữ liệu dưới dạng các Object trong Python
    • Giảm thiểu viết các câu lệnh SQL thủ công
    • Phù hợp cho các tác vụ CRUD thông thường với các ứng dụng hướng đối tượng (OOP)

4. Kết hợp SQLAlchemy Core và ORM

SQLAlchemy cho phép kết hợp cả Core và ORM để tận dụng lợi thế của cả hai phương pháp tiếp cận. Ví dụ, bạn có thể sử dụng ORM để quản lý các đối tượng và Core để thực hiện các truy vấn phức tạp hoặc tùy chỉnh.

SQLAlchemy là một công cụ mạnh mẽ và linh hoạt, cho phép bạn chọn phương pháp tiếp cận phù hợp nhất với nhu cầu của dự án, đồng thời tận dụng lợi thế của cả ORM và Core.

# Sử dụng ORM để quản lý đối tượng
new_user = User(name='Alice', age=30)
session.add(new_user)
session.commit()

# Sử dụng Core để thực hiện truy vấn tùy chỉnh
from sqlalchemy import select
stmt = select([users]).where(users.c.age > 20)
result = engine.execute(stmt)
for row in result:
    print(row)

Migrate Database

Migrate Database là gì

Database migration (di chuyển cơ sở dữ liệu) là quá trình quản lý và áp dụng các thay đổi đối với cấu trúc của cơ sở dữ liệu trong suốt vòng đời của một dự án. Các thay đổi này có thể bao gồm:

  • Thêm, sửa, xóa bảng
  • Thêm, sửa, xóa cột
  • Thay đổi kiểu dữ liệu của cột
  • Thêm, sửa, xóa các ràng buộc (constraints)

Mục tiêu của quá trình migration là duy trì sự đồng bộ giữa mã nguồn và cấu trúc cơ sở dữ liệu, giúp quản lý các thay đổi một cách hệ thống và giảm thiểu lỗi.

Tại sao cần migrate database?

  • Phát Triển và Bảo Trì:
    • Khi ứng dụng phát triển, yêu cầu về dữ liệu cũng thay đổi. Migration giúp cập nhật cơ sở dữ liệu mà không gây gián đoạn cho ứng dụng.
  • Quản Lý Phiên Bản:
    • Migration cho phép theo dõi các thay đổi trong cơ sở dữ liệu và quay lại phiên bản trước nếu cần thiết, hỗ trợ quản lý phiên bản cơ sở dữ liệu tương tự như cách quản lý mã nguồn.
  • Tự Động Hóa:
    • Migration có thể được tự động hóa để áp dụng các thay đổi một cách an toàn và nhất quán trên nhiều môi trường (phát triển, kiểm thử, sản xuất).

Alembic: Công cụ Migration cho SQLAlchemy

SQLAlchemy không cung cấp trực tiếp các công cụ để quản lý migration (di chuyển và thay đổi cấu trúc cơ sở dữ liệu), nhưng nó thường được sử dụng cùng với Alembic, một công cụ quản lý migration mạnh mẽ dành cho SQLAlchemy. Alembic cho phép bạn theo dõi và áp dụng các thay đổi đối với cấu trúc cơ sở dữ liệu một cách dễ dàng và có kiểm soát.

Alembic cung cấp một loạt các tính năng để quản lý migration, bao gồm:

  • Tạo và quản lý các phiên bản migration: Giữ các thay đổi cơ sở dữ liệu dưới dạng các file migration.
  • Tự động tạo migration: Tạo ra các migration dựa trên sự khác biệt giữa mô hình ORM và cấu trúc cơ sở dữ liệu hiện tại.
  • Áp dụng và quay lui migration: Di chuyển tới phiên bản cụ thể hoặc quay lại phiên bản trước đó.

Tổng kết

Trong bài viết này mình đã chia sẻ cho các bạn về cách sử dụng đến database trong một dự án bằng Python với SQLAlchemy và các quản lý các phiên bản (migration) database. Yên tâm, đây chỉ là phần 1 thôi, ở phần tiếp theo mình sẽ gửi tới các bạn kĩ hơn về cách khở tạo database bằng cách sử dụng PostgreSQL, cách cài đặt chi tiết Alembic để dử dụng với SQLAlchemy nhé. Hãy cùng ngóng chờ phần 2 của bài viết. Cảm ơn tất cả các bạn đã dành thời gian cho bài viết của mình. Have a good day~~


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.