0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Kết nối DynamoDB bằng Python nhúng: Hướng dẫn sử dụng Boto3

Đăng vào 3 tuần trước

• 11 phút đọc

Giới thiệu

Khi lĩnh vực tương tác dữ liệu trong y tế ngày càng mở rộng để bao gồm trao đổi dữ liệu giữa các giải pháp trên nền tảng và đám mây, nhu cầu tích hợp với các dịch vụ như lưu trữ đám mây ngày càng gia tăng. Một trong những công cụ được sử dụng phổ biến và hỗ trợ tốt nhất là cơ sở dữ liệu NoSQL DynamoDB (Dynamo), do Amazon Web Services (AWS) cung cấp.

Thách thức cho các triển khai IRIS liên quan đến Dynamo và các dịch vụ web hiện đại khác là không có hỗ trợ gốc để tương tác với Dynamo và AWS trong ObjectScript. May mắn thay, chúng ta có thể tận dụng khả năng hỗ trợ Python nhúng của ObjectScript để sử dụng kết nối AWS thông qua Boto3 (SDK Python của Amazon).

Trong hướng dẫn này, chúng ta sẽ đi qua các bước cần thiết để thêm một mục vào bảng DynamoDB.

Các yêu cầu và giả định

Để kết nối với DynamoDB, bạn cần có những điều sau:

Hướng dẫn này giả định rằng các yêu cầu đã được thiết lập và tập trung vào việc kết nối thực tế đến DynamoDB và ghi dữ liệu vào bảng bằng ObjectScript và Python nhúng.

Trường hợp sử dụng

Giả sử chúng ta có một bảng Dynamo có tên “Nhân viên”, nhiệm vụ của chúng ta là thêm một nhân viên mới vào bảng. Chúng ta sẽ truyền vào “Tên”, “Họ” và “Số nhân viên”. Do chúng ta mới làm quen với công nghệ, chúng ta sẽ mã hóa cứng các giá trị, chứng minh một kết nối thành công và việc ghi dữ liệu vào bảng bằng Boto3.

Tổng quan

Khi đã cung cấp thông tin xác thực, các bước để kết nối đến DynamoDB như sau:

  1. Tạo một ClassMethod gọi trong ObjectScript
  2. Tạo một Method sẽ chứa logic kết nối bằng Python nhúng
  3. Nhập boto3 và tạo client
  4. Gọi phương thức put_item
  5. Tùy chọn: Trả về %Status

Có một vài trở ngại khác mà bạn có thể gặp phải và phần cuối của bài viết này cũng sẽ đề cập đến một số vấn đề mà tác giả đã gặp phải.

Kết nối đến DynamoDB

Bước 1: Tạo ClassMethod gọi trong ObjectScript

Bắt đầu bằng cách tạo một ClassMethod trong ObjectScript. Vì chúng ta sẽ mã hóa cứng mục được đưa vào bảng, đây là tất cả những gì cần thiết.

Mục đích của phương thức này là để bao bọc phương thức Python để ClassMethod có thể được gọi bởi một hoạt động khác phía trên.

objectscript Copy
ClassMethod writeToDynamoDB(tableName As %String)

Đối với trường hợp sử dụng này, một TableName được truyền vào dưới dạng %String. Giá trị trả về của %Status chỉ cần khi hoạt động phía trên cần phản hồi thành công/thất bại.

Bước 2: Tạo một Method giữ logic kết nối bằng Python nhúng

Phương thức Python này sẽ giữ logic thực tế để kết nối với Dynamo. Chữ ký phương thức được viết bằng ObjectScript nhưng thân phương thức được viết bằng Python và cú pháp được tuân thủ theo tiêu chuẩn của Python.

objectscript Copy
ClassMethod writeToDynamoDBpython(tableName As %String) [ Language = python ]

Chúng ta bắt đầu bằng cách sử dụng ClassMethod vì khi mã được biên dịch và chạy, ObjectScript sẽ không thấy nó khi được gọi. Cùng một “tableName” sẽ được truyền cho phương thức này để Python nhúng có thể sử dụng, do đó chúng ta sẽ sử dụng cùng một tên biến ở đây (vì đây chỉ là Strings, chương trình không cần điều chỉnh/biến đổi thêm). Chúng ta cũng phải chỉ định ngôn ngữ cần tuân theo bằng cách sử dụng ký hiệu ngoặc vuông.

Bước 3: Nhập boto3 và tạo Client

Cú pháp Python yêu cầu nhập các thư viện ngay từ đầu triển khai của bạn. Trong trường hợp này, chúng ta sẽ thực hiện điều này bên trong thân phương thức. Nhập một thư viện Python thường được thực hiện ở đầu tệp nhưng vì đây là một tệp ObjectScript, việc nhập bên ngoài thân phương thức sẽ gây ra một ngoại lệ.

objectscript Copy
ClassMethod writeToDynamoDBpython(tableName As %String) [ Language = python ]
{
    import boto3

    client = boto3.client('dynamodb')
}

Tiếp theo, cần tạo client để kết nối với Dynamo. Boto3 cung cấp một cách đơn giản để tạo client nhưng lưu ý rằng dịch vụ yêu cầu PHẢI được truyền vào, ví dụ: ‘dynamodb’, nếu không nó sẽ không kết nối đến dịch vụ chính xác (các ví dụ khác là ‘s3’, ‘cloudwatch’, v.v.).

Đối với trường hợp sử dụng này, chúng ta sẽ tạo một client trỏ đến một container docker đã được thiết lập để chạy hình ảnh của Dynamo để không tích lũy quá nhiều yêu cầu đến AWS:

objectscript Copy
client = boto3.client(
    service_name='dynamodb', 
    region_name='us-east-1', 
    endpoint_url='http://host.docker.internal:8080'
)

Bước 4: Gọi phương thức put_item

AWS cung cấp tài liệu rộng rãi về nhiều trường có thể được bao gồm trong cuộc gọi đến put_item(). Trong trường hợp này, chúng ta chỉ cần gửi cho nó “Tên”, “Họ” và “Số nhân viên” như sau:

objectscript Copy
response = client.put_item(
            TableName=tableName,
            Item={
                'First_Name': {
                    'S': 'Vic'
                },
                'Last_Name': {
                    'S': 'Cordova'
                },
                'Employee_Number': {
                     'N': '012345',
                }
)

Hai trường bắt buộc từ quan điểm của AWS là tableName và item được chèn vào bảng, ví dụ như “Item”. Khi sử dụng triển khai client này, định dạng cho đối tượng được chèn sẽ theo dạng key:value. Tên của đối tượng, ví dụ như ‘First_Name’, chỉ định tên cột bảng. Thông số ‘S’ bên trong đối tượng ‘First_Name’ cho AWS biết rằng giá trị liên quan là kiểu String (có thể có các kiểu dữ liệu khác như ‘SS’ cho danh sách, ‘N’ cho số, v.v.). Thông số này là bắt buộc khi sử dụng client.

Phương thức Python nhúng hoàn chỉnh:

objectscript Copy
ClassMethod writeToDynamoDBpython(tableName As %String) [ Language = python ]
{
    import boto3

    client = boto3.client(
        service_name='dynamodb', 
        region_name='us-east-1', 
        endpoint_url='http://host.docker.internal:8080'
    )

    response = client.put_item(
            TableName=tableName,
            Item={
                'First_Name': {
                    'S': 'Vic'
                },
                'Last_Name': {
                    'S': 'Cordova'
                },
                'Employee_Number': {
                     'N': '012345',
                }
    )
}

Bước 5: Gọi phương thức Python nhúng từ phương thức ObjectScript

Bây giờ mà logic đã hoàn tất, chúng ta có thể gọi phương thức Python từ phương thức ObjectScript, từ đó thực hiện kết nối. Điều này sẽ nhận vào tên bảng và chạy logic qua Python, ghi vào Dynamo.

objectscript Copy
ClassMethod writeToDynamoDB(tableName As %String)
{
    DO ..writeToDynamoDBpython(tableName)
}

Như hiện tại, nó có thể sử dụng được, tuy nhiên bất kỳ người gọi nào phía trên có thể yêu cầu một trạng thái trả về. Để thực hiện điều này, bước tiếp theo sẽ gợi ý một số cách để chỉ định thành công/thất bại cho bất kỳ hoạt động gọi nào.

Bước 6: Tùy chọn: Trả về %Status

Để truyền trạng thái thành công/thất bại lên phía trên, hãy xem xét các chỉnh sửa sau:

objectscript Copy
ClassMethod writeToDynamoDB(tableName As %String) As %Status
    {
        #dim tSC As %Status = $$$OK

        Set pyStatus = ..writeToDynamoDBpython(tableName)

        If (pyStatus '= "OK") {Set tSC = $$$ERROR($$$GeneralError,"failed to write to DynamoDB")}

        Quit tSC
    }

ClassMethod writeToDynamoDBpython(ByRef tableName As %String) [ Language = python ]
{
    import boto3

    client = boto3.client(
        service_name='dynamodb', 
        region_name='us-east-1', 
        endpoint_url='http://host.docker.internal:8080'
    )

    result = "OK"

    try:
    response = client.put_item(
            TableName=tableName,
            Item={
                'First_Name': {
                    'S': 'Vic'
                },
                'Last_Name': {
                    'S': 'Cordova'
                },
                'Employee_Number': {
                     'N': '012345',
                }
   )
       except:
            result = "BAD"

    return result
}
  • Thêm %Status vào định nghĩa của phương thức ObjectScript.
  • Thiết lập một biến trạng thái (ví dụ: “tSC”) để giữ macro $$OK.
  • Tạo một biến trạng thái trong phương thức Python nhúng bằng một chuỗi đơn giản, “OK”.
  • Bao bọc phương thức put_item() trong một try/except. “except:” nên cập nhật biến trạng thái thành một giá trị khác ngoài “OK” trong trường hợp ghi bị lỗi.
  • Trả về chuỗi trạng thái từ phương thức Python.
  • Thiết lập một biến lưu trữ giá trị được trả về từ phương thức Python (ví dụ: “Set pyStatus = ..writeToDynamoDBpython(tableName)”).
  • Kiểm tra kết quả của phản hồi đó trong ObjectScript bằng cách sử dụng một kiểm tra if. Trong trường hợp thất bại, cập nhật biến trạng thái (“tSC”) thành $$ERROR($$$GeneralError) kèm theo thông báo lỗi phù hợp.
  • Cuối cùng, kết thúc phương thức bằng cách sử dụng Quit và trả về giá trị của tSC cho người gọi phía trên.

Những trở ngại và lưu ý

Triển khai này cho thấy một ví dụ đơn giản nhằm cung cấp nền tảng từ đó một người triển khai có thể tiếp tục khám phá dựa trên trường hợp sử dụng và yêu cầu cụ thể của họ.

Giao tiếp giữa ObjectScript và AWS có thể là điều khó khăn nhất vì nó yêu cầu một trung gian truyền trạng thái và giá trị qua lại trong các kiểu dữ liệu có thể khác nhau.

Một điều cần lưu ý là triển khai này được mã hóa cứng. Để có cách tiếp cận lập trình hơn, ví dụ như truyền vào một chuỗi JSON, các chỉnh sửa như truyền JSON dưới dạng %DynamicObject và sử dụng phương thức .toJSON() trong ObjectScript kết hợp với khả năng của Python để chuyển đổi JSON thành đối tượng từ điển bằng phương thức load() có thể là một cách tiếp cận.

Việc nâng cao ngoại lệ từ Python nhúng cũng là một trở ngại vì các kiểu dữ liệu không khớp. Triển khai này đã sử dụng Strings để chỉ định thành công/thất bại kết hợp với try/except và các câu lệnh if (như đã đề cập trong đoạn mã trên) để thực hiện một số xử lý lỗi. Cũng đáng đề cập rằng các ngoại lệ Python sẽ được in ra, ví dụ nếu dữ liệu cần thiết bị thiếu, mà không cần phải được truyền sang ObjectScript. Việc truyền đạt các ngoại lệ có thể cần đến một số tinh chỉnh dựa trên trường hợp sử dụng cụ thể của bạn.

Tóm tắt/Kết luận

Tóm lại, việc thiết lập kết nối đến AWS bằng cách sử dụng client Dynamo, tạo một phương thức bao bọc trong ObjectScript, chứa logic put_item() trong một ClassMethod sử dụng Python nhúng và thực hiện các điều chỉnh cần thiết theo yêu cầu cá nhân làm cho việc tương tác với Dynamo trở nên khả thi.

Tham khảo tài liệu cũng sẽ rất hữu ích vì có đủ hỗ trợ từ cả InterSystems và AWS.

Tài nguyên

  • Tài liệu InterSystems cho Python nhúng
  • Khóa học InterSystems cho Python nhúng
  • Tài liệu Boto3 của Amazon
  • Tài liệu của Amazon cho phương thức put_item()
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào