# SQL Database API

import LinkButton from 'azion-webkit/linkbutton'

A **SQL Database API** fornece uma interface para interação com banco de dados no [SQL Database](/en/documentation/products/store/sql-database/) a partir de Functions executadas na Azion Web Platform. Essa documentação destaca os componentes chaves da API e fornece  um exemplo de código.


<LinkButton link="/pt-br/documentacao/produtos/store/sql-database/" label="saiba mais sobre o SQL Database" severity="secondary" />

---

## Database

Cria uma conexão com um banco de dados no SQL Database para sua aplicação. Retorna um objeto do tipo **Connection**

### Métodos

Método   | Descrição | Assinatura | Parâmetros | Retorno
---      |    ---    |    ---     | ---        | ---
Open     | Abre uma conexão com a réplica de leitura de um banco de dados EdgeSQL | `static async open(name)` | `name: string` | `Connection`

---

## Connection

Representa o canal de comunicação com um banco de dados EdgeSQL específico. Este objeto pode ser obtido ao abrir um banco de dados.

### Métodos

Método   | Descrição | Assinatura | Parâmetros | Retorno
---      |    ---    |    ---     |  ---        | ---
Execute  | Executa um comando SQL | `async execute(sql,params)` | `sql: <string> `<br />` - '?' parâmetro posicional `<br />` - :<param_name> `<br />` params:  `<br />`- Array de valores posicionais`<br />` - Dicionário de valores`| `-`
Query    | Executa um comando SQL | `async query(sql, params)` | `sql: <string> `<br />` - '?' parâmetro posicional `<br />` - :<param_name> `<br />` params:  `<br />`- Array de valores posicionais`<br />` - Dicionário de valores`| `Rows`
Prepare  | Prepara um comando SQL para execução a partir da combinação do comando e parâmetros | `async prepare(sql,params)` | `sql: <string> `<br />` - '?' parâmetro posicional `<br />` - :<param_name> `<br />` params:  `<br />`- Array de valores posicionais`<br />` - Dicionário de valores` | `Statement`

---

## Statement

Uma abstração de um comando SQL, o objeto Statement permite a execução do comando representado. Ele pode ser criado a partir de um comando `Connection.prepare`.

### Métodos

Método  | Descrição | Assinatura | Parâmetros | Retorno
---     |    ---    |    ---     |   ---      | ---
Execute | Executa um comando SQL | `async execute(sql, params)` | `sql: <string> `<br />` - '?' parâmetro posicional `<br />` - :<param_name> `<br />` params: `<br />`- Array de valores posicionais`<br />` - Dicionário de valores` | `-`
Query   | Executa um comando SQL | `async query(sql, params)` | `sql: <string> `<br />` - '?' parâmetro posicional `<br />` - :<param_name> `<br />` params: `<br />`- Array de valores posicionais`<br />` - Dicionário de valores` | `Rows`

### Atributos

Atributo       | Descrição | Assinatura | Parâmetros | Retorno
---            |    ---    |    ---     |    ---     | ---
`parameterCount` | Retorna o número de parâmetros relacionados do statement  | `parameterCount()` | `-` | `int32`
`parameterName`  | Retorna o nome do parâmetro | `parameterName(index)` | `index: int32` | `String`
`columns`        | Retorna a lista de colunas relacionadas ao statement  | `columns()` | `-` | `Object`

---

## Rows

Representa o conjunto de resultados retornados por uma consulta SQL.

### Métodos

Método | Descrição | Assinatura | Parâmetros | Retorno
---    |    :---:  |    :---:    |    :---:   | :---:
next   | Retorna a próxima linha da resposta da consulta | `async next()` | `-` | `<Row>` ou `null`

### Atributos

Atributo     | Descrição | Assinatura | Parâmetros | Retorno
---          |    ---    |    ---     |    ---     | ---
`columnCount` | Retorna o número de colunas do resultado da consulta | `columnCount()` | `-` | `int32`
`columnName`  | Retorna o nome da coluna | `parameterName(index)` | `index: int32` | `String`
`columnType`  | Retorna o tipo da coluna | `columnType(index)` | `index: int32` | `int32`

---

## Row

Representa o conjunto de atributos e valores em uma linha de um conjunto de resultados.

### Atributos

Atributo    | Descrição | Assinatura | Parâmetros | Retorno
---         |    ---    |    ---     |    ---     | ---
`columnName` | Retorna o nome da coluna | `columnName(index)` | `index: int32` | `String`
`columnType` | Retorna o tipo da coluna | `ColumnType(index)` | `index: int32` | `int32`
`getValue`   | Retorna o valor do atributo | `getValue(index)` | `index: int32` | `Valor`
`getString`  | Retorna o valor do atributo como string | `getString(index)` | `index: int32` | `String`

## Exemplo de código 

O exemplo de código abaixo apresenta uma forma de interação com um banco de dados e recuperação de dados de uma tabela. Este exemplo utiliza um banco de dados chamado `mydatabase` e a tabela `users`.

```javascript
import { Database } from "azion:sql";

async function db_query() {
  let connection = await Database.open("mydatabase");
  let rows = await connection.query("select * from users");
  let column_count = rows.columnCount();
  let column_names = [];
  for (let i = 0; i < column_count; i++) {
    column_names.push(rows.columnName(i));
  }
  let response_lines = [];
  response_lines.push(column_names.join("|"));
  let row = await rows.next();
  while (row) {
    let row_items = [];
    for (let i = 0; i < column_count; i++) {
      row_items.push(row.getString(i));
    }
    response_lines.push(row_items.join("|"));
    row = await rows.next();
  }
  const response_text = response_lines.join("\n");
  return response_text;
}

async function handle_request(request) {
  if (request.method != "GET") {
    return new Response("Método não permitido", { status: 405 });
  }
  try {
    return new Response(await db_query());
  } catch (e) {
    console.log(e.message, e.stack);
    return new Response(e.message, { status: 500 });
  }
}

addEventListener("fetch", (event) =>
  event.respondWith(handle_request(event.request))
);
``` 

Considerando que o banco de dados e a tabela já existem, a saída seria: 

```
id|name
1|User1
2|User2
3|User3
4|User4
```