12/08/2018, 13:12

SqlAlchemy trong python (part 4)

Giới thiệu Như trong những bài trước, tôi đã giới thiệu một cách tổng quan về sqlalchemy và mối quan hệ của nó trong những ứng dụng thực tế, và có đưa ra một chiều hướng phát triển sử dụng định nghĩa model của django.db và sử dụng truy vấn dựa trên sqlalchemy và aldjemy. Giới thiệu qua một ...

Giới thiệu

  • Như trong những bài trước, tôi đã giới thiệu một cách tổng quan về sqlalchemy và mối quan hệ của nó trong những ứng dụng thực tế, và có đưa ra một chiều hướng phát triển sử dụng định nghĩa model của django.db và sử dụng truy vấn dựa trên sqlalchemy và aldjemy.
  • Giới thiệu qua một chút về aldjemy. Aldjemy là một phần mở rộng của sqlalchemy , giúp cho việc truy vấn một cách đơn giản hơn và nhìn có vẻ "đối tượng" hơn. Nó chỉ đơn giả là một phần mở rộng của sqlalchemy, không có nhiều điều đáng nói ở đây, bạn có thể tìm hiểu thêm cách sử dụng Aldjemy tại Cách sử dụng Aldjemy

Bài toán

  • Bài toán đặt ra: Quản lý học sinh , và việc giáo viên dạy các lớp. Mỗi lớp có nhiều học sinh, mỗi giáo viên cũng có thể dạy nhiều lớp.

Xây dựng model

  • Ở đây tôi lấy bài toán đơn giản làm ví dụ cho việc sử dụng django.db kết hợp với sự truy vấn sqlalchemy, trên thực tế, bài toán quản lý học sinh và giáo viên tại một trường học không đơn giản như vậy. Tuy nhiên , ở mức đơn giản chúng ta sẽ xây dựng cơ sở dữ liệu như sau:

samle_database.png

  • Model được xây dựng đơn giản như trên, trong model, giáo viên có quan hệ một-nhiều với lớp môn học, thể hiện một giáo viên có thể dạy nhiều lớp học. Tương tự, một lớp học có nhiều học sinh, quan hệ giữa học sinh và lớp học cũng là một-nhiều. một môn học lại có nhiêu lớp học. Ngoài ra, chúng ta sẽ có một số thông tin của giáo viên, như Họ , Tên, Địa chỉ, số điện thoại. Với học sinh, chúng ta sẽ lưu trữ một số thông tin cơ bản như Họ, Tên, Địa chỉ, Ngaỳ sinh. Lớp hoc sẽ lưu trữ 2 thông tin cơ bản của một lớp học là tên lớp học, và mã lớp học.

Cài đặt Model

  • Như nói ở trên, chúng ta sẽ sử dụng django.db để xây dựng model và sẽ sử dụng sqlalchemy để truy vấn dữ liệu trong database. Khi đó database được xây dựng ở trên sẽ được định nghĩa như sau:
from django.db.models import(
    Model,
    TextField,
    DateTimeField,
    ForeignKey
)

class GiaoVien(Model):
    Ho = TextField()
    Ten = TextField()
    DiaChi = TextField()
    SDT = TextField()

    class Meta:
        db_table = "GiaoVien"

class HocSinh(Model):
    LopMonHoc = ForeignKey(LopMonHoc)
    Ho = TextField()
    Ten = TextField()
    DiaChi = TextField()
    Ngaysinh = DateTimeField()

    class Meta:
        db_table = "HocSinh"

class MonHoc(Model):
    TenLopHoc = TextField()
    MaMonHoc = TextField()

    class Meta:
        db_table = "MonHoc"

class LopMonHoc(Model):
    MonHoc = ForeignKey(MonHoc)
    GiaoVien = ForeignKey(GiaoVien)
    class Meta:
        db_table = "LopMonHoc"

Chúng ta sẽ migrate database và thực hiện chèn dữ liệu.

[code]

./manage.py makemigrations
./manage.py migrate

[/code]

Chú ý rằng việc migrations sử dụng theo tutorial của django db. Như đã nói từ trước, trong ví dụ này , chúng ta sẽ sẻ dụng django db để định nghĩa model, chúng ta sử dụng sqlalchemy để query dữ liệu.

Bật python console hoặc bất kỳ hệ quản trị cơ sở nào, có thể can thiệp vào cơ sở dữ liệu, để chèn dữ liệu mẫu.

Ở đây chúng ta sẽ thực hiện việc chèn dữ liệu mẫu bằng python console:

[code]

from <thư mục chứa project>.models import (
    GiaoVien, LopMonHoc, HocSinh, MonHoc
)
GiaoVien.objects.create(Ho="Tran", Ten="Hoang", DiaChi="HaNoi", SDT="0987654321").save()

MonHoc.objects.create(TenMonHoc="Toan Cao Cap", MaMonHoc="Math123").save()

LopMonHoc.objects.create(GiaoVien_id=1, MonHoc_id=1).save()

HocSinh(Ho="Tran", Ten="Van", DiaChi="HaNoi", NgaySinh="1992-06-06 22:22:22", LopMonHoc_id=1).save()

[/code]

Hiện tại chúng ta đã có cơ sở dữ liệu và dữ liệu mẫu. Chúng ta có thể thực hiện một số truy vấn như sau: (sử dụng sqlalchemy)

[code]

MonHoc.sa.query().all()
HocSinh.sa.query().get(1)
GiaoVien.sa.query(GiaoVien.sa.Ten).get(1)
GiaoVien.sa.query().filter(GiaoVien.sa.id == 1).update(GiaoVien.sa.DiaChi="Hung Yen")
HocSinh.sa.query().join(LopMonHoc.sa).filter(LopMonHoc.sa.id ==1).all()
HocSinh.sa.query().join(LopMonHoc.sa).join(GiaoVien.sa).filter(GiaoVien.sa.id==1).all()
HocSinh.sa.query().join(LopMonHoc.sa).join(MonHoc.sa).filter(MonHoc.sa.id==1).all()
HocSinh.sa.query().join(LopMonHoc.sa).join(MonHoc.sa).filter(MonHoc.sa.MaMonHoc == "Math123").all()
MonHoc.sa.query().filter(MonHoc.sa.TenMonHoc=="Toán Cao Cấp).all()

[/code]

Tổng kết

  • Trên đây tôi đã trình bày một ví dụ xây dựng ứng dụng dựa trên django.db và sử dung sqlalchemy dể thực hiện việc truy vấn dữ liệu trong database. Việc này có được lợi thế hơn việc chúng ta chỉ sử dụng django.db hay sử dụng sqlalchemy, bởi lẽ:
    • Định nghĩa model đơn giản hơn sqlalchemy, các mối quan hệ được thể hiện rõ ràng và quen thuộc với cơ sở dữ liệu quan hệ
    • Việc truy vấn dữ liệu theo những điều kiện phức tạp dễ dàng hơn chỉ sử dụng django.db
0