Logotipo de Zephyrnet

¿Qué son el objeto de acceso a datos y el objeto de transferencia de datos en Python?

Fecha:

Introducción

Un patrón de diseño es simplemente una solución repetible para problemas que siguen reapareciendo. El patrón no es un código real sino una plantilla que se puede usar para resolver problemas en diferentes situaciones. Especialmente cuando se trabaja con bases de datos, a menudo se considera una buena práctica seguir un patrón de diseño. Esto asegura un fácil cambio entre las bases de datos en nuestras aplicaciones. Hay tres tipos de patrones de diseño de base de datos, son:

  1. Mapeo relacional de objetos (ORM)
  2. Patrón entidad-atributo-valor (EAV)
  3. Patrón Modelo-Vista-Controlador (MVC).

La función de ORM es mapear los datos representados en forma orientada a objetos a la base de datos. Los patrones DAO (objeto de acceso a datos) y DTO (objeto de transferencia de datos) se utilizan en el mapeo relacional de objetos. DAO actúa como un puente entre la base de datos y la aplicación. DTO actúa como un almacén de datos desde donde se reciben y transfieren los datos a diferentes capas, es decir, a la aplicación DAO.

En este artículo, veremos DAO (objeto de acceso a datos) y DTO (objeto de transferencia de datos), especialmente en Python. Seguiremos un enfoque práctico para comprender mejor estos conceptos.

OBJETIVOS DE APRENDIZAJE

  1. Entender el concepto de DAO
  2. Para entender cómo funciona DTO
  3. Para poder combinar DAO y DTO en su aplicación
  4. Para comprender cómo aislar DAO de la aplicación facilita el cambio de bases de datos

Este artículo fue publicado como parte del Blogatón de ciencia de datos.

Índice del contenido

  1. Configuración del espacio de trabajo
  2. ¿Qué son los objetos de acceso a datos?
  3. ¿Qué son los objetos de transferencia de datos?
  4. Implementación de DAO y DTO
  5. Conclusión

Configuración del espacio de trabajo

En esta sección, configuraremos el espacio de trabajo de codificación, para que le resulte más fácil seguirme. Puede usar cualquier editor de código de su elección y cualquier base de datos de su elección. Voy a usar Visual Studio Code como editor y Redis como base de datos.

Estaremos trabajando con tres archivos python. Un archivo para DTO, otro para DAO y el código principal, es decir, el código de la aplicación. Cree una nueva carpeta y dentro de la nueva carpeta, cree tres nuevos archivos .py de la siguiente manera.

Directorio de archivos

¿Qué son los objetos de acceso a datos?

En esta sección, aprenderemos qué son los objetos de acceso a datos (DAO) y también intentaremos implementar DAO en Python, utilizando Redis como base de datos. Puede probarlo usando cualquier base de datos, ya sea relacional o NoSQL.

DAO (objeto de acceso a datos) es un patrón que actúa como una abstracción entre la base de datos y la aplicación principal. Se encarga de agregar, modificar, recuperar y borrar los datos y no necesitas saber cómo lo hace, eso es una abstracción. DAO se implementa en un archivo separado. Luego, estos métodos se llaman en la aplicación principal. Asi es como funciona.

Escribamos un simple EstudianteDAO clase, que toma datos y los agrega a la base de datos. Además, recupera datos de la base de datos.

import redis class StudentDAO: def __init__(self): self.client = redis.Redis(host='localhost', port=6379, decode_responses=True) def add_student(self, school,student_name): self.client.sadd(school ,student_name) def get_all_student(self, school): data = self.client.smembers(school) print(data)

El primer paso para escribir la clase DAO es definir el método init, donde especificamos la conexión a la base de datos que queremos usar. Como estoy usando Redis, creo un Redis cliente en el método init. Si está usando MySQL, entonces estaría usando algo como MySQL.connector.connect (usuario = 'usuario', contraseña = 'contraseña', host = 'host', base de datos = 'base de datos')

Entonces, hemos definido dos métodos. uno es el agregar_estudiante() método, que toma la colegio y nombre del estudiante como parámetros. Luego creamos un set con el nombre de la escuela y agregue el nombre del estudiante al set. Esto se guarda en el servidor Redis.

El proyecto get_all_student() método, toma el colegio como parámetro y recupera todos los nombres de los estudiantes de esa escuela en particular set. Entonces, esta clase DAO que definimos se puede usar para agregar un nombre de estudiante a un configurado con el nombre clave de la escuela en Redis Server y recuperar todos los nombres de los estudiantes de una escuela en particular.

Ahora, probemos nuestro EstudianteDAO clase. Como sabemos que todo el código de la aplicación va en main.py; ahora escribamos algo de código en main.py para acceder a esto EstudianteDAO y añadir datos a nuestra base de datos. Esto puede hacerse de la siguiente manera:

from dao import StudentDAO estudiante_dao = StudentDAO() estudiante_nombre = "Lary" estudiante_dao.add_student("Escuela:Hindenburg",nombre_estudiante) estudiante_dao.get_all_student("Escuela:Hindenburg")

Entonces, importamos nuestro EstudianteDAO en main.py, cree una instancia y asígnela al estudiante_dao variable. Intentemos agregar un estudiante llamado Lary de la Escuela Hindenburg a nuestra base de datos. Para esto, almacenamos el nombre en una variable nombre del estudiante. Entonces llamamos a la agregar_estudiante() método pasando el colegio y del nombre del estudiante como parámetro.

Si todo sale bien, el agregar_estudiante() El método debería haber agregado a Lary al set teniendo el nombre clave Escuela: Hindenburg al servidor Redis. Ahora intentemos recuperarlo. Para esto, ya definimos una función llamada get_all_student(). ahora voy a llamar al get_all_student() comando pasando el nombre de la escuela como parámetro.

El siguiente es el resultado después de ejecutar main.py

{'Lary'}

So EstudianteDAO ha logrado agregar datos a nuestra base de datos con éxito y también recuperarlos. Actúa como una capa de abstracción entre Redis Server y main.py.

Objeto de acceso a datos

Objeto de acceso a datos en acción

Ahora, ¿qué sucede si desea cambiar la base de datos debido a circunstancias imprevistas? Todo lo que haces es crear una nueva clase DAO. El main.py sigue siendo el mismo ya que no tiene nada que ver con la base de datos, ya que la clase DAO hace todo. Tendrás que cambiar el agregar_estudiante() y del get_all_student() métodos en el dao.py sin perturbar el main.py Esto nos ahorra mucho tiempo. Si tuviéramos que escribir todo el código en un solo archivo sin usar la clase dao y agregar directamente los datos a la base de datos, sería un desastre cuando quisiéramos cambiarlo a otra base de datos. Tendríamos que cambiar todo el archivo, lo cual es tedioso.

¿Qué son los objetos de transferencia de datos?

El objeto de transferencia de datos (DTO) se puede asumir como un almacén de datos. Se utiliza para transferir datos entre diferentes capas. El único trabajo de un objeto de transferencia de datos es obtener los datos y transferirlos. Por lo tanto, consiste en el método de getters y setters.

La sección anterior muestra cómo almacenar datos en el Servidor Redis utilizando el objeto de acceso a datos. Ahora, ¿dónde encaja aquí el DTO? En lo anterior, enviamos datos desde main.py a la clase StudentDAO. Aquí, en lugar de enviar datos desde el código de la aplicación a dao.py, podemos enviar los datos desde el código de la aplicación, es decir, desde main.py a una clase DTO, y los datos de DTO irán a la clase DAO, que luego los cargará. a la base de datos.

Quizás se pregunte por qué enviamos los datos de nuestro archivo principal a DTO y de DTO a DAO en lugar de enviarlos directamente a DAO. En algunas situaciones, los datos deben serializarse o deserializarse antes de enviarlos a la base de datos o en el momento de recuperarlos de la base de datos. Esta serialización y deserialización pueden diferir de una base de datos a otra. Entonces, cuando cambiamos la base de datos, necesitamos cambiar el DAO y el main.py.

Entonces, en su lugar, podemos crear una clase DTO separada que maneje todo esto por nosotros. Entonces, los datos de main.py se envían a un objeto DTO, luego el objeto DTO serializa los datos, y este objeto DTO se proporciona como entrada al DAO, que toma estos datos y los guarda en el servidor. Lo contrario sucede cuando queremos recuperar los datos. Probemos

dto.py

class StudentDTO: def __init__(self,school,student_name): self.school = school self.student_name = student_name def getall(self): school = self.school Students = list(self.student_name) return {"School": school, "Estudiantes":estudiantes}

Hemos creado un EstudianteDTO que almacena el colegio y nombre del estudiante información en el momento de la instanciación. Además, tiene un obtener toda() método, que obtiene todos los estudiantes de una escuela determinada y los devuelve como un diccionario. La salida que obtenemos de Redis tiene la forma de un set. Pero aquí estamos convirtiendo el conjunto de nombres de estudiantes en una lista y pasando esta lista como un valor en el diccionario. Entonces estamos modificando los datos antes de enviarlos al archivo principal.

Implementación de DAO y DTO

En esta sección, cambiaremos dao.py y main.py para que el objeto DAO pueda llamar al objeto DTO para transferir los datos del archivo principal al base de datos.

Se realizan los siguientes cambios en el dao.py:

import redis from dto import StudentDTO class StudentDAO: def __init__(self): self.client = redis.Redis(host='localhost', port=6379, decode_responses=True) def add_student(self, student_dto): self.client.sadd (student_dto.school,student_dto.student_name) def get_all_student(self, school): data = self.client.smembers(school) return StudentDTO(school,data).getall()

Inicialmente, cuando escribimos dao.py por primera vez, pasamos colegio y nombre del estudiante parámetros directamente al agregar_estudiante() función. Ahora, en lugar de hacer eso, estamos pasando el EstudianteDTO objeto es decir estudiante_dto, al agregar_estudiante() función, que contiene el nombre de la escuela y del estudiante.

También en el get_all_student() método, recuperamos todos los nombres de los estudiantes y se los damos al EstudianteDTO objeto, y llame al obtener toda() método, que devuelve un diccionario que contiene el nombre de la escuela y la lista de estudiantes. Ahora, para que todo esto suceda, también debemos realizar los cambios apropiados en el archivo principal.

from dao import StudentDAO from dto import StudentDTO estudiante_dao = StudentDAO() estudiante1= "Lary" estudiante2 = "Mike" escuela = "Escuela:Hindenburg" stud1 = StudentDTO(escuela,estudiante1) stud2 = StudentDTO(escuela,estudiante2) estudiante_dao.add_student( stud1) estudiante_dao.add_student(stud2) nombre_estudiantes = estudiante_dao.get_all_student("Escuela:Hindenburg") print(nombres_estudiantes)

Ahora veamos el código para ver cómo funciona. Primero, instanciamos un EstudianteDAO() objeto. También creamos dos variables para almacenar dos nombres de estudiantes y una sola variable para almacenar el nombre de la escuela.

Ahora, los datos de main.py deben fluir a dao.py a través de dto.py, ya que DTO es responsable de transferir datos de una parte a otra. Entonces creamos dos EstudianteDTO objetos, uno para cada nombre. Ahora los datos se han movido del archivo de la aplicación al archivo DTO. Ahora llamaremos a la agregar_estudiante() método pasando el EstudianteDTO se opone a ello. El DAO luego recupera los datos almacenados en DTO en el agregar_estudiante() método. Al mismo tiempo, agrega estos datos al Servidor Redis.

Finalmente, recuperemos los datos del servidor. Para esto, llamamos a la obtener_todos_los_objetos() método de la estudiante_dao objeto pasando el nombre de la escuela. Esto obtiene a todos los estudiantes como un conjunto y los almacena en variables datos. Esta variable se pasa al EstudianteDTO objeto. Entonces, los datos que DAO obtuvo del servidor Redis se mueven de DAO a DTO. El obtener toda() función de la EstudianteDTO se llama objeto. Esta función obtiene los nombres de los estudiantes, los convierte en una lista y los devuelve como un diccionario.

Este diccionario ahora está finalmente almacenado en el estudiantes_nombres variable en main.py. Entonces, los datos que se pasan de DAO a DTO han sufrido algunos cambios (se convirtieron en un diccionario) y, finalmente, de DTO, los datos se movieron a main.py

El contenido de esta variable finalmente se imprime. La salida generada es la siguiente

{'Escuela': 'Escuela:Hindenburg', 'Estudiantes': ['Lary', 'Mike']}

Objeto de acceso a datos

DAO y DTO en acción

Esto es solo un vistazo de cómo se puede usar el DTO para transferir datos entre diferentes capas como aquí, entre el DAO y la aplicación que es el archivo principal. En nuestro caso, la aplicación almacena los datos en DTO. Luego, el DAO accede a estos datos en DTO y luego los guarda en la base de datos. Luego, al recuperar los datos, el DAO envía los datos al DTO. Luego, finalmente, la aplicación obtiene los datos del DTO. Como mencioné antes, la serialización de datos se puede usar en DTO antes de enviarlos a las otras capas.

Conclusión

En conclusión, el patrón DAO (Objeto de acceso a datos) actúa como una abstracción entre la base de datos y el archivo principal, mientras que el DTO (Objeto de transferencia de datos) se utiliza para transferir los datos entre estas capas. DTO es útil cuando desea realizar cambios en el formato de los datos antes de que se guarden en la base de datos o en el momento de la recuperación. Y la combinación de ellos se emplea en una aplicación para mejores prácticas y fácil cambio de base de datos.

Los siguientes son los puntos clave de este artículo:

  • El DAO proporciona la encapsulación del código específico de la base de datos, es decir, está aislado del programa principal.
  • El DTO actúa como un almacén de datos que mueve los datos de una capa a otra.
  • Tanto DAO como DTO se pueden combinar para crear un código más fácil de mantener.
  • El uso de DAO y DTO facilita la fase de prueba, ya que están separados del código principal.

Enlace de Github para el código:

https://github.com/LuciAkirami/design_pattern

Los medios que se muestran en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.

punto_img

Información más reciente

punto_img