O que é um ORM, como ele funciona e como devo usá-lo? [fechadas]

230

Alguém sugeriu que eu usasse um ORM para um projeto que estou criando, mas estou tendo problemas para encontrar informações sobre o que é ou como funciona.

Alguém pode me dar uma breve explicação sobre o que é um ORM e como ele funciona e como devo começar a usá-lo?

Ryan
fonte
8
Encontrei essa pergunta, mas é de 2009 e não sei se você já domina o ORM, mas procura o Entity Framework no CodePlex C # ( entityframework.codeplex.com ) Aqui está o código-fonte com o qual você pode aprender. Também você pode ler isso. ( dbtechnet.org/labs/dae_lab/Orm.pdf )
Maximus Decimus,
1
Gostaria apenas de salientar que a câmera ORM também se relaciona à Modelagem de Função de Objeto en.wikipedia.org/wiki/Object-role_modeling #
9-
1
Essa é uma pergunta útil e os votos para a resposta principal parecem confirmar isso. Uma breve descrição do que é o ORM não requer opinião. Só porque o usuário pede um link para começar, a pergunta é sinalizada como fora do tópico. Sinto que essa é uma reação excessiva frequente dos moderadores.
NeilG 4/03/19
3
@ NeilG Uma pergunta fechada significa que a questão está fora de tópico. Pode haver informações úteis nas respostas, mas isso não coloca a questão no tópico. Além disso, ele não será excluído, permanecerá aqui, mas ainda precisamos manter o SO limpo e no tópico para que ele funcione da melhor maneira possível. Portanto, para responder ao seu primeiro comentário: Esta não é uma pergunta útil, há respostas úteis.
M--
1
@ NeilG A questão é que a pergunta inclui uma solicitação de recursos (tanto no título quanto na pergunta). Essas solicitações são fora de tópico, principalmente porque resulta em pessoas apenas postando um link para seu recurso favorito, como aconteceu em várias respostas aqui. Remover a solicitação de recursos da pergunta invalidaria algumas respostas existentes. Como usuários regulares, não temos permissão para editar a pergunta para invalidar respostas. Assim, deve ser fechado. Se a pergunta não tiver sido respondida, ela poderá ser editada para remover essas solicitações e deixada em aberto.
Makyen

Respostas:

483

Introdução

O Mapeamento Relacional a Objetos (ORM) é uma técnica que permite consultar e manipular dados de um banco de dados usando um paradigma orientado a objetos. Ao falar sobre ORM, a maioria das pessoas se refere a uma biblioteca que implementa a técnica de mapeamento objeto-relacional, daí a frase "um ORM".

Uma biblioteca ORM é uma biblioteca completamente comum, escrita em seu idioma preferido, que encapsula o código necessário para manipular os dados, para que você não use mais o SQL; você interage diretamente com um objeto no mesmo idioma que está usando.

Por exemplo, aqui está um caso completamente imaginário com uma pseudo-linguagem:

Você tem uma aula de livros e deseja recuperar todos os livros dos quais o autor é "Linus". Manualmente, você faria algo assim:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

Com uma biblioteca ORM, ficaria assim:

book_list = BookTable.query(author="Linus");

A parte mecânica é cuidada automaticamente através da biblioteca ORM.

Prós e contras

O uso do ORM economiza muito tempo porque:

  • SECA : Você escreve seu modelo de dados em apenas um lugar e é mais fácil atualizar, manter e reutilizar o código.
  • Muitas coisas são feitas automaticamente, desde o manuseio do banco de dados até a I18N .
  • Obriga você a escrever o código MVC , o que, no final, torna seu código um pouco mais limpo.
  • Você não precisa escrever SQL mal formado (a maioria dos programadores da Web realmente é péssima, porque o SQL é tratado como uma linguagem "sub", quando na realidade é muito poderosa e complexa).
  • Saneando; usar instruções ou transações preparadas é tão fácil quanto chamar um método.

O uso de uma biblioteca ORM é mais flexível porque:

  • Ele se encaixa no seu modo natural de codificação (é o seu idioma!).
  • Ele abstrai o sistema DB, para que você possa alterá-lo quando quiser.
  • O modelo está fracamente vinculado ao restante do aplicativo, para que você possa alterá-lo ou usá-lo em qualquer outro lugar.
  • Permite usar a bondade de OOP como herança de dados sem dor de cabeça.

Mas a ORM pode ser uma dor:

  • Você precisa aprender e as bibliotecas ORM não são ferramentas leves;
  • Você precisa configurá-lo. Mesmo problema.
  • O desempenho é bom para consultas comuns, mas um mestre em SQL sempre se sai melhor com seu próprio SQL para grandes projetos.
  • Abstrai o banco de dados. Embora esteja tudo bem se você souber o que está acontecendo nos bastidores, é uma armadilha para os novos programadores que podem escrever declarações muito gananciosas, como um golpe pesado em um forloop.

Como aprender sobre o ORM?

Bem, use um. Qualquer que seja a biblioteca ORM escolhida, todas elas usam os mesmos princípios. Existem muitas bibliotecas ORM por aqui:

Se você quiser experimentar uma biblioteca ORM em programação na Web, seria melhor usar uma pilha de estrutura inteira como:

  • Symfony (PHP, usando Propel ou Doutrina).
  • Django (Python, usando um ORM interno).

Não tente escrever seu próprio ORM, a menos que esteja tentando aprender alguma coisa. Este é um trabalho gigantesco, e os antigos levavam muito tempo e trabalho antes de se tornarem confiáveis.

e-satis
fonte
50

Alguém pode me dar uma breve explicação ...

Certo.

ORM significa "Objeto para Mapeamento Relacional", em que

  • A parte Objeto é a que você usa com sua linguagem de programação (neste caso, python)

  • A parte Relacional é um sistema gerenciador de banco de dados relacional (um banco de dados), existem outros tipos de bancos de dados, mas o mais popular é relacional (você sabe tabelas, colunas, pk fk etc., por exemplo, Oracle MySQL, MS-SQL)

  • E, finalmente, a parte Mapeamento é onde você faz uma ponte entre seus objetos e suas tabelas.

Em aplicativos em que você não usa uma estrutura ORM, faça isso manualmente. O uso de uma estrutura ORM permitiria reduzir o padrão necessário para criar a solução.

Então, digamos que você tenha esse objeto.

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

e a mesa

   create table employee(
          name varcar(10),
          -- etc  
    )

O uso de uma estrutura ORM permitiria mapear esse objeto com um registro db automaticamente e escrever algo como:

   emp = Employee("Ryan")

   orm.save( emp )

E insira o funcionário no DB.

Opa, não foi tão breve, mas espero que seja simples o suficiente para captar outros artigos que você lê.

OscarRyz
fonte
17

Um ORM (Object Relational Mapper) é uma parte / camada de software que ajuda a mapear seus objetos de código para o seu banco de dados.

Alguns lidam com mais aspectos do que outros ... mas o objetivo é tirar um pouco do peso da camada de dados dos ombros do desenvolvedor.

Aqui está um breve clipe de Martin Fowler (Data Mapper):

Padrões de mapeadores de dados da arquitetura de aplicativos corporativos

Justin Niessner
fonte
4

Como todos os acrônimos, é ambíguo, mas presumo que eles significam mapeador objeto-relacional - uma maneira de cobrir seus olhos e fazer de conta que não há SQL por baixo, mas sim todos os objetos ;-). Não é realmente verdade, é claro, e não sem problemas - o sempre colorido Jeff Atwood descreveu o ORM como o Vietnã do CS ;-). Mas, se você conhece pouco ou nenhum SQL e tem um problema bastante simples / em pequena escala, eles podem economizar seu tempo! -)

Alex Martelli
fonte
2

O Modelo de Objeto está relacionado aos três conceitos a seguir: Herança do Encapsulamento de Abstração de Dados O modelo relacional usou o conceito básico de uma relação ou tabela. Os produtos de mapeamento objeto-relacional (mapeamento OR) integram os recursos da linguagem de programação de objetos aos bancos de dados relacionais.

Hamza Riaz
fonte