Oracle Autonomous Database + Python3: criando database e conectando
Tags: cloud, python, tutorial
Published: 2022-10-14 07:05:11

Recentemente comecei a desenvolver um pequeno projeto que precisaria de um pequeno banco de dados, realmente pequeno: os registros seriam dicionários com duas ou três propriedades, algo como:
```
{
  foo: bar,
  zig: bee,
  created_at: sometime
}
```
Porém, desta vez não queria subir um banco de dados dentro de um container docker, por questões de economia de recurso: a aplicação por já consumiria as máquinas que o [always free tier](https://www.oracle.com/cloud/free/#always-free) da Oracle Cloud disponibiliza.

Sendo assim, fui dar uma olhada para os outros recursos fornecidos pela Oracle, e entre eles, achei o Autonomous JSON Database, que entrega 20GB de armazenamento (não é muito, mas é 0800 :D) e acabei escolhendo como parte da stack do projetinho. 

##Criando o Banco de Dados
A criação é bem simples, no painel do OCI: Menu > Oracle Database > Autonomous JSON Database, em seguida basta clicar no botão de criação.

![Painel da Oracle Cloud exibindo uma tabela criada no Autonomous JSON Database](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ak5yb25r0vdaa2y3i7wn.png)

##Realizando a conexão via código
A conexão via código deixa a desejar, é necessário fazer instalação de libs via pip, instalação de libs no Sistema Operacional, além de algumas configurações no Banco de Dados.

###Permitindo conexões via TLS.
Primeiro é necessário permitir conexões TLS no Banco de dados:

![Overview banco da Oracle](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ohlrwp6mfjsfbhog5ke3.png)

Em seguida copie a string de conexão como TLS

![String de conexão](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9jh5hjclsu8fwjb98wn3.png)

###Instalando dependências
Instale a biblioteca Python necessária:
```
pip install oracledb
```
Instale as bibliotecas no Sistema Operacional seguindo a [documentação da Oracle](https://docs.oracle.com/en/cloud/paas/autonomous-json-database/ajdug/python-application.html#GUID-7F297F38-2C2A-47A6-9DA6-76A539C53847) (infelizmente para a maioria das distribuições em Linux a biblioteca não é disponibilizado em um gerenciador de pacotes)

###Realize a conexão via código:

```
import oracledb

from settings import app_settings


class Database:

    def __init__(self) -> None:
        self.connection = oracledb.connect(
            user=app_settings.oci_database_user,
            password=app_settings.oci_database_password,
            dsn=app_settings.oci_database_connection_string,
            encoding=app_settings.oci_encoding
        )
    
    def get(self):
        cur =  self.connection.cursor()
        cur.execute("select sysdate from dual")
        res = cur.fetchall()
        for row in res:
            print(row)
        cur.close()
```

A execução desde código deverá ter sucesso:
```
$ python3 main.py 
(datetime.datetime(2022, 10, 14, 6, 29, 36),)
```

## Referências

[python-oracledb.readthedocs.io](https://python-oracledb.readthedocs.io/en/latest/user_guide/installation.html#quickstart)

[blogs oracle](https://blogs.oracle.com/developers/post/securely-connecting-to-autonomous-db-without-a-wallet-using-tls#Can%20I%20Enable%20both%20TLS%20and%20mTLS)

[towardsdev](https://towardsdev.com/connect-to-oracle-autonomous-database-from-python-without-using-the-instance-wallet-64bd16e4f31c)