O que é um ORM e onde posso aprender mais sobre isso?

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 ou um link sobre onde eu posso aprender mais sobre isso?

Introdução

Mapeamento Objeto-Relacional (ORM) é uma técnica que permite consultar e manipular dados de um database usando um paradigma orientado a object. Ao falar sobre o ORM, a maioria das pessoas está se referindo a uma biblioteca que implementa a técnica Mapeamento Objeto-Relacional, daí a frase “um ORM”.

Uma biblioteca ORM é uma biblioteca completamente ordinária escrita na sua linguagem de escolha 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 object na mesma linguagem que está usando.

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

Você tem uma aula de livros, você quer 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:

  • DRY : Você escreve seu modelo de dados em apenas um lugar e é mais fácil atualizar, manter e reutilizar o código.
  • Um monte de coisas é feito automaticamente, desde o manuseio de database até o I18N .
  • Ele força você a escrever código MVC , o que, no final, torna seu código um pouco mais limpo.
  • Você não tem que escrever SQL mal-formado (a maioria dos programadores da Web realmente não presta, porque o SQL é tratado como uma linguagem “sub”, quando na realidade é muito poderosa e complexa).
  • Saneantes; usar instruções preparadas ou transactions é tão fácil quanto chamar um método.

Usar uma biblioteca ORM é mais flexível porque:

  • Ele se encheckbox em seu modo natural de codificação (é a sua língua!).
  • Ele abstrai o sistema de database, para que você possa alterá-lo sempre que quiser.
  • O modelo é fracamente ligado ao resto do aplicativo, então você pode alterá-lo ou usá-lo em qualquer outro lugar.
  • Ele permite que você use a qualidade OOP como inheritance de dados sem dor de cabeça.

Mas ORM pode ser uma dor:

  • Você precisa aprender e as bibliotecas ORM não são ferramentas leves;
  • Você tem que configurá-lo. Mesmo problema.
  • O desempenho está correto para consultas usuais, mas um mestre SQL sempre fará melhor com seu próprio SQL para grandes projetos.
  • Ele abstrai o DB. Embora esteja tudo bem se você sabe o que está acontecendo nos bastidores, é uma armadilha para novos programadores que podem escrever declarações muito gananciosas, como um grande sucesso em um loop for .

Como aprender sobre o ORM?

Bem, use um. Qualquer que seja a biblioteca ORM que você escolher, todas usam os mesmos princípios. Há muitas bibliotecas ORM por aqui:

  • Java: Hibernate .
  • PHP: Propel ou Doutrina (eu prefiro o último).
  • Python: o Django ORM ou SQLAlchemy (Minha biblioteca ORM favorita).
  • C #: NHibernate ou Entity Framework

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

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

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

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

Certo.

ORM significa “Object to Relational Mapping” onde

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

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

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

Em aplicações onde você não usa um framework ORM, você faz isso manualmente. Usar uma estrutura ORM permitiria reduzir o padrão necessário para criar a solução.

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

  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 ) 

Usar um framework ORM permitiria mapear esse object com um registro db automagicamente e escrever algo como:

  emp = Employee("Ryan") orm.save( emp ) 

E ter o funcionário inserido no database.

Oops não foi tão breve, mas espero que seja simples o suficiente para pegar outros artigos que você leu.

Um ORM (Object Relational Mapper) é uma peça / camada de software que ajuda a mapear seus objects de código para o seu database.

Alguns lidam com mais aspectos do que outros … mas o objective é 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

O primeiro capítulo do livro Hibernate Java Persistence com Hibernate (3ª ed.) Tem uma excelente visão geral dos conceitos gerais de ORM e discute a motivação e o design dos ORMs. Altamente recomendado, mesmo que você não trabalhe com Java.

Storm é uma ótima opção para quem usa python.

Este é um tópico enorme. Pegue um bom livro de hibernação e ele deve explicar o ORM em detalhes antes de chegar ao material de hibernação.

https://www.hibernate.org/

Como todas as siglas, é ambíguo, mas suponho que elas signifiquem um mapeador relacional de objects – uma maneira de cobrir seus olhos e fazer crer que não há SQL por baixo, mas sim todos os objects ;-). Não é verdade, claro, e não sem problemas – o sempre colorido Jeff Atwood descreveu o ORM como o Vietnã do CS ;-). Mas, se você sabe pouco ou nenhum SQL, e tem um problema bem simples / de pequena escala, eles podem economizar seu tempo!

Modelo de object está preocupado com os três conceitos a seguir Herança de encapsulamento de abstração de dados O modelo relacional usou o conceito básico de uma relação ou tabela. Os produtos de mapeamento de object-relacional (mapeamento OR) integram resources de linguagem de programação de object a bancos de dados relacionais.

O DALMP http://code.google.com/p/dalmp/ pode ser bom para o php / mysql atualmente suportando muitos backends de caches como redis / memcache / apc