Guia Python: alta, listado, consulta y borrado de datos (1a parte).

Publicado el 30 agosto 2013 por Hugo Rep @HugoRep

Python es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).
Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).

Alta y listado de una base de datos (App Engine)

El almacenamiento de datos utilizando la infraestructura de Google es bastante distinta a las metodologías de MySql, Oracle, Sql Server etc.

Google utiliza una tecnología llamada 'Bigtable', básicamente es un sistema de almacenamiento distribuido que permite escalar de forma muy sencilla, evitando que por ejemplo las consultas de tablas con millones de registros se resientan.

Para hacer uso de esta tecnología debemos importar el paquete db:

from google.appengine.ext import db

Desarrollaremos una aplicación que permita almacenar el nombre de usuario y su clave. Luego imprimiremos todos los registros almacenados.

import cgi
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext import db

class Formulario1(webapp.RequestHandler):
  def get(self):
   self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese su nombre:
<input type="text" name="nombre"><br>
Ingrese su clave:
<input type="password" name="clave"><br>
<input type="submit" value="enviar"><br>
</form>
</body>
</html>
""")


class TablaUsuarios(db.Model):
  nombre=db.StringProperty()
  clave=db.StringProperty()

class ProcFormulario1(webapp.RequestHandler):
  def post(self):
   self.response.out.write("<html><head></head><body>")
   nom=cgi.escape(self.request.get('nombre'))
   cla=cgi.escape(self.request.get('clave'))
   usuario=TablaUsuarios()
   usuario.nombre=nom
   usuario.clave=cla
   usuario.put()
   self.response.out.write("<a href=\"listadousuarios\">Listado</a>")
   self.response.out.write("</body></body>")
  
class ListadoUsuarios(webapp.RequestHandler):
  def get(self):
   self.response.out.write("<html><head></head><body>")
   usuarios=db.GqlQuery("select * from TablaUsuarios")
   for usu in usuarios:
   self.response.out.write("Nombre:" + usu.nombre +"<br>")
   self.response.out.write("Clave:" + usu.clave +"<br>")
   self.response.out.write("<hr>")
   self.response.out.write("<a href=\"\\\">Principal</a>")
   self.response.out.write("</body></body>")

  
  
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
   ('/procformulario1', ProcFormulario1),
   ('/listadousuarios', ListadoUsuarios)],
   debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()

Veamos todo lo que debemos agregar:

  • Debemos importar el paquete db:

    from google.appengine.ext import db



  • Debemos declarar una clase que representa una tabla. Esta clase debe heredar de la clase Model contenida en el paquete db. Definimos dos atributos de tipo StringProperty. StringProperty es una clase contenida en el paquete db y que encapsula el manejo de un campo de cadena de caracteres:


    class TablaUsuarios(db.Model): nombre=db.StringProperty() clave=db.StringProperty()




  • Para efectuar el alta de un registro en la tabla:




class ProcFormulario1(webapp.RequestHandler):

  def post(self):

   self.response.out.write("<html><head></head><body>")

   nom=cgi.escape(self.request.get('nombre'))

   cla=cgi.escape(self.request.get('clave'))

   usuario=TablaUsuarios()

   usuario.nombre=nom

   usuario.clave=cla

   usuario.put()

   self.response.out.write("<a href=\"listadousuarios\">Listado</a>")

   self.response.out.write("</body></body>")


Creamos un objeto de la clase Tablausuarios:


usuario=TablaUsuarios()


Inicializamos los atributos nombre y clave con los datos extraidos del formulario.


usuario.nombre=nom

   usuario.clave=cla



Llamamos al método put que confirma los datos previamente cargados:


usuario.put()




  • Para obtener un listado de todos los registros almacenados:




class ListadoUsuarios(webapp.RequestHandler):

  def get(self):

   self.response.out.write("<html><head></head><body>")

   usuarios=db.GqlQuery("select * from TablaUsuarios")

   for usu in usuarios:

   self.response.out.write("Nombre:" + usu.nombre +"<br>")

   self.response.out.write("Clave:" + usu.clave +"<br>")

   self.response.out.write("<hr>")

   self.response.out.write("<a href=\"\\\">Principal</a>")

   self.response.out.write("</body></body>")



Creamos un objeto de la clase GqlQuery pasando como parámetro al constructor los datos a recuperar:


usuarios=db.GqlQuery("select * from TablaUsuarios")


Mediante un for recorremos la lista de usuarios y los imprimimos:


for usu in usuarios:

   self.response.out.write("Nombre:" + usu.nombre +"<br>")

   self.response.out.write("Clave:" + usu.clave +"<br>")

   self.response.out.write("<hr>")


Como esta aplicación requiere tres páginas luego debemos registrarlas cuando creamos un objeto de la clase WSGIApplication:


def main():

  application = webapp.WSGIApplication([('/', Formulario1),

   ('/procformulario1', ProcFormulario1),

   ('/listadousuarios', ListadoUsuarios)],

   debug=True)

  wsgiref.handlers.CGIHandler().run(application)


Consulta de datos (App Engine).


Confeccionaremos una aplicación que nos permita ingresar el nombre de usuario y nos recupere y muestre su clave. Tener en cuenta los datos cargados en el concepto anterior.


import cgi

import wsgiref.handlers


from google.appengine.ext import webapp

from google.appengine.ext import db


class Formulario1(webapp.RequestHandler):

  def get(self):

   self.response.out.write("""

<html>

<head></head>

<body>

<form action="procformulario1" method="post">

Ingrese nombre de usuario:

<input type="text" name="nombre"><br>

<input type="submit" value="enviar"><br>

</form>

</body>

</html>

""")


class TablaUsuarios(db.Model):

  nombre=db.StringProperty()

  clave=db.StringProperty()


class ProcFormulario1(webapp.RequestHandler):

  def post(self):

   self.response.out.write("<html><head></head><body>")

   nom=cgi.escape(self.request.get('nombre'))

   usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)

   usu=usuario.fetch(1)

   if len(usu)>0:

   self.response.out.write("Clave:" + usu[0].clave +"<br>")

   else:

   self.response.out.write("No existe un usuario con dicho nombre<br>")

   self.response.out.write("<a href=\"\\\">Principal</a>")

   self.response.out.write("</body></body>")

  
  
def main():

  application = webapp.WSGIApplication([('/', Formulario1),

   ('/procformulario1', ProcFormulario1),

   ],

   debug=True)

  wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':

  main()


Creamos un formulario para ingresar el nombre de usuario a buscar:


class Formulario1(webapp.RequestHandler):

  def get(self):

   self.response.out.write("""

<html>

<head></head>

<body>

<form action="procformulario1" method="post">

Ingrese nombre de usuario:

<input type="text" name="nombre"><br>

<input type="submit" value="enviar"><br>

</form>

</body>

</html>

""")



El botón submit hace que se ejecute la clase ProcFormulario1:


class ProcFormulario1(webapp.RequestHandler):

  def post(self):

   self.response.out.write("<html><head></head><body>")

   nom=cgi.escape(self.request.get('nombre'))

   usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)

   usu=usuario.fetch(1)

   if len(usu)>0:

   self.response.out.write("Clave:" + usu[0].clave +"<br>")

   else:

   self.response.out.write("No existe un usuario con dicho nombre<br>")

   self.response.out.write("<a href=\"\\\">Principal</a>")

   self.response.out.write("</body></body>")



Primero generamos una consulta a la tabla y le pasamos como parámetro en el campo nombre el valor rescatado del formulario, debemos utilizar los dos puntos y un uno para indicar que dicho espacio será remplazado por el segundo parámetro:


usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)


La clase GqlQuery tiene un método llamado fetch que retorna todos los registros generados en la consulta. Al método fetch le pasamos la cantidad de registros que queremos rescatar y por último accedemos a la primer componente de la lista siempre y cuando la cantidad de elementos sea mayor a cero.


Borrado de datos (App Engine).


Confeccionaremos una aplicación que nos permita ingresar el nombre de usuario y efectúe su borrado.. Tener en cuenta los datos cargados en conceptos anterioriores.


import cgi

import wsgiref.handlers


from google.appengine.ext import webapp

from google.appengine.ext import db


class Formulario1(webapp.RequestHandler):

  def get(self):

   self.response.out.write("""

<html>

<head></head>

<body>

<form action="procformulario1" method="post">

Ingrese nombre de usuario a borrar:

<input type="text" name="nombre"><br>

<input type="submit" value="enviar"><br>

</form>

</body>

</html>

""")



class TablaUsuarios(db.Model):

  nombre=db.StringProperty()

  clave=db.StringProperty()


class ProcFormulario1(webapp.RequestHandler):

  def post(self):

   self.response.out.write("<html><head></head><body>")

   nom=cgi.escape(self.request.get('nombre'))

   usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)

   usu=usuario.fetch(1)

   if len(usu)>0:

   usu[0].delete()

   self.response.out.write("Se borro el usuario<br>")

   else:

   self.response.out.write("No existe un usuario con dicho nombre<br>")

   self.response.out.write("<a href=\"\\\">Principal</a>")

   self.response.out.write("</body></body>")


  
  
def main():

  application = webapp.WSGIApplication([('/', Formulario1),

   ('/procformulario1', ProcFormulario1),

   ],

   debug=True)

  wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':

  main()



Si lo comparamos con la consulta es prácticamente igual con la salvedad donde en lugar de mostrarlo procedemos a borrarlo:


nom=cgi.escape(self.request.get('nombre'))

   usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)

   usu=usuario.fetch(1)

   if len(usu)>0:

   usu[0].delete()

   self.response.out.write("Se borro el usuario<br>")

   else:

   self.response.out.write("No existe un usuario con dicho nombre<br>")


El método delete borrar el registro.


Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog: