Khi nào cần chứng thực tài liệu?
Một quan niệm sai lầm phổ biến về việc sử dụng cơ sở dữ liệu NoSQL là không yêu cầu cấu trúc hoặc lược đồ tài liệu. Trong hầu hết các trường hợp, các ứng dụng có xu hướng có một số ràng buộc đối với dữ liệu mặc dù chúng có thể không xác thực cụ thể dữ liệu đó. Ví dụ: có thể có một số trường trong tài liệu mà ứng dụng phụ thuộc vào chức năng. Một ứng dụng có thể không hoạt động chính xác khi thiếu một số trường này
Một ví dụ thực tế về sự cố này có thể là một ứng dụng đọc dữ liệu từ một ứng dụng không đáng tin cậy khác định kỳ gửi dữ liệu xấu. Sẽ là khôn ngoan nếu đánh dấu bất kỳ tài liệu nào có thể phá vỡ ứng dụng trong những trường hợp như vậy. Nhà phát triển có thể thực hiện việc này trong ứng dụng hoặc ở cấp tài liệu.
Theo cách tiếp cận này, chúng tôi chỉ định một lược đồ cho các tài liệu để giúp xác định những tài liệu không khớp với thông số kỹ thuật của ứng dụng ở cấp tài liệu
Tạo dữ liệu thử nghiệm JSON
Chúng tôi sử dụng thư viện nguồn mở, Kẻ giả mạo, để tạo một số hồ sơ người dùng giả mạo cho hướng dẫn này.
Đây là cấu trúc của một tài liệu duy nhất
JavaScript1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"công việc". "Kỹ thuật viên X-quang, chẩn đoán",
"công ty". "Klein, Dillon và Neal",
"nơi cư trú". "2232 Jackson Forks\nLake Teresa, CO 46959",
"trang web". [
"http. //giám mục-torres. mạng/"
],
"tên người dùng". "aabbott",
"tên". "Madison Mitchell",
"địa chỉ". "1782 Căn hộ trên đồi Moore. 717\nTây Stephaniestad, NM 75293",
"thư". "amberrodriguez@hotmail. com",
"điện thoại". {
"nhà". "677-197-4239x889",
"di động". "001-594-038-9255x99138"
}
}
Để mô phỏng các tài liệu bị hỏng, tôi sửa đổi một phần nhỏ hồ sơ người dùng bằng cách xóa một số trường điện thoại di động và thư. Chúng tôi mong muốn xác định những bản ghi này, trong thế giới thực, sẽ được lưu trữ trong cơ sở dữ liệu tài liệu như Couchbase
Tôi tải dữ liệu đã tạo vào một bộ chứa trên cụm Couchbase Capella được lưu trữ của chúng tôi bằng cách sử dụng nhập < . Tôi chỉ định trường functionality in the built-in web console UI for our testing. I specify the tên người dùng làm khóa để nhận dạng duy nhất từng tài liệu.
Làm cách nào để chỉ định lược đồ cho tài liệu JSON?
Trong dữ liệu hồ sơ người dùng, tôi mong đợi các tài liệu tuân theo cấu trúc sau trong các ứng dụng của mình
- Các trường bắt buộc
- tên tài khoản
- Tên
- điện thoại – với các phần tử JSON cho “nhà” & “di động”
- thư
- trang web – một mảng
- trường tùy chọn
- Công ty
- nơi cư trú
- Công việc
- địa chỉ
Pydantic là một trong những thư viện phổ biến nhất trong Python để xác thực dữ liệu. Cú pháp để chỉ định lược đồ tương tự như sử dụng gợi ý loại cho hàm trong Python. Các nhà phát triển có thể chỉ định lược đồ bằng cách xác định một mô hình. Nó có một bộ tính năng phong phú để thực hiện nhiều xác nhận khác nhau. Chúng ta sẽ xem qua phần trình bày cho một số thông số kỹ thuật của tài liệu hồ sơ người dùng.
Một điều cần lưu ý về pydantic là theo mặc định, nó cố gắng ép buộc các loại dữ liệu bằng cách thực hiện chuyển đổi loại khi có thể—ví dụ: chuyển đổi chuỗi '1' thành số 1. Tuy nhiên, có một tùy chọn để bật kiểm tra loại nghiêm ngặt mà không cần thực hiện chuyển đổi.
Trong ví dụ mã này, bạn thấy một cấu hình cơ bản cho lược đồ UserProfile sử dụng cú pháp pydantic
con trăn1
2
3
4
5
6
7
8
9
10
11
lớp Hồ sơ người dùng[Mô hình cơ sở]:
"""Lược đồ cho hồ sơ người dùng"""
tên người dùng. str
tên. str
điện thoại. Điện thoại
thư. str
công ty. Tùy chọn[str]
nơi cư trú. Tùy chọn[str]
trang web. Danh sách[HttpUrl]
công việc. Tùy chọn[str]
địa chỉ. Tùy chọn[str]
Mỗi trường được chỉ định cùng với loại dữ liệu dự kiến. Các trường tùy chọn được đánh dấu là Tùy chọn. Một mảng được chỉ định bởi Danh sách từ khóa theo sau là loại dữ liệu mong muốn.
Trường tên người dùng cần phải là một chuỗi, trong khi trường công ty field is an optional string. If we look at the other lines in the snippet, we see the trang web là danh sách loại HttpUrl – . one of the many custom types provided by pydantic out of the box. HttpUrl được sử dụng để xác thực rằng URL hợp lệ và không phải chuỗi ngẫu nhiên. Tương tự, có các trường khác như email mà chúng tôi có thể sử dụng để đảm bảo rằng các trường email là một biểu mẫu hợp lệ.
Nếu bạn nhìn vào trường điện thoại , thì trường này được đánh dấu là Điện thoại type which is a custom type that we will define in the next code snippet:
con trăn1
2
3
4
5
6
7
8
9
10
11
lớp Điện thoại[Mô hình cơ sở]:
"""Lược đồ cho số điện thoại"""
nhà. str
di động. str
@trình xác thực["di động", "home"]
def does_not_contain_extension[cls, v]:
"""Kiểm tra xem các số điện thoại có chứa tiện ích mở rộng không"""
if "x" in v:
tăng Lỗi tiện ích mở rộng[wrong_value=v]
return v
Ở đây chúng tôi xác định rằng Điện thoại bao gồm hai trường, cả hai đều là chuỗi. nhà và di động. Điều này sẽ được kiểm tra bên trong Hồ sơ người dùng mô hình và được hiểu là mô hình Hồ sơ người dùng . phone field that contains home and mobile fields.
Pydantic cũng cho phép chúng tôi xác thực nội dung của dữ liệu cũng như loại và sự hiện diện của dữ liệu. Bạn có thể làm điều này bằng cách xác định các hàm xác thực các trường cụ thể. Trong ví dụ trên, chúng tôi xác thực các trường di động và nhà để kiểm tra . Nếu chúng chứa tiện ích mở rộng, chúng tôi không hỗ trợ tiện ích đó và đưa ra lỗi tùy chỉnh. Những lỗi này sau đó được hiển thị cho người dùng thực hiện xác thực.
Bạn có thể xem định nghĩa lược đồ bằng cách chỉ định Mô hình. phương thức schema_json[] như được hiển thị ở đây.
JavaScript1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
{
"tiêu đề". "Hồ sơ người dùng",
"mô tả". "Lược đồ cho hồ sơ người dùng",
"loại". "đối tượng",
"thuộc tính". {
"tên người dùng". {
"tiêu đề". "Tên người dùng",
"loại". "chuỗi"
},
"tên". {
"tiêu đề". "Tên",
"loại". "chuỗi"
},
"điện thoại". {
"$ref". "#/definitions/Phone"
},
"thư". {
"tiêu đề". "Thư",
"loại". "chuỗi"
},
"công ty". {
"tiêu đề". "Công ty",
"loại". "chuỗi"
},
"nơi cư trú". {
"tiêu đề". "Nơi cư trú",
"loại". "chuỗi"
},
"trang web". {
"tiêu đề". "Trang web",
"loại". "mảng",
"mặt hàng". {
"loại". "chuỗi",
"Độ dài tối thiểu". 1,
"Độ dài tối đa". 2083,
"định dạng". "uri"
}
},
"công việc". {
"tiêu đề". "Công việc",
"loại". "chuỗi"
},
"địa chỉ". {
"tiêu đề". "Địa chỉ",
"loại". "chuỗi"
}
},
"bắt buộc". [
"tên người dùng",
"tên",
"điện thoại",
"thư",
"trang web"
],
"định nghĩa". {
"Điện thoại". {
"tiêu đề". "Điện thoại",
"mô tả". "Lược đồ cho số điện thoại",
"loại". "đối tượng",
"thuộc tính". {
"nhà". {
"tiêu đề". "Nhà",
"type". "chuỗi"
},
"di động". {
"tiêu đề". "Di động",
"type". "chuỗi"
}
},
"bắt buộc". [
"nhà",
"di động"
]
}
}
}
Xác thực các tài liệu JSON dựa trên lược đồ Python pydantic
Bây giờ chúng tôi đã xác định lược đồ, hãy khám phá cách chúng tôi có thể xác thực các tài liệu dựa trên lược đồ
Việc xác thực có thể được thực hiện bằng cách sử dụng phương pháp pydantic parse_obj của mô hình. Bạn chỉ định tài liệu là từ điển và kiểm tra các ngoại lệ xác thực. Trong trường hợp này, chúng tôi tìm nạp tất cả các tài liệu [tối đa đến giới hạn đã chỉ định] bằng cách sử dụng truy vấn Couchbase và kiểm tra từng tài liệu một và báo cáo bất kỳ lỗi nào.
con trăn1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
password_authenticator = PasswordAuthenticator[DB_USER, DB_PWD]
cụm = Cụm[
CONN_STR,
Tùy chọn cụm[password_authenticator],
]
validation_error_count = 0
truy vấn = f"chọn hồ sơ. * từ `{BUCKET}`. {PHẠM VI}. {COLLECTION} hồ sơ GIỚI HẠN {DOCUMENT_LIMIT}"
thử.
kết quả = cụm. truy vấn[truy vấn]
cho hàng trong kết quả:
thử.
Hồ sơ người dùng. parse_obj[hàng]
validation_error_count += 1
ngoại trừ Lỗi xác thực as e:
in[f"Đã tìm thấy lỗi trong tài liệu. {row['username']}\n", e. json[]]
ngoại trừ Ngoại lệ như e:
in[e]
in[f"Đếm lỗi xác thực. {validation_error_count}"]
Lược đồ làm nổi bật một số lỗi được quan sát thấy trong tài liệu
JavaScript1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Lỗi tìm thấy trong tài liệu. aarias
[
{
"lộc". [
"điện thoại",
"nhà"
],
"tin nhắn". "value là phần mở rộng, có \"[932]532-4001x319\"",
"type". "value_error. tiện ích mở rộng",
"ctx". {
"wrong_value". "[932]532-4001x319"
}
},
{
"lộc". [
"điện thoại",
"di động"
],
"tin nhắn". "trường bắt buộc",
"type". "value_error. thiếu"
}
]
Tài liệu có ID aarias có phần mở rộng trong trường chính và điện thoại → mobile field is also missing.
Bản tóm tắt
Ví dụ về hồ sơ người dùng này cho thấy cách chúng tôi có thể dễ dàng tạo các lược đồ tùy chỉnh cho tài liệu JSON của mình. Bài đăng này cũng cho thấy cách sử dụng các khả năng kiểm tra và xác thực của Python và mô-đun pydantic. Tuy nhiên, đây chỉ là phần nổi của tảng băng chìm–còn nhiều loại khác mà chúng tôi có thể xác thực.
Các cách tiếp cận khác cũng có thể thực hiện được; . Điều này có thể được thực hiện khá dễ dàng bằng cách tích hợp lược đồ mà chúng tôi đã xác định ở đây với ứng dụng và xác minh dữ liệu trước khi chèn/nâng cấp vào Couchbase