¿Qué es un ORM, cómo funciona y cómo debo utilizarlo? [cerrado]
Alguien me sugirió usar un ORM para un proyecto que estoy diseñando, pero tengo problemas para encontrar información sobre qué es o cómo funciona.
¿Alguien puede darme una breve explicación de qué es un ORM, cómo funciona y cómo debo empezar a utilizar uno?
Introducción
El mapeo relacional de objetos (ORM) es una técnica que le permite consultar y manipular datos de una base de datos utilizando un paradigma orientado a objetos. Cuando se habla de ORM, la mayoría de la gente se refiere a una biblioteca que implementa la técnica de mapeo relacional de objetos, de ahí la frase "un ORM".
Una biblioteca ORM es una biblioteca completamente común escrita en el lenguaje de su elección que encapsula el código necesario para manipular los datos, por lo que ya no usa SQL; interactúas directamente con un objeto en el mismo idioma que estás usando.
Por ejemplo, he aquí un caso completamente imaginario con un pseudolenguaje:
Tienes una clase de libro, quieres recuperar todos los libros cuyo autor es "Linus". Manualmente, harías algo como esto:
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);
}
Con una biblioteca ORM, se vería así:
book_list = BookTable.query(author="Linus");
La parte mecánica se gestiona automáticamente a través de la biblioteca ORM.
Pros y contras
Usar ORM ahorra mucho tiempo porque:
- SECO : escribe su modelo de datos en un solo lugar y es más fácil actualizar, mantener y reutilizar el código.
- Muchas cosas se hacen automáticamente, desde el manejo de bases de datos hasta I18N .
- Te obliga a escribir código MVC , lo que, al final, hace que tu código sea un poco más limpio.
- No es necesario escribir SQL mal formado (la mayoría de los programadores web son realmente malos, porque SQL se trata como un lenguaje "sub", cuando en realidad es muy poderoso y complejo).
- Higienización; usar estados de cuenta o transacciones preparadas es tan fácil como llamar a un método.
Usar una biblioteca ORM es más flexible porque:
- Se adapta a tu forma natural de codificar (¡es tu idioma!).
- Abstrae el sistema de base de datos, por lo que puedes cambiarlo cuando quieras.
- El modelo está débilmente vinculado al resto de la aplicación, por lo que puedes cambiarlo o usarlo en cualquier otro lugar.
- Le permite utilizar la bondad de la programación orientada a objetos, como la herencia de datos, sin dolor de cabeza.
Pero ORM puede ser una molestia:
- Tienes que aprenderlo, y las bibliotecas ORM no son herramientas livianas;
- Tienes que configurarlo. El mismo problema.
- El rendimiento es bueno para consultas habituales, pero un maestro de SQL siempre funcionará mejor con su propio SQL para proyectos grandes.
- Abstrae la base de datos. Si bien está bien si sabes lo que sucede detrás de escena, es una trampa para los nuevos programadores que pueden escribir declaraciones muy codiciosas, como un fuerte golpe en un
for
bucle.
¿Cómo aprender sobre ORM?
Bueno, usa uno. Cualquiera que sea la biblioteca ORM que elija, todas utilizan los mismos principios. Hay muchas bibliotecas ORM por aquí:
- Java: Hibernar .
- PHP: Propel o Doctrine (prefiero el último).
- Python: Django ORM o SQLAlchemy (mi biblioteca ORM favorita).
- C#: NHibernate o Entity Framework
Si desea probar una biblioteca ORM en programación web, será mejor que utilice una pila de marco completa como:
- Symfony (PHP, usando Propel o Doctrine).
- Django (Python, usando un ORM interno).
No intentes escribir tu propio ORM, a menos que estés intentando aprender algo. Se trata de un trabajo gigantesco, y los antiguos requirieron mucho tiempo y trabajo antes de volverse fiables.
ORM significa "Objeto a mapeo relacional", donde
La parte Objeto es la que usas con tu lenguaje de programación (python en este caso)
La parte relacional es un sistema de administración de bases de datos relacionales (es decir, una base de datos). Hay otros tipos de bases de datos, pero la más popular es la relacional (ya conoce tablas, columnas, pk fk, etc., por ejemplo, Oracle MySQL, MS-SQL).
Y finalmente, la parte de Mapeo es donde haces un puente entre tus objetos y tus tablas.
En aplicaciones donde no utiliza un marco ORM, esto se hace a mano. El uso de un marco ORM le permitiría reducir el texto estándar necesario para crear la solución.
Entonces digamos que tienes este objeto.
class Employee:
def __init__( self, name ):
self.__name = name
def getName( self ):
return self.__name
#etc.
y la mesa
create table employee(
name varcar(10),
-- etc
)
El uso de un marco ORM le permitiría asignar ese objeto con un registro de base de datos automáticamente y escribir algo como:
emp = Employee("Ryan")
orm.save( emp )
Y haga que el empleado se inserte en la base de datos.
Un ORM (Object Relational Mapper) es una pieza/capa de software que ayuda a asignar sus objetos de código a su base de datos.
Algunos manejan más aspectos que otros... pero el propósito es quitar parte del peso de la capa de datos de encima de los hombros del desarrollador.
Aquí hay un breve clip de Martin Fowler (Data Mapper):
Patrones de mapeadores de datos de arquitectura de aplicaciones empresariales