Correspondência entre restrições e validações do banco de dados

Depois de algum tempo desde o início do desenvolvimento do seu projeto, você pode perceber que há inconsistências entre as restrições no banco de dados e as validações no aplicativo. Neste artigo, explico como o gem database_consistency ajudará você a arrumar seu banco de dados.

Discutimos duas situações possíveis. Código de exemplo gravado para ActiveRecord .

Primeira situação


Suponha que você tenha uma tabela que é apresentada da seguinte maneira:

create_table :users do |t| t.string :name end 

e uma classe declarada como:

 class User < ApplicationRecord validates :name, presence: true end 

Nesse caso, a validação pode ser ignorada usando métodos como: save(validate: false) e, como resultado, um valor NULL será armazenado no banco de dados. Na maioria dos casos, você não gostaria que isso acontecesse (porque você instalou a validação). Portanto, seria mais correto ter uma restrição diferente de zero no banco de dados.

 create_table :users do |t| t.string :name, null: false end 

Segunda situação (reversa)


Suponha que você tenha uma tabela que é apresentada da seguinte maneira:

 create_table :users do |t| t.string :name, null: false end 

e uma classe declarada como:

 class User < ApplicationRecord validates :name end 

Nesse caso, valid? retornará true para registros que não podem ser salvos. Além disso, uma tentativa de salvar esse registro no banco de dados será executada de uma a várias consultas SQL e, finalmente, retornará um erro, ao reverter toda a transação. Todas essas manipulações são ineficientes e podem ser facilmente resolvidas adicionando presence: true validação. Na maioria dos casos, você deve adicionar essa validação.

A questão surgiu diante de mim: como encontrar todos esses casos automaticamente?
Apresento a você minha gema database_consistency . No momento, ele detecta a maioria dos casos. Como um pequeno bônus, ele também lhe dirá uma situação em que é possível salvar um registro com um valor NULL em uma coluna com uma restrição diferente de zero.

Algumas perguntas permanecem em aberto:

  • Que outras oportunidades para implementar?
  • Existe a necessidade de oferecer suporte a outros ORMs como sequela ?

Experimente você mesmo e compartilhe seus comentários. Ficaria muito grato por qualquer contribuição!

Source: https://habr.com/ru/post/pt431294/


All Articles