You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用boto3调用import_table报错:'DynamoDB'对象无该属性

解决boto3调用import_table报错'DynamoDB' object has no attribute 'import_table'的问题

报错核心原因

该报错是因为你的boto3版本过低,import_table对应DynamoDB的ImportTable API,较旧版本的boto3未集成该接口。

解决步骤

  • 升级boto3和botocore到最新版本:
    pip install --upgrade boto3 botocore
    
  • 验证版本兼容性:执行以下代码确认版本是否支持import_table(需至少1.20.0以上版本)
    import boto3
    print(boto3.__version__)
    

针对定期导入场景的额外优化

你提到会在导入前删除旧表,注意DynamoDB删除表是异步操作,直接删除后立即调用import_table会因表处于删除中状态报错,需添加等待表删除完成的逻辑。

修改后的完整代码示例

import boto3
from botocore.exceptions import ClientError
import time

class YourDataImporter:
    def __init__(self):
        self.session = boto3.Session()
        self.db_client = self.session.client("dynamodb")
        self.table_name = "your-target-table"
        self.bucket_name = "your-s3-bucket"
        self.report_csv_key = "path/to/your.csv"
        self.table_key_arn = "your-kms-key-arn"
        self.logger = ...  # 替换为你的logger实例

    def wait_for_table_deletion(self):
        """等待表完全删除"""
        while True:
            try:
                self.db_client.describe_table(TableName=self.table_name)
                self.logger.info(f"表 {self.table_name} 仍在删除中,等待10秒...")
                time.sleep(10)
            except ClientError as e:
                if e.response['Error']['Code'] == 'ResourceNotFoundException':
                    self.logger.info(f"表 {self.table_name} 已删除完成")
                    break
                else:
                    self.logger.error(f"检查表状态失败: {str(e)}")
                    raise

    def delete_old_table(self):
        """删除旧表(不存在则跳过)"""
        try:
            self.db_client.delete_table(TableName=self.table_name)
            self.logger.info(f"已触发删除表 {self.table_name}")
            self.wait_for_table_deletion()
        except ClientError as e:
            if e.response['Error']['Code'] == 'ResourceNotFoundException':
                self.logger.info(f"表 {self.table_name} 不存在,无需删除")
            else:
                self.logger.error(f"删除表失败: {str(e)}")
                raise

    def create_table_from_csv(self) -> dict:
        """从S3 CSV导入到DynamoDB新表"""
        response = None
        try:
            # 先清理旧表
            self.delete_old_table()
            
            self.logger.info(f"启动S3 CSV导入任务,目标表: {self.table_name}")
            response = self.db_client.import_table(
                S3BucketSource={
                    "S3Bucket": self.bucket_name,
                    "S3KeyPrefix": self.report_csv_key,
                },
                InputFormat="CSV",
                TableCreationParameters={
                    "TableName": self.table_name,
                    "AttributeDefinitions": [
                        {"AttributeName": "instanceArn", "AttributeType": "S"},
                        {"AttributeName": "instanceName", "AttributeType": "S"},
                    ],
                    "KeySchema": [
                        {"AttributeName": "instanceArn", "KeyType": "HASH"},
                        {"AttributeName": "instanceName", "KeyType": "RANGE"},
                    ],
                    "BillingMode": "PROVISIONED",
                    "ProvisionedThroughput": {
                        "ReadCapacityUnits": 5,
                        "WriteCapacityUnits": 5,
                    },
                    "SSESpecification": {
                        "Enabled": True,
                        "SSEType": "KMS",
                        "KMSMasterKeyId": self.table_key_arn,
                    },
                },
            )
            self.logger.info(f"导入任务已启动,任务ARN: {response['ImportTableDescription']['ImportArn']}")
        except ClientError as error:
            self.logger.error(f"导入CSV失败,文件路径: {self.report_csv_key}")
            self.logger.error(f"错误详情: {str(error)}")
            raise

        return response

权限补充说明

确保执行代码的IAM角色拥有以下权限:

  • DynamoDB相关:dynamodb:ImportTable、dynamodb:DeleteTable、dynamodb:DescribeTable
  • S3相关:s3:GetObject、s3:ListBucket
  • KMS相关(若使用加密):kms:Encrypt、kms:Decrypt、kms:DescribeKey

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:53:27