

# Chamar a API de dados do Amazon RDS por meio de uma aplicação Python
<a name="data-api.calling.python"></a>

É possível chamar a API de dados do Amazon RDS (API de dados) por meio de uma aplicação Python.

Os exemplos a seguir usam o AWSSDK for Python (Boto). Para obter mais informações sobre o Boto, consulte a [Documentação do AWSSDK for Python (Boto 3)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html).

Em cada exemplo, substitua o nome do recurso da Amazon (ARN) do cluster de banco de dados pelo ARN do cluster de banco de dados do Aurora. Além disso, substitua o ARN do segredo pelo ARN do segredo no Secrets Manager que concede acesso ao cluster de banco de dados.

**Topics**
+ [Executar uma consulta SQL](#data-api.calling.python.run-query)
+ [Executar uma instrução SQL DML](#data-api.calling.python.run-inert)
+ [Executar uma transação SQL](#data-api.calling.python.run-transaction)

## Executar uma consulta SQL
<a name="data-api.calling.python.run-query"></a>

Você pode executar uma instrução `SELECT` e obter os resultados com uma aplicação Python.

O exemplo a seguir executa uma consulta SQL.

```
import boto3
	
	rdsData = boto3.client('rds-data')
	
	cluster_arn = '{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}'
	secret_arn = '{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}'
	
	response1 = rdsData.execute_statement(
	            resourceArn = cluster_arn,
	            secretArn = secret_arn,
	            database = '{{mydb}}',
	            sql = '{{select * from employees limit 3}}')
	
	print (response1['records'])
	[
	    [
	        {
	            'longValue': 1
	        },
	        {
	            'stringValue': 'ROSALEZ'
	        },
	        {
	            'stringValue': 'ALEJANDRO'
	        },
	        {
	            'stringValue': '2016-02-15 04:34:33.0'
	        }
	    ],
	    [
	        {
	            'longValue': 1
	        },
	        {
	            'stringValue': 'DOE'
	        },
	        {
	            'stringValue': 'JANE'
	        },
	        {
	            'stringValue': '2014-05-09 04:34:33.0'
	        }
	    ],
	    [
	        {
	            'longValue': 1
	        },
	        {
	            'stringValue': 'STILES'
	        },
	        {
	            'stringValue': 'JOHN'
	        },
	        {
	            'stringValue': '2017-09-20 04:34:33.0'
	        }
	    ]
	]
```

## Executar uma instrução SQL DML
<a name="data-api.calling.python.run-inert"></a>

Você pode executar uma instrução de linguagem de manipulação de dados (DML) para inserir, atualizar ou excluir dados no banco de dados. Você também pode usar parâmetros em instruções DML.

**Importante**  
Se uma chamada não faz parte de uma transação por não incluir o parâmetro `transactionID`, alterações resultantes da chamada são confirmadas automaticamente.

O exemplo a seguir executa um instrução SQL de inserção e usa parâmetros.

```
import boto3
	
	cluster_arn = '{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}'
	secret_arn = '{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}'
	
	rdsData = boto3.client('rds-data')
	
	
	param1 = {'name':'firstname', 'value':{'stringValue': '{{JACKSON}}'}}
	param2 = {'name':'lastname', 'value':{'stringValue': '{{MATEO}}'}}
	paramSet = [param1, param2]
	
	response2 = rdsData.execute_statement(resourceArn=cluster_arn,
	                                      secretArn=secret_arn,
	                                      database='{{mydb}}',
	                                      sql='{{insert into employees(first_name, last_name) VALUES(:firstname, :lastname)}}',
	                                      parameters = paramSet)
	
	print (response2["numberOfRecordsUpdated"])
```

## Executar uma transação SQL
<a name="data-api.calling.python.run-transaction"></a>

Você pode iniciar uma transação SQL, execute uma ou mais instruções SQL e confirme as alterações com uma aplicação Python.

**Importante**  
Uma transação expira se não há chamadas que usam o ID da transação em três minutos. Se uma transação expira antes de ser confirmada, ela é revertida automaticamente.  
Se você não especificar um ID de transação, as alterações resultantes da chamadas serão confirmadas automaticamente.

O exemplo a seguir executa uma transação SQL que insere uma linha em uma tabela.

```
import boto3
	
	rdsData = boto3.client('rds-data')
	
	cluster_arn = '{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}'
	secret_arn = '{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}'
	
	tr = rdsData.begin_transaction(
	     resourceArn = cluster_arn,
	     secretArn = secret_arn,
	     database = '{{mydb}}')
	
	response3 = rdsData.execute_statement(
	     resourceArn = cluster_arn,
	     secretArn = secret_arn,
	     database = '{{mydb}}',
	     sql = '{{insert into employees(first_name, last_name) values('XIULAN', 'WANG')}}',
	     transactionId = tr['transactionId'])
	
	cr = rdsData.commit_transaction(
	     resourceArn = cluster_arn,
	     secretArn = secret_arn,
	     transactionId = tr['transactionId'])
	
	cr['transactionStatus']
	'Transaction Committed'
	
	response3['numberOfRecordsUpdated']
	1
```

**nota**  
Se você executar uma instrução de linguagem de definição de dados (DDL), recomendamos continuar a executar a instrução depois que a chamada expira. Quando uma instrução DDL é encerrada antes que ela termine de ser executada, podem ocorrer erros e possivelmente estruturas de dados corrompidos. Para continuar a executar uma instrução depois que uma chamada ultrapassa o intervalo de tempo limite de 45 segundos da API de dados do RDS, defina o parâmetro `continueAfterTimeout` como `true`.