【问题标题】:Using Boto3 to interact with amazon Aurora on RDS使用 Boto3 与 RDS 上的 amazon Aurora 交互
【发布时间】:2020-07-11 12:07:17
【问题描述】:

我已经使用 Amazon Aurora 在 Amazon RDS 中建立了一个数据库,并希望使用 Python 与该数据库进行交互 - 显而易见的选择是使用 Boto。

但是,他们的文档很糟糕,并且没有涵盖我可以与数据库交互的方式:

  • 使用 SQL 语句运行查询
  • 与数据库中的表交互

有没有人有一些示例/教程的链接,或者知道如何完成这些任务?

【问题讨论】:

    标签: python mysql amazon-web-services boto3


    【解决方案1】:

    使用 Amazon RDS 产品(包括 Aurora)时,您无需通过任何 AWS API(包括 Boto)连接到数据库。相反,您将使用所选数据库的本机客户端。对于 Aurora,您将使用 MySQL 命令行客户端进行连接。从那里,您可以像查询任何其他 MySQL 数据库一样查询它。

    “入门”文档中有一个简短的部分讨论了连接到您的 Aurora 数据库:

    Connecting to an Amazon Aurora DB Cluster

    【讨论】:

    • 谢谢。请原谅我的天真,但是我将如何去创建和 API 以通过查询获取数据以在 Web/移动应用程序中使用?例如,是否有一组服务或 API?
    • @user3024827 - 不。没有 API。您只需连接到您的数据库,就像它是本地的一样。 RDS 只不过是一个托管数据库解决方案。
    • 这是否意味着它不能用作应用程序的数据库?如果这是一个愚蠢的问题,再次道歉,我对此很陌生!
    • @user3024827 - 它绝对可以用作应用程序的数据库。我只是说你对待它与在本地运行数据库服务器没有任何不同。
    • 我觉得这个答案可能会造成更多的歧义,并指导人们寻找使用 Boto3 连接到 Aurora 的方法。有一些 API 可以使用 boto3 连接到“rds-data”,然后运行查询。这在尝试使用秘密管理器而不是直接使用用户名密码进行连接时特别有用。
    【解决方案2】:

    这里有几个例子:

    插入示例:

    import boto3
    
    sql = """
            INSERT INTO YOUR_TABLE_NAME_HERE
            (
                your_column_name_1
                ,your_column_name_2
                ,your_column_name_3)
            VALUES(
                :your_param_1_name
                ,:your_param_2_name)
                ,:your_param_3_name
            """
    
    param1 = {'name':'your_param_1_name', 'value':{'longValue': 5}}
    param2 = {'name':'your_param_2_name', 'value':{'longValue': 63}}
    param3 = {'name':'your_param_3_name', 'value':{'stringValue': 'para bailar la bamba'}}
    
    param_set = [param1, param2, param3]
    
    db_clust_arn = 'your_db_cluster_arn_here'
    
    db_secret_arn = 'your_db_secret_arn_here'
    
    rds_data = boto3.client('rds-data')
    
    response = rds_data.execute_statement(
        resourceArn = db_clust_arn, 
        secretArn = db_secret_arn, 
        database = 'your_database_name_here', 
        sql = sql,
        parameters = param_set)
    
    print(str(response))
    

    阅读示例:

    import boto3
    
    rds_data = boto3.client('rds-data')
    
    db_clust_arn = 'your_db_cluster_arn_here'
    
    db_secret_arn = 'your_db_secret_arn_here'
    
    
    employee_id = 35853
    
    get_vacation_days_sql = f"""
        select vacation_days_remaining
        from employees_tbl
        where employee_id = {employee_id}    
            """
    
    
    response1 = rds_data.execute_statement(
            resourceArn = db_clust_arn, 
            secretArn = db_secret_arn, 
            database = 'your_database_name_here', 
            sql = get_vacation_days_sql)
    
    #recs is a list (of rows returned from Db)
    recs = response1['records']
    
    print(f"recs === {recs}")
    #recs === [[{'longValue': 57}]]
    
    #single_row is a list of dictionaries, where each dictionary represents a 
    #column from that single row
    for single_row in recs:
        print(f"single_row === {single_row}")
        #single_row === [{'longValue': 57}]
        
        #one_dict is a dictionary with one key value pair
        #where the key is the data type of the column and the 
        #value is the value of the column
        #each additional column is another dictionary
        for single_column_dict in single_row:
            print(f"one_dict === {single_column_dict}")
            # one_dict === {'longValue': 57}
    
            vacation_days_remaining = single_column_dict['longValue']
            
            print(f'vacation days remaining === {vacation_days_remaining}')
    

    来源链接: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html#data-api.calling.python

    【讨论】:

    • 在 Glue 上运行时 Boto3 中没有 rds-data 客户端
    • 在 READ 示例中,您应该使用其他示例中的参数而不是 f 字符串,以避免潜在的 sql 注入。
    • 这仅适用于您运行 Aurora Serverless 并已启用数据 API 的情况。
    猜你喜欢
    • 2018-03-06
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多