Cuando desea trabajar con una base de datos relacional en Python, o en casi cualquier otro lenguaje de programación, es común escribir consultas a la base de datos «a mano», utilizando la sintaxis SQL compatible con la mayoría de las bases de datos. Sin embargo, este enfoque tiene sus desventajas. Las consultas SQL escritas manualmente pueden resultar complicadas de utilizar, ya que las bases de datos y las aplicaciones de software tienden a vivir en mundos conceptuales separados. Es difícil modelar cómo funcionan juntos su aplicación y sus datos. Otro enfoque es utilizar una biblioteca llamada ORM o herramienta de mapeo relacional de objetos. Los ORM le permiten describir cómo funciona su base de datos a través del código de su aplicación: cómo se ven las tablas, cómo funcionan las consultas y cómo mantener la base de datos durante su vida útil. El ORM maneja todo el trabajo pesado de su base de datos y usted puede concentrarse en cómo su aplicación usa los datos. Este artículo presenta seis ORM para el ecosistema Python. Todos proporcionan formas programáticas de crear, acceder y administrar bases de datos en sus aplicaciones, y cada una incorpora una filosofía ligeramente diferente de cómo debería funcionar un ORM. Además, todos los ORM descritos aquí le permitirán emitir instrucciones SQL manualmente si así lo desea, para aquellos momentos en los que necesite realizar una consulta sin la ayuda del ORM.6 de los mejores ORM para Python Django ORM Peewee PonyORM SQLAlchemy SQLObject Tortoise ORM Django El marco web Django viene con casi todo lo que necesita para crear sitios web de nivel profesional, incluido su propio ORM y herramientas de administración de bases de datos. La mayoría de la gente sólo utilizará el ORM de Django con Django, pero es posible utilizar el ORM por sí solo. Además, el ORM de Django ha influido enormemente en el diseño de otros ORM de Python, por lo que es un buen punto de partida para comprender los ORM de Python en general. Los modelos para una base de datos administrada por Django siguen un patrón similar a otros ORM en Python. Las tablas se describen con clases de Python y los tipos personalizados de Django se utilizan para describir los campos y sus comportamientos. Esto incluye cosas como referencias de uno a muchos o de muchos a muchos con otras tablas, pero también tipos que se encuentran comúnmente en aplicaciones web como archivos cargados. También es posible crear tipos de campos personalizados subclasificando los existentes y utilizando la biblioteca de métodos de clases de campos genéricos de Django para alterar sus comportamientos. Las herramientas de administración de línea de comandos de Django para trabajar con sitios incluyen herramientas poderosas para administrar la capa de datos de un proyecto. Los más útiles crean automáticamente scripts de migración para sus datos, cuando desea modificar sus modelos y migrar los datos subyacentes para usar los nuevos modelos. Cada conjunto de cambios se guarda como su propio script de migración, por lo que todas las migraciones de una base de datos se conservan durante toda la vida útil de su aplicación. Esto hace que sea más fácil mantener aplicaciones respaldadas por datos donde el esquema puede cambiar con el tiempo. PeeweePeewee tiene dos grandes reclamos de fama. Primero, es una biblioteca pequeña pero poderosa, alrededor de 6600 líneas de código en un solo módulo. Dos, es expresivo sin ser prolijo. Si bien Peewee maneja de forma nativa sólo unas pocas bases de datos, se encuentran entre las más comunes: SQLite, PostgreSQL, MySQL/MariaDB y CockroachDB. Definir modelos y relaciones en Peewee es mucho más sencillo que en otros ORM. Se utilizan clases de Python para crear tablas y sus campos, pero Peewee requiere un texto mínimo para hacer esto, y los resultados son muy legibles y fáciles de mantener. Peewee también tiene formas elegantes de manejar situaciones como referencias de claves externas a tablas que se definen más adelante en el código o claves externas autorreferenciales. Las consultas en Peewee utilizan una sintaxis que se remonta al propio SQL; por ejemplo, Persona.select(Persona.nombre, Persona.id).dónde(Persona.edad>20). Peewee también le permite devolver los resultados como objetos Python enriquecidos, como tuplas o diccionarios con nombre, o como una tupla simple para obtener el máximo rendimiento. Los resultados también se pueden devolver como un generador, para una iteración eficiente en un conjunto de filas grande. Las funciones de ventana y CTE (Expresiones de tabla comunes) también tienen soporte de primera clase. Peewee usa muchas metáforas comunes de Python más allá de las clases. Por ejemplo, las transacciones se pueden expresar mediante un administrador de contexto, como en db.atomic():. No puede usar palabras clave como y o no con consultas, pero Peewee le permite usar operadores como & y ~ en su lugar. Los comportamientos sofisticados como el bloqueo optimista y los n objetos principales por grupo no son compatibles de forma nativa, pero la documentación de Peewee tiene una colección útil de trucos para implementar tales cosas. La migración de esquemas no es compatible de forma nativa, pero Peewee incluye una API SchemaManager para crear migraciones junto con otras operaciones de administración de esquemas. La característica destacada de PonyORMPonyORM es la forma en que utiliza la sintaxis nativa y las características del lenguaje de Python para redactar consultas. Por ejemplo, PonyORM le permite expresar una consulta SELECT como una expresión generadora: consulta = seleccionar (u para u en Usuario si u.name == «Davis»).order_by(User.name). También puede utilizar lambdas como parte de consultas para filtrado, como en query.filter (usuario lambda: user.is_approved es True). El SQL generado también es siempre accesible. Cuando crea tablas de bases de datos con objetos Python, usa una clase para declarar primero el comportamiento de cada campo y luego su tipo. Por ejemplo, un campo de nombre distinto y obligatorio sería nombre = Requerido(cadena, único=Verdadero). Los tipos de campos más comunes se asignan directamente a los tipos de Python existentes, como int/float/Decimal, datetime, bytes (para datos BLOB), etc. Un posible punto de confusión es que los campos de texto grandes utilizan el tipo LongStr de PonyORM; el tipo str de Python es básicamente el CHAR de la base de datos subyacente. PonyORM admite automáticamente los tipos de datos Array de estilo JSON y PostgreSQL, ya que ahora más bases de datos admiten ambos tipos de forma nativa. Cuando no hay soporte nativo, PonyORM a menudo puede mejorar las cosas; por ejemplo, las versiones de SQLite anteriores a la 3.9 pueden usar TEXT para almacenar JSON, pero las versiones más recientes pueden funcionar de forma nativa a través de un módulo de extensión. Algunas partes de PonyORM se ajustan menos a Objetos y sintaxis de Python. Para describir relaciones de uno a muchos y de muchos a muchos en PonyORM, se utiliza Set(), un objeto PonyORM personalizado. Para relaciones uno a uno, existen objetos Opcionales() y Requeridos(). PonyORM tiene algunos comportamientos obstinados que vale la pena conocer antes de construir con él. Las consultas generadas generalmente tienen la palabra clave DISTINCT agregada automáticamente, bajo el argumento de que la mayoría de las consultas no deberían devolver duplicados de todos modos. Puedes anular este comportamiento con el método . without_distinct() en una consulta. Una omisión importante del núcleo de PonyORM es que todavía no hay herramientas para las migraciones de esquemas, aunque está planificada para una versión futura. Por otro lado, los creadores de PonyORM ofrecen un conveniente editor de esquemas de bases de datos en línea como servicio, con acceso básico gratuito y conjuntos de funciones más avanzadas por $9 al mes. SQLAlchemySQLAlchemy es uno de los ORM más conocidos y utilizados. Proporciona un control potente y explícito sobre casi todas las facetas de los modelos y el comportamiento de la base de datos. SQLAlchemy 2.0, lanzado a principios de 2023, introdujo una nueva API y un sistema de modelado de datos que funciona bien con los sistemas de clases de datos y linting de tipos de Python. SQLAlchemy utiliza una arquitectura interna de dos niveles que consta de Core y ORM. Core es para la interacción con las API de bases de datos y la representación de declaraciones SQL. ORM es la capa de abstracción y proporciona el modelo de objetos para sus bases de datos. Esta arquitectura desacoplada significa que SQLAlchemy puede, en teoría, usar cualquier número o variedad de capas de abstracción, aunque existe una ligera penalización en el rendimiento. Para contrarrestar esto, algunos de los componentes de SQLAlchemy están escritos en C (ahora Cython) para mayor velocidad. SQLAlchemy le permite describir esquemas de bases de datos de dos maneras, para que pueda elegir cuál es el más apropiado para su aplicación. Puede utilizar un sistema declarativo, donde crea objetos Table() y proporciona nombres y tipos de campos como argumentos. O puede declarar clases utilizando un sistema que recuerde la forma en que funcionan las clases de datos. El primero es más fácil, pero puede que no funcione tan bien con las herramientas quitapelusas. Este último es más explícito y correcto, pero requiere más ceremonia y repetición. SQLAlchemy valora la corrección por encima de la conveniencia. Por ejemplo, cuando se insertan valores de forma masiva desde un archivo, los valores de fecha deben representarse como objetos de fecha de Python para que se manejen de la forma más inequívoca posible. Las consultas con SQLAlchemy utilizan una sintaxis que recuerda a las consultas SQL reales, por ejemplo, seleccione(Usuario). donde (nombre de usuario == «Davis»). Las consultas de SQLachemy también se pueden representar como SQL sin formato para su inspección, junto con cualquier cambio necesario para un dialecto específico de SQL compatible con SQLAlchemy (por ejemplo, PostgreSQL versus MySQL). Las herramientas de construcción de expresiones también se pueden usar por sí solas para representar sentencias SQL para usarlas en otros lugares, no solo como parte del ORM. Para consultas de depuración, una práctica opción echo=True` le permite ver las declaraciones SQL en la consola a medida que se ejecutan. Varias extensiones de SQLAlchemy agregan funciones potentes que no se encuentran en el núcleo ni en el ORM. Por ejemplo, el complemento «fragmentación horizontal» distribuye de forma transparente las consultas entre varias instancias de una base de datos. Para las migraciones, el proyecto Alembic le permite generar scripts de cambios con mucha flexibilidad y configuración.

Source link