SQL Database API
Referência da SQL Database API: abra uma réplica de leitura em uma function, execute queries com parâmetros, prepare statements e leia as linhas retornadas.
A SQL Database API do Azion Runtime permite que uma function leia um banco de dados do SQL Database. A function abre o banco de dados pelo nome, executa queries SQL com parâmetros posicionais ou nomeados, prepara statements e lê o resultado linha a linha. Cinco objetos compõem a API: Database, Connection, Statement, Rows e Row.
Acesso
A classe Database fica no global Azion.Sql. Leia a classe no início da function:
O import de módulo import { Database } from "azion:sql" não passa no build: o build para com Could not resolve "azion:sql". Use o global no lugar dele.
Database
Database abre uma conexão com um banco de dados da sua conta. A classe recebe o nome do banco de dados e nenhum token.
| Método | Descrição | Parâmetros | Retorno |
|---|---|---|---|
static async open(name) | Abre uma conexão com a réplica de leitura do banco de dados. | name: string | Connection |
A conexão é somente leitura. Uma instrução que escreve, como insert ou delete, falha com Error: SQLite failure: `attempt to write a readonly database` . Para escrever linhas, execute as instruções pela Azion API. Para mais informações, consulte Bancos de dados e consultas.
Connection
Uma Connection é o canal para um banco de dados. Database.open() retorna a conexão.
| Método | Descrição | Parâmetros | Retorno |
|---|---|---|---|
async query(sql, params) | Executa uma instrução SQL e retorna o conjunto de resultados dela. | sql: string; params: array ou objeto | Rows |
async execute(sql, params) | Executa uma instrução SQL sem conjunto de resultados. | sql: string; params: array ou objeto | — |
async prepare(sql) | Prepara uma instrução SQL para execuções posteriores. | sql: string | Statement |
Uma conexão também tem os métodos close() e tryClose().
Parâmetros
A string sql aceita dois tipos de parâmetro, e params carrega os valores deles:
- Posicional: um
?na instrução, com os valores em um array, na ordem.query("select name from users where id = ?", [2])retornaUser2. - Nomeado: um
:<param_name>na instrução, com os valores em um objeto. Cada chave mantém os dois-pontos:{ ":id": 3 }associa:ide retornaUser3. A chaveidsem os dois-pontos não associa nada, e a query não retorna nenhuma linha.
Valores inteiros são associados. Uma string JavaScript passada como valor de parâmetro é recusada em query e execute com TypeError: unknown variant `String`, expected one of `Null`, `Integer`, `Real`, `Text`, `Blob` .
Statement
Um Statement é uma instrução SQL preparada uma vez e executada com os valores dos parâmetros dela. Connection.prepare() retorna o statement.
| Método | Descrição | Parâmetros | Retorno |
|---|---|---|---|
async query(params) | Executa o statement com os valores em params e retorna o conjunto de resultados dele. | params: array ou objeto | Rows |
parameterCount() | Retorna o número de parâmetros do statement, por exemplo 1 para um ?. | — | inteiro |
parameterName(index) | Retorna o nome do parâmetro na posição index. Um parâmetro ? não tem nome, e o método retorna null. | index: inteiro | string ou null |
columns() | Retorna um objeto por coluna do resultado: name, origin_name, table_name, database_name e decl_type. | — | array de objetos |
Um statement também tem os métodos execute(), que o executa sem conjunto de resultados, e tryClose().
Passe os valores dos parâmetros para o query() do statement, não para prepare(). Valores passados para prepare() não são associados: prepare("select name from users where id = ?", [1]) seguido de query() não retorna nenhuma linha.
Para select name from users where id = ? em uma tabela users, columns() retorna:
Rows
Um objeto Rows é o conjunto de resultados que uma query retorna. Leia o resultado uma linha por vez com next().
| Método | Descrição | Parâmetros | Retorno |
|---|---|---|---|
async next() | Retorna a próxima linha do resultado, ou null depois da última linha. | — | Row ou null |
columnCount() | Retorna o número de colunas do resultado. | — | inteiro |
columnName(index) | Retorna o nome da coluna na posição index. | index: inteiro | string |
columnType(index) | Retorna o código de tipo da coluna na posição index: 1 para uma coluna INTEGER, 3 para uma coluna TEXT. | index: inteiro | inteiro |
Row
Um Row contém os valores de uma linha de um conjunto de resultados. As colunas são endereçadas por index, a partir de 0.
| Método | Descrição | Parâmetros | Retorno |
|---|---|---|---|
columnName(index) | Retorna o nome da coluna na posição index. | index: inteiro | string |
columnType(index) | Retorna o código de tipo da coluna na posição index: 1 para uma coluna INTEGER, 3 para uma coluna TEXT. | index: inteiro | inteiro |
getValue(index) | Retorna o valor no tipo dele: um número para uma coluna INTEGER, uma string para uma coluna TEXT. | index: inteiro | número ou string |
getString(index) | Retorna o valor como string, por exemplo "1" para o inteiro 1. | index: inteiro | string |
Erros
Database.open(), query() e execute() lançam os erros abaixo. Capture o erro e leia o name e a message dele.
| Erro | Causa |
|---|---|
EdgeSqlError: Database not found: <name>, maybe it wasn't propagated to edge yet | Database.open() recebeu um nome que não corresponde a nenhum banco de dados da conta. Verifique o nome. |
Error: SQLite failure: `no such table: <table>` | A instrução cita uma tabela que o banco de dados não tem. |
Error: SQLite failure: `attempt to write a readonly database` | A instrução escreve. A conexão lê uma réplica; escreva pela Azion API. |
TypeError: unknown variant `String`, expected one of `Null`, `Integer`, `Real`, `Text`, `Blob` | Um valor de parâmetro é uma string JavaScript. |
Exemplo
Esta function lê todas as linhas da tabela users em my-database e retorna a tabela como texto, uma linha da tabela por linha de texto, com | entre os valores:
Com uma tabela users de duas colunas, id e name, e quatro linhas, uma requisição GET para a function com deploy feito retorna: