Alura > Cursos de Programação > Cursos de PHP > Conteúdos de PHP > Primeiras aulas do curso Persistência poliglota com PHP: conectando-se a diferentes tipos de bancos de dados

Persistência poliglota com PHP: conectando-se a diferentes tipos de bancos de dados

Relacionais - Apresentação

Olá, pessoal! Boas-vindas à Alura. Eu sou Vinicius Dias e vou guiar você neste curso de Persistência Poliglota com PHP.

Audiodescrição: Vinicius é um homem branco, com olhos castanhos e cabelo curto e escuro. Tem bigode e cavanhaque e usa uma camisa azul-escura com o logo do PHPRio. Ao fundo, parede lisa sem decorações.

Se você é alguém que já desenvolve em PHP e deseja aprender a se conectar a diversos tipos de bancos de dados diferentes, este curso é para você.

O que vamos aprender?

Nesse curso, vamos aprender a como se conectar a vários tipos de bancos de dados utilizando PHP, para que em uma aplicação possamos fazer uso das ferramentas necessárias e mais adequadas.

Na mesma aplicação, você vai conseguir se conectar a bancos de dados relacionais, como já aprendeu no curso de PDO (PHP Data Objects). Portanto, vamos aprofundar mais sobre PDO e Drivers, inclusive algumas especificidades e novidades que estão a caminho.

Vamos explorar como se conectar a bancos de dados de chave-valor, como o famoso Redis. Vamos abordar outro banco de dados em memória, com foco em cache. Também vamos discutir sobre bancos de dados documentais e como se conectar a um MongoDB.

Finalmente, vamos até nos conectar a um banco de dados em nuvem, o DynamoDB da AWS.

A ideia é que você adquira todo o conhecimento necessário para implementar, em sua aplicação, uma persistência poliglota. Para cada cenário onde faz mais sentido utilizar um tipo diferente de banco de dados, você terá a habilidade de fazer isso com PHP.

Na mesma aplicação, você pode ter um PostgreSQL para lidar com todos os seus dados que precisam estar em um banco relacional. Vamos aprender a usar Redis para armazenar dados que fazem mais sentido em um banco de chave-valor. Vamos aprender a se conectar ao Memcached para utilizar cache em sua aplicação e aumentar o desempenho.

Vamos aprender a se conectar ao MongoDB para armazenar documentos sem definições restritas de esquema. E, finalmente, como se conectar a um banco de dados em nuvem, como é o caso do DynamoDB.

Pré-requisitos

Para você aproveitar ao máximo este curso, é necessário que você já tenha alguns conhecimentos prévios.

O primeiro é sobre Docker. Como vamos utilizar diversos bancos de dados diferentes, vamos criar um serviço, um contêiner para cada um deles. Portanto, para não precisarmos instalar muitas coisas no nosso computador, faremos tudo via Docker, com o Docker Compose. Portanto, é preciso que você tenha um certo nível de familiaridade com Docker.

É importante que você já tenha concluído o curso de PDO, pois a persistência com bancos de dados relacionais só será revisada nesse curso.

Também é recomendável, embora não obrigatório, que você faça cursos sobre bancos de dados, mesmo que depois deste curso. Por exemplo, cursos de MySQL, PostgreSQL, SQL Server ou Oracle, mas pelo menos um dos bancos de dados relacionais.

É recomendado fazer também os cursos de Redis para conhecer melhor este banco de dados. É interessante que faça os cursos de banco de dados em nuvem, especificamente o RDS e DynamoDB na AWS.

Enfim, esses cursos de banco de dados são recomendados, e certamente vão agregar muito ao conteúdo que será tratado nesse curso.

Comunidade

Se surgir alguma dúvida ao longo do curso, não hesite em abrir um tópico no fórum. A comunidade é muito prestativa e tentará te ajudar. Se preferir, convidamos você a participar do nosso servidor do Discord da Alura, onde essa interação é um pouco mais dinâmica, e você também pode tirar dúvidas, levantar questionamentos e dar sugestões.

Esperamos você no próximo vídeo para começarmos a abordar a persistência poliglota com PHP. Mais uma vez, boas-vindas! Esperamos que você aproveite bastante e goste muito do curso.

Relacionais - Recapitulando PDO

Agora que já temos o projeto configurado, vamos relembrar alguns conceitos que já conhecemos. Em um curso de persistência poliglota, seria incoerente não falar sobre bancos relacionais.

Embora já exista mais de um curso na Alura sobre bancos de dados relacionais com PHP, utilizando PDO, Doctrine, ainda assim, queremos retomar este assunto. Em um curso de persistência poliglota, precisamos citar esse tipo de banco de dados, que é o mais comum para se trabalhar quando falamos de PHP.

Banco de dados relacionais

Antes de escrever qualquer código, queremos mostrar para você o projeto que te entregamos.

Como já mencionamos antes, estamos utilizando Docker. Temos um Dockerfile com PHP na versão 8.2, que no momento da gravação deste curso, é a versão estável mais recente. Estamos instalando e habilitando a extensão do PDO com o driver do Postgres SQL.

Dockerfile:

FROM php:8.2-cli

RUN apt-get update
RUN apt-get install -y libpq-dev && docker-php-ext-install pdo_pgsql

Com essa configuração, conseguimos nos conectar a um banco de dados Postgres. Por isso, também criamos um docker-compose, onde além de um serviço, além de um contêiner do PHP que vamos executar, temos um contêiner de um banco de dados relacional, com o nome relacional.

Estamos utilizando a imagem do Postgres na versão 15.4, que no momento da gravação é a mais recente. Recomendamos que, até o final do curso, mantenham todas as versões iguais às que estamos sugerindo.

Depois que finalizar o curso, você pode fazer como exercício a atualização de versões.

docker-compose.yml:

version: '3'
services:
  php:
    build: .
    volumes:
      - ./:/app
    working_dir: /app
  relacional:
    image: postgres:15.4
    environment:
      POSTGRES_PASSWORD: senha_postgres

A primeira etapa será no terminal, rodando um docker compose up -d. Isso subirá o nosso banco de dados e também nosso contêiner de PHP - que vai cair porque ainda não tem nada a ser executado.

docker compose up -d

Com isso, podemos fechar o terminal e criar um novo arquivo para nos conectar a esse banco. Clicando com o botão direito na raiz do projeto, vamos criar um "New > PHP File" e chamá-lo de relacional.

Nele, criaremos uma nova instância de PDO para nos conectar a esse banco de dados.

PDO (PHP Data Objects) é uma extensão do PHP que permite a conexão com diversos bancos de dados relacionais. Nesse exemplo estamos utilizando Postgres, mas em outros cursos utilizamos SQLite e MySQL.

Como é o formato dessa string de conexão, nosso primeiro parâmetro em new PDO()? É o driver que vamos utilizar. No nosso caso, pgsql, pois vamos conectar ao Postgres. Seguido de dois-pontos.

E o que precisamos passar para esse driver? No caso de bancos relacionais comuns, como Postgres, MySQL, Oracle, SQL Server, passamos o host, que é o endereço onde esse banco de dados está, como o IP ou o nome de DNS.

No nosso caso, como estamos utilizando o Docker Compose, será o nome do serviço: relacional. Poderíamos informar a porta, mas estamos utilizando a porta padrão do Postgres.

Podemos informar o nome do banco de dados (dbname), que o padrão é postgres. E podemos informar algumas outras opções, mas essas já são suficientes.

O segundo parâmetro é o usuário, que por padrão é postgres. É possível alterá-lo na configuração do Postgres, mas deixamos o padrão.

O terceiro parâmetro é a senha, que configuramos no nosso docker-compose como senha_postgres.

O quarto parâmetro é um array de opções onde podemos passar diversas informações para essa conexão. Mas é opcional, portanto podemos deixá-lo vazio.

relacional.php

declare(strict_types=1);

$pdo = new PDO(
    'pgsql:host=relacional;dbname=postgres',
    'postgres',
    'senha_postgres',
);

Com isso, temos uma conexão a um banco de dados Postgres.

Agora, imagine um cenário de e-commerce. Um banco de dados relacional poderia ser interessante para ter dados financeiros, de compras etc. Falaremos mais sobre onde utilizar esse tipo de banco.

Para verificar que a conexão foi bem-sucedida, vamos simplesmente fazer um var_dump() desse $pdo. Se a conexão não foi bem-sucedida, uma exceção será lançada. Se chegamos até o var_dump(), nossa conexão foi feita.

Não vamos executar uma query, pois aprendemos esse conteúdo nos cursos de PDO e banco de dados. O que importa agora é ter a conexão.

var_dump($pdo);

Para executar esse código no PhpStorm, clique com o botão direito e selecione "Run" (ou "Ctrl + Shift + F10"). Ele tentará se conectar e fará nosso var_dump().

object(PDO)#1 (0) { }

Caso não esteja no PhpStorm e não saiba configurar o interpretador com o Docker, pode abrir um terminal e executar docker compose run seguido do nome do seu contêiner, php, e bash:

docker-compose run php bash

Com isso será criado um novo contêiner do serviço que definimos, com a imagem do PHP, com o volume já montado e todos os arquivos lá dentro.

Desse modo, estamos dentro do contêiner e temos acesso aos arquivos. Portanto, podemos rodar php relacional.php, onde teremos o var_dump() do $pdo. Apesar de nós utilizarmos o PhpStorm durante o curso, você pode fazer acessar o contêiner e executar os comandos pela linha de comando.

Para sair do contêiner, basta utilizar o comando exit.

Com isso, criamos uma conexão com o banco de dados relacional.

PDO e Drivers

Agora, vamos recapitular alguns conceitos. Primeiro, o PDO é uma extensão que vem habilitada nas instalações padrões do PHP. Deixamos um link no exercício de "Preparação do ambiente" mostrando o que é uma extensão do PHP, além dos tipos de extensão.

Porém, o PDO trabalha com drivers. Isso quer dizer que além da extensão PDO, precisamos de alguma extensão que saiba fazer a comunicação com o banco de dados específico.

No nosso caso, como estamos utilizando Postgres, precisamos habilitar a extensão chamada pdo-pgsql, que é o nome do driver para conectar ao Postgres. Poderíamos ter o driver pdo-mysql, pdo-sqlite e assim em diante, com vários bancos de dados relacionais.

Essa extensão permite o uso da classe PDO, utilizando o driver específico de cada banco. O PDO é uma classe que permite acesso a vários bancos de dados relacionais, como já citamos: Postgres, MySQL, SQLite, SQL Server, Oracle e vários outros.

Como saber quais são os drivers disponíveis?

Na documentação do PHP sobre PDO, encontraremos uma lista de drivers disponíveis, como Cubrid, Firebird, IBM, Informix, MySQL, Oracle, ODBC, Postgres (que estamos utilizando), SQLite, entre outros. Repare que o SQL Server tem mais de um driver.

Alguns deles não são muito comuns, enquanto outros já utilizamos. Observe que cada driver fornece uma extensão diferente.

Mas quais são os parâmetros que precisamos passar para nos conectar, caso estejamos utilizando o Postgres? Para descobrir isso, basta acessar "PDO Drivers" e escolher o driver desejado - no nosso caso, o driver do PostgreSQL.

Nessa página, encontraremos todas as informações referentes à instalação, às constantes definidas e, na seção Table of Contents (Tabela de Conteúdo), há o DSN, que é essencialmente a string de conexão.

Todo driver vai informar quais são os parâmetros que você precisa passar. Além disso, um detalhe relevante é que alguns drivers específicos podem fornecer funções exclusivas daquele banco de dados.

Vamos começar pela string de conexão no DSN. O primeiro parâmetro é o prefixo - no nosso caso, pgsql:, como utilizamos em relacional.php. Quando a string de conexão começa com isso, o PDO sabe que vai usar esse driver.

Na string de conexão, podemos passar o host, a porta (que deixamos como padrão), o dbname (nome do banco). Também poderíamos passar usuário e senha diretamente pela string de conexão, ao invés de passar pelos outros parâmetros como fizemos. Além disso, temos a possibilidade de indicar se o modo SSL (sslmode) será habilitado ou não.

O PostgreSQL também pode nos fornecer outras opções, por exemplo, disable prepares. Nesse driver, é possível desabilitar os Prepared Statements.

Em relacional.php, podemos fazer um PDO::PGSQL_ATTR_DISABLE_PREPARES. Observe que temos essa opção, e podemos passar um valor para ela, como true ou false.

$pdo = new PDO(
    'pgsql:host=relacional;dbname=postgres',
    'postgres',
    'senha_postgres',
    [
        PDO::PGSQL_ATTR_DISABLE_PREPARES => false
    ]
);

Portanto, a documentação de cada driver fornecerá todas as opções disponíveis.

Conclusão

Abordamos bastante sobre como funciona o PDO, o conceito de driver e o fato de ser uma extensão.

No próximo vídeo, falaremos um pouco sobre algumas extensões menos comuns e uma novidade que está surgindo. Quando você fizer esse curso, é possível que essa novidade já esteja implementada.

Vamos explicar um pouco do que é essa novidade que está prevista para o PHP 8.3.

Relacionais - Drivers PDO

No vídeo anterior, discutimos bastante sobre como se conectar a um banco de dados relacional com o PDO. Revisamos o conceito de extensão, driver do PDO e algumas configurações.

Drivers PDO

Agora, gostaríamos de chamar atenção para alguns detalhes interessantes na documentação sobre PDO Drivers. Primeiramente, o driver para conexão ao SQL Server da Microsoft. Note que temos dois drivers: o DBLIB e o SQL Server mesmo, SQLSRV.

Ao abrir esses dois em novas guias, teremos algumas diferenças. A principal, é que um desses drivers nós vamos utilizar em ambientes Unix, e o outro driver em ambientes de Windows Server.

O PDO_SQLSRV é comumente utilizado em ambientes Windows. Isso não implica que não seja possível instalar isso em um ambiente Linux ou Unix. Por outro lado, o DBLIB é comumente utilizado em ambientes Unix, como Linux. Geralmente, essa é a escolha que você vai seguir.

Entretanto, há um detalhe: o driver DBLIB também serve para se conectar a outros bancos de dados, como o Sybase.

Uma outra observação é que, em alguns cenários, pode-se ter dificuldades em utilizar esse driver para se conectar a uma base SQL Server, por incompatibilidade de versões ou porque o seu sistema operacional é muito antigo. Nesses casos, um outro driver que pode ser utilizado é o ODBC.

O ODBC é um driver famoso para quem já trabalha com bancos de dados mais particulares, pois se conecta a diversos bancos. Como, por exemplo, o DB2, Oracle e SQL Server.

O driver ODBC é particular, pois se conecta a vários bancos diferentes, mas a primeira opção para se conectar a um SQL Server rodando no mundo Windows, é o SQLSRV. Se for possível instalar no Linux também, utilizando o PECL, tente instalá-lo.

Se não for possível, utilize o DBLIB. Ainda não funcionou por conta de alguma incompatibilidade, o ODBC pode ser uma opção.

Obviamente, nós temos os drivers menos complexos, como para MySQL ou SQLite, que são mais intuitivos. Queria chamar a atenção para esses detalhes ligados aos drivers mais específicos. Apresentamos as principais diferenças, mas ao ler a documentação você vai detectar outras diferenças também.

Novidades do PHP 8.3

Agora, vamos discutir sobre uma novidade que deve chegar no PHP 8.3. No momento da gravação essa versão está em beta, por isso, optamos por não utilizá-la para evitar possíveis problemas.

Contudo, uma possibilidade que vai existir é ter subclasses do PDO específicas para cada driver. Atualmente, a conexão ao PDO é sempre realizada utilizando a classe PDO, independentemente do banco de dados.

No futuro, você vai ter PdoDblib, PdoFirebird, PdoMySql, PdoPgsql e assim por diante. Ou seja, todas essas classes vão ser específicas.

Na documentação do PDO sobre PostgreSQL, são listadas algumas funções específicas na tabela de conteúdo. No entanto, isso pode gerar alguma confusão, porque isto é uma função da classe PDO, mas esse método só está acessível se conectarmos ao PDO utilizando o driver do PGSQL.

Dessa forma, conectado ao PDO com o PGSQL, temos acesso a essas funções. Como por exemplo, pgsqlLOBUnlink(). Podemos remover um large object, que é essencialmente um binário, utilizando o PDO.

relacional.php

$pdo->pgsqlLOBUnlink();

Mas se mudássemos esse parâmetro de conexão de pgsql para mysql, essa função deixa de existir. Porém, para a nossa IDE, esse método ainda está acessível. Isso pode gerar muitas confusões.

A novidade do PHP 8.3 vem justamente para corrigir isso, com as subclasses específicas para cada driver. A classe PdoPgsql, por exemplo, terá os métodos específicos. A classe PdoSqlite terá os métodos específicos de SQLite.

Sendo assim, a classe PDO em si só terá os métodos que são comuns a todos os bancos de dados.

Isso não significa que, a partir do PHP 8.3, não será mais possível fazer new PDO. Será possível, sim, isso continuará a existir, mas assim não teremos acesso aos métodos específicos de cada banco.

Se desejar ter acesso aos métodos específicos, você tem duas opções: fazer new PdoPgsql() para o Postgres, por exemplo. Ou utilizar PDO::connect(), que será um novo método estático para criar as conexões específicas. Supomos que essa maneira de se conectar vai se tornar a mais comum no futuro.

Entretanto, como estamos trabalhando com o presente, continuamos utilizando a classe PDO.

Conclusão

Queria apenas compartilhar essa novidade que está chegando e trazer atenção para esses drivers mais específicos.

Já nos aprofundamos bem em PDO. Na próxima aula, falaremos rapidamente em quais cenários usamos um banco de dados relacional e não algum outro tipo de banco de dados, já que temos várias opções disponíveis.

Na próxima aula, vamos ter uma conversa breve e resumida sobre quando utilizar bancos de dados relacionais.

Sobre o curso Persistência poliglota com PHP: conectando-se a diferentes tipos de bancos de dados

O curso Persistência poliglota com PHP: conectando-se a diferentes tipos de bancos de dados possui 109 minutos de vídeos, em um total de 39 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas