O suporte a múltiplos esquemas de banco de dados está atualmente disponível com os conectores PostgreSQL, CockroachDB e SQL Server.
Muitos provedores de banco de dados permitem que você organize tabelas de banco de dados em grupos nomeados. Isso pode ser usado para tornar a estrutura lógica do modelo de dados mais compreensível ou evitar conflitos de nomes entre tabelas.
O suporte a múltiplos esquemas está atualmente em prévia. Para ativá-lo, adicione a flag multiSchema
ao campo previewFeatures
do bloco generator
em seu arquivo de esquema do Prisma
generator client { provider = "prisma-client-js" previewFeatures = ["multiSchema"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") }
Para usar múltiplos esquemas de banco de dados em seu arquivo de esquema do Prisma, adicione os nomes dos seus esquemas de banco de dados a um array no campo schemas
, no bloco datasource
. O exemplo a seguir adiciona um esquema "base" e um esquema "transactional":
generator client { provider = "prisma-client-js" previewFeatures = ["multiSchema"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") schemas = ["base", "transactional"] }
Não é necessário alterar a string de conexão. O valor do esquema em sua string de conexão é o esquema padrão ao qual o Prisma Client se conecta e usa para consultas diretas. Todas as outras consultas do Prisma Client usam o esquema do modelo ou enum que você está consultando.
Para indicar que um modelo ou enum pertence a um esquema de banco de dados específico, adicione o atributo @@schema
com o nome do esquema de banco de dados como parâmetro. No exemplo a seguir, o modelo User faz parte do esquema "base", e o modelo Order e o enum Size fazem parte do esquema "transactional":
model User { id Int @id orders Order[] @@schema("base") } model Order { id Int @id user User @relation(fields: [id], references: [id]) user_id Int @@schema("transactional") } enum Size { Small Medium Large @@schema("transactional") }
Se você tiver tabelas com o mesmo nome em diferentes esquemas de banco de dados, precisará mapear os nomes das tabelas para nomes de modelos exclusivos em seu esquema do Prisma. Isso evita conflitos de nomes ao consultar modelos no Prisma Client.
Por exemplo, considere uma situação em que a tabela "config" no esquema de banco de dados "base" tem o mesmo nome da tabela "config" no esquema de banco de dados "users". Para evitar conflitos de nomes, dê nomes exclusivos aos modelos em seu esquema do Prisma (BaseConfig e UserConfig) e use o atributo @@map
para mapear cada modelo para o nome da tabela correspondente:
model BaseConfig { id Int @id @@map("config") @@schema("base") } model UserConfig { id Int @id @@map("config") @@schema("users") }
A estrutura de diretórios que utilizamos é a seguinte:
prisma |_ schemas | |_ client.prisma | |_ db.prisma | |_ model1.prisma | |_ model2.prisma | |_ model3.prisma |_ schema.prisma
Nesta estrutura, todos os modelos de banco de dados individuais estão contidos em arquivos .prisma
separados dentro da pasta schemas
, e o arquivo schema.prisma
na raiz do diretório é o arquivo que importa todos esses modelos. A ideia é manter cada modelo de banco de dados em seu próprio arquivo .prisma
para facilitar a manutenção e organização.
Os scripts definidos no arquivo package.json
permitem a geração automática do arquivo schema.prisma
que importa todos os modelos individualmente. Vamos entender como esses scripts funcionam, começando com o script para sistemas Linux:
{ "gen:schema:linux": "awk 1 ./prisma/schemas/*.prisma > ./prisma/schema.prisma && npx prisma format" }
Este script executa duas operações principais: a primeira parte do comando awk
e a segunda parte do comando npx prisma format
.
awk 1 ./prisma/schemas/*.prisma > ./prisma/schema.prisma
:
awk
é uma poderosa ferramenta de processamento de texto em sistemas Unix e Unix-like. Neste contexto, o comando awk 1
é usado para simplesmente copiar todo o conteúdo dos arquivos .prisma
na pasta ./prisma/schemas
e redirecioná-lo para o arquivo ./prisma/schema.prisma
.schema.prisma
.npx prisma format
:
npx prisma format
é usado para formatar o arquivo resultante. Ele garante que o arquivo schema.prisma
esteja formatado de acordo com as convenções do Prisma.{ "gen:schema:windows": "powershell -Command \"Get-Content .\\prisma\\schemas\\*.prisma | Set-Content .\\prisma\\schema.prisma; npx prisma format\"" }
Este script é semelhante ao script para Linux, mas é destinado a sistemas Windows e utiliza o PowerShell.
"Get-Content .\\prisma\\schemas\\*.prisma | Set-Content .\\prisma\\schema.prisma"
:
Get-Content .\\prisma\\schemas\\*.prisma
lê o conteúdo de todos os arquivos .prisma
na pasta ./prisma/schemas
.|
redireciona esse conteúdo para o comando Set-Content .\\prisma\\schema.prisma
, que cria o arquivo schema.prisma
e escreve o conteúdo combinado nele.npx prisma format
:
npx prisma format
para formatar o arquivo schema.prisma
.A separação de arquivos .prisma
em modelos individuais oferece diversas vantagens:
schema.prisma
..prisma
, mantendo o código mais limpo e evitando alterações em outros modelos.schema.prisma
permanece enxuto, facilitando a leitura e compreensão.Em resumo, a organização e a manutenção de modelos de banco de dados em arquivos .prisma
separados são práticas recomendadas para projetos Prisma em crescimento. Os scripts fornecidos ajudam a criar o arquivo schema.prisma
combinado automaticamente, independentemente do sistema operacional utilizado pela equipe de desenvolvimento. Isso resulta em uma modelagem de banco de dados mais limpa e eficaz, tornando o desenvolvimento mais eficiente e colaborativo.
Fontes:
https://www.prisma.io/docs/guides/other/multi-schema
https://github.com/prisma/prisma/issues/92