Tương tác Database bằng ngôn ngữ Python

Lập trình web với Python bằng Django

5.0 (1 đánh giá)
Tạo bởi Lê Châu Cập nhật lần cuối 3 năm trước 58.459 lượt xem 3 bình luận
Tác giả/Dịch giả: Lê Châu
Học nhanh

Danh sách bài học

Tương tác Database bằng ngôn ngữ Python

Ghi chú

Nội dung bài viết bạn đang xem được update từ tháng 06/2019. Vì vậy sẽ có đôi chút khác biệt giữ VIDEO và NỘI DUNG BÀI VIẾT.

Chúng ta sẽ có nhiều cập nhập hơn về cả bài viết lẫn video trong thời gian tới. Nhớ like/ share hoặc đánh giá 5 sao để Kteam có động lực nhé! 

Cảm ơn các bạn! 


Dẫn nhập

Ở bài trước, Kteam đã hướng dẫn cho các bạn xong cách THIẾT KẾ DATABASE BẰNG MODEL DJANGO. Bây giờ, ta cần tìm hiểu cách truy vấn dữ liệu để quản lý data bằng ngôn ngữ Python.


Nội dung

Để theo dõi bài này tốt nhất, bạn nên xem qua bài:

Bài này sẽ giới thiệu những nội dung sau:

  • Sử dụng Shell để truy vấn trực tiếp
  • Cách insert value
  • Cách select value
  • Cách update value

Sử dụng Shell để truy vấn trực tiếp

Nếu như chúng ta muốn viết những câu truy vấn trực tiếp, ta sẽ dùng câu lệnh shell của manage.py để thực tập lần này. Đầu tiên mở terminal và chạy câu lệnh sau:

Khi đó, manage sẽ mở chương trình để chạy lệnh ngay trên CMD (Terminal) để cho ta tương tác những model mà ta muốn

Nếu như mình muốn tương tác mới model Post, thì phải import nó vào. Vì Post nằm ở module models trong app home. Mình sẽ viết câu lệnh import là:

Bây giờ mình sẽ bắt đầu truy vấn đến bảng Post.


Cách insert value

Bây giờ chúng ta vẫn dùng tư duy hướng đối tượng để insert value vào bảng, Kteam sẽ khởi tạo 1 instance Post và truyền các giá trị vào các thuộc tính (Mỗi dòng là mình enter xuống dòng):

Kteam đã khởi tạo một instance a thuộc class Post, a có thuộc tính title là ‘First Title’, body là ‘Hello World’. Bây giờ muốn lưu thông tin a vào bảng Post trong database. Kteam sẽ gọi phương thức save(), là phương thức hỗ trợ sẵn trong model dùng để insert hoặc update dữ liệu xuống Database.

Bây giờ ta thử DB Browser For SQLite mở file sqlite mà Kteam đang sử dụng và truy vấn câu select để lấy dữ liệu bảng Post ra xem:

Ta thấy, đã có 1 row trong bảng. Ngoài cột title và body như ta đã truyền, thì ta đã có thêm id (cột tự tăng theo quy tắc của Django) và cột date tự tạo như mình đã mặc định ở bài trước.

Ở đây có 1 vấn đề là lúc này là ngày 14/09/2019 lúc 14h:28m nhưng cột date lại là 07h:28m. Nguyên nhân do phần setting.py nó mặc định giờ hệ thống ở múi giờ 0, trong khi nước mình lại ở múi giờ thứ 7. Ta có thể chỉnh lại sang giờ Việt Nam như sau, qua phần settings.py chỉnh biến TIME_ZONE là ‘Asia/Ho_Chi_Minh’

Ngoài cách insert như trên, ta có thể viết gọn như sau:


Cách select value

Sau khi thêm dữ liệu, bây giờ ta muốn truy vấn lấy dữ liệu từ bảng ra. Để viết câu “select * from blog_post; ”, ta có thể sử dụng như sau:

Khi gọi phương thức này, ta nhận được kết quả là một QuerySet List chứa các instance Post chính là 2 row dữ liệu ta vừa tạo trên trong bảng Post. Vì cách hiển thị nó là <Post: Post object (id)> làm mình khó nhận biết, Kteam sẽ override phương thức __str__ của class Post để hiển thị tốt hơn. Ta vào module models để override như sau:

Phương thức __str__ sẽ return giá trị title, nên mỗi lần print instance thuộc class Post thì nó sẽ hiển thị tiêu đề ra. Bây giờ ta hãy thoát shell ( bằng lệnh exit() ) để chạy lại xem kết quả có khác không.

Ta đã thấy kết 2 element trong List QuerySet đều trả về tiêu đề.

Nếu ta muốn câu truy vấn có điều kiện thì ta dùng phương thức get và truyền tham số là field của models đó bằng dữ liệu mà ta muốn tìm. Giống như Kteam muốn tìm Post có id bằng 1 hoặc Post có title bằng Secondary Post:


Cách update value

Việc cập nhật dữ liệu ở Django khá đơn giản, ta chỉ cần truy vấn tìm instance Post muốn cập nhật, thay đổi thuộc tính mình cần và dùng phương thức save() để cập nhật:


Kết

Như vậy Kteam đã hướng dẫn các bạn xong cách tương tác Database bằng ngôn ngữ Python.

Ở bài tiếp theo, Kteam sẽ giới thiệu cho các bạn HỆ THỐNG ADMIN TRONG PYTHON DJANGO.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Tương tác Database bằng ngôn ngữ Python dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Tác giả/Dịch giả

Quan tâm lập trình và lịch sử.

Thích tìm hiểu công nghệ mới

Khóa học

Lập trình web với Python bằng Django

Lập trình web với Python bằng Django

Đánh giá

5.0
1 đánh giá
Đánh giá
5
1
4
3
2
1
loozzi đã đánh giá 5 năm trước

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
hiếu lo đc đã bình luận 2 năm trước

em ấn "a.save()" rồi nó ra như vậy mà em ko bt cách sửa ai chỉ giúp em với

>>> a.save()
Traceback (most recent call last):
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in exec
ute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: blog_post

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\base.py", line 812, in save
    self.save_base(
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\base.py", line 863, in save_base
    updated = self._save_table(
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\base.py", line 1006, in _save_table
    results = self._do_insert(
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\base.py", line 1047, in _do_insert
    return manager._insert(
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_meth
od
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\query.py", line 1790, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\sql\compiler.py", line 1660, in execu
te_sql
    cursor.execute(sql, params)
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\utils.py", line 103, in execute
    return super().execute(sql, params)
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\utils.py", line 67, in execute
    return self._execute_with_wrappers(
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_wit
h_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\maitrunghieu\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in exec
ute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: blog_post

dongnhukhanh9210 đã bình luận 4 năm trước

Cách thứ delete thì như thế nào vậy ad.

Thanks

giang347 đã bình luận 6 năm trước

Bạn hướng dẫn thêm cả phần join các bảng với nhau thì tốt nhỉ

Không có video.