IIC2413 / Syllabus-2021-2

Contenido del curso Bases de datos del DCC PUC versión 2021-2
62 stars 44 forks source link

Consulta 2: dos dudas sobre el control #263

Open Icarus328 opened 3 years ago

Icarus328 commented 3 years ago

Hola, tengo dos dudas sobre la parte 2 del control.

La primera es que si debería estar haciendo una conexión a la database por instancia, es decir, si debería incluir una conexión a la db ya en la clase Model. Hasta ahora, he estado haciendo las funciones de la clase model de tal manera que, en el archivo db_init.py, si uno quiere ejecutar una función de la clase model (Por ejemplo, create) uno tenía que hacer cursor.execute(instancia_subclase.create(**kwargs)). Pero si no me conecto directamente a la base de datos con cada instancia, no veo formas de implementar funciones como .all() o .first() en una sola función, ya que ellas requieren de datos que se encuentran en la database, pero al mismo tiempo crear una conexión por cada instancia se me hace muy ineficiente. Está bien si lo hago de todas maneras?

La segunda duda es que no sé si es necesario sanitizar los inputs, no está puesto en el enunciado pero tengo la duda de todas maneras.

Icarus328 commented 3 years ago

En el caso en el que decida incluir conexiones individuales en las instancias, podría incluir hacer que los atributos necesarios para crear una instancia de Models o de Subclase sea Subclase(database_name, kwargs) o solamente puede ser Subclase(kwargs)

rjherrera commented 3 years ago

No es necesario abrir una conexión por instancia, como hemos explicado en otras consultas, puedes hacerlo pero te va a traer problemas a la hora de intentar hacer una transacción.

No está bien que haya que hacer cursor.execute(instancia_subclase.create(**kwargs)). Primero porque create no es método de instancia, es método de clase. Segundo porque el método mismo debe hacer la creación, no debe retornar algo (asumo que es un string) que después otra cosa se encarga de reflejarlo en la base de datos, tiene que hacerlo el método mismo.

Recuerda que puedes manejar variables en python a nivel de clase o a nivel de archivo, no todo es a nivel de instancia!

No se pide en el enunciado que se instancien las cosas con Subclase(**kwargs), así que si decides instanciar así es parte de tu programa. Sin embargo, lo que no se puede, es modificar la forma en la que se llaman a los otros métodos, por ejemplo hacer Distrito.create('distrito', name='x') no es válido, porque en el enunciado se pide que sea Distrito.create(name='x').