Sử dụng SQLAlchemy để thao tác với Database

Cách sử dụng SQLAlchemy để kết nối và thao tác với Database

Sử dụng SQLAlchemy để thao tác với Database

Trong quá trình xây dựng Data Pipeline, ban đầu mình sử dụng sqlite3 để đơn giản hoá quá trình thao tác với Database. Nhưng sau đó, khi hệ thống có nhiều bảng hơn, dẫn tới nhiều quan hệ hơn, cần nhiều index, truy vấn hơn,... mình nhận ra sqlite3 đôi khi không đáp ứng đủ các nhu cầu đó. Vì vậy mình đã tìm hiểu và sử dụng SQLAlchemy để thao tác với PostgreSQL, một cách thuần Python. Trong bài viết này mình sẽ chia sẻ những thứ mình đã tìm hiểu được khi sử dụng thư viện này.

I. Khởi tạo SQLAlchemy

Đầu tiên cần khởi tạo biến môi trường, theo dạng: DATABASE_URL="postgresql+psycopg://<user_name>:<password>@localhost:5432/<db_name>". Tiếp theo tiến hành khởi tạo như sau:

python
from sqlalchemy import create_engine 
engine = create_engine(DATABASE_URL)

II. Khởi tạo Table

Thay vì viết:

sql
CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER
);

chúng ta có thể khai báo bằng Python:

python
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(100))
    age: Mapped[int]

Sau đó tạo bảng:Base.metadata.create_all(engine). SQLAlchemy sẽ generate SQL tương ứng và gửi xuống SQLite.

III. Insert & Select bằng SQLAlchemy

Với ORM, một record database trở thành một Python object:

python
from sqlalchemy.orm 
import Session
user = User( name="Minh", age=20 ) 
with Session(engine) as session: 
	session.add(user) 
	session.commit()

Pipeline lúc này là tạo User, add vào Session, commit, Session là interface chính mà SQLAlchemy ORM sử dụng để làm việc với database và transaction.

Ví dụ lấy toàn bộ user có tuổi lớn hơn 18:

python
from sqlalchemy import select
with Session(engine) as session:
    stmt = select(User).where(User.age >= 18)
    users = session.scalars(stmt).all()
    for user in users:
        print(user.name, user.age)
	

IV. UPDATE và DELETE bằng SQLAlchemy ORM

python
with Session(engine) as session:
    user = session.get(User, 1)
    user.age = 21
    session.commit()

Điểm thú vị là chúng ta chỉ thay đổi Python object:user.age = 21. SQLAlchemy theo dõi thay đổi và tạo câu UPDATE phù hợp.

python
with Session(engine) as session:
    user = session.get(User, 1)

    session.delete(user)

    session.commit()

Thay vì tự viết: DELETE FROM users WHERE id = 1;

Được chọn theo chủ đề và các khái niệm xuất hiện trong bài này.

Xem tất cả bài viết

Thảo luận bài viết

Câu hỏi, ghi chú và góc nhìn của bạn về nội dung này.

0 bình luận