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:
from sqlalchemy import create_engine
engine = create_engine(DATABASE_URL)II. Khởi tạo Table
Thay vì viết:
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);chúng ta có thể khai báo bằng 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:
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:
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
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.
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;

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.