Upserting dữ iệu trong TinyDB
Trong TinyDB, bên cạnh các truy vấn cập nhật (update) và chèn dữ liệu (insert), đôi khi chúng ta cần sự kết hợp của cả hai thao tác. Đó là lúc truy vấn upsert xuất hiện như một giải pháp hoàn hảo. Truy vấn này cho phép chèn và cập nhật dữ liệu cùng lúc dựa trên một điều kiện cụ thể. Nó hoạt động theo hai cách:
- Nếu dữ liệu đã tồn tại, thì nó sẽ thực hiện thao tác cập nhật.
- Nếu dữ liệu không tồn tại, thì nó sẽ thực hiện thao tác chèn mới.
Cú pháp của truy vấn upsert trong TinyDB
db.upsert({ 'key' : 'value', 'logged-in' : True}, điều kiện)
Dưới đây là một số ví dụ minh họa cách sử dụng truy vấn upsert trong TinyDB. Chúng ta sẽ tiếp tục làm việc với cơ sở dữ liệu sinh viên đã sử dụng trong các chương trước.
Ví dụ 1
Trong ví dụ này, chúng ta sẽ sử dụng truy vấn upsert để thay đổi địa chỉ của một sinh viên có roll_number là 2 thành "Surat". Vì có sinh viên với số thứ tự 2 trong cơ sở dữ liệu, nên thao tác sẽ cập nhật địa chỉ và đánh dấu trạng thái đăng nhập (logged-in) là True.
from tinydb import TinyDB, Query db = TinyDB('student.json') db.upsert({'address':'Surat'}, Query().roll_number == 2)
Sau khi thực hiện, TinyDB sẽ trả về kết quả cho biết bản ghi với ID là 2 đã được cập nhật:
Bài viết này được đăng tại [free tuts .net]
[2]
Chúng ta có thể xác nhận lại bằng cách truy vấn để lấy dữ liệu của bản ghi số 2 như sau:
db.get(doc_id=2)
Dữ liệu cập nhật sẽ hiển thị như sau:
{ 'roll_number': 2, 'st_name': 'Ram', 'mark': [250, 280], 'subject': ['TinyDB', 'MySQL'], 'address': 'Surat' }
Ví dụ 2
Trong ví dụ này, mình sẽ sử dụng truy vấn upsert để thêm dữ liệu mới cho một sinh viên không có trong bảng dữ liệu. Chúng ta sẽ thêm trường E-mail và cập nhật trạng thái đăng nhập (logged-in) của sinh viên có roll_number là 2.
from tinydb import TinyDB, Query db = TinyDB('student.json') db.upsert({'E-mail':'ram@gmail.com','logged-in': True}, Query().roll_number == 2)
Kết quả trả về cho thấy bản ghi số 2 đã được cập nhật:
[2]
Chúng ta có thể xác nhận lại bằng cách truy vấn dữ liệu của bản ghi số 2 như sau:
db.get(doc_id=2)
Dữ liệu cập nhật sẽ hiển thị như sau:
{ "roll_number":2, "st_name":"Ram", "mark":[250, 280], "subject":["TinyDB", "MySQL"], "address":"Surat", "logged-in":true, "E-mail":"ram@gmail.com" }
Lưu ý rằng chúng ta đã sử dụng truy vấn upsert để tạo mới một trường E-mail không tồn tại trước đó và gán giá trị là ram@gmail.com.
Kết bài
Truy vấn upsert là một tính năng mạnh mẽ và tiện lợi trong TinyDB, giúp giảm bớt sự phức tạp khi xử lý các tình huống cần phải vừa cập nhật vừa thêm dữ liệu mới. Điều này đặc biệt hữu ích khi làm việc với các hệ thống dữ liệu có thể thay đổi thường xuyên.