• Python + MongoDB = Pymongo

 #398642  por sanko
 21 Dic 2012, 03:13
Bueno , no hace mucho publiqué una introducción sobre MongoDB con sus características , primeros pasos y demas.
Bien , pues hoy trataré sobre un tema que a muchos Pythoneros como yo les interesa.

MongoDB cuenta con unos drivers que soportan una gran variedad de lenguajes :

C
C++
Erlang
Haskell
Java (and other JVM languages)
Javascript
.NET (C#, F#, PowerShell, ...)
Node.js
Perl
PHP
Python
Ruby
Scala

Para más información sobre los drivers : [ Debe registrarse para ver este enlace ]
Uno de los más recomendados a la hora de tratar con MongoDB desde python es "Pymongo".

Primero debemos instalar la libreria pymongo , en mi caso uso mint asi que:
Código: [ Debe registrarse para ver este enlace ]
sudo apt-get install pymongo
Jugaremos con los mismos comandos con pymongo que realizamos en la introducción a MongoDB :

- Conectaremos con la BD
- Veremos las BD's que tenemos creadas
- Veremos las colecciones que tenemos ya creadas
- Crearemos una nueva BD
- Crearemos una nueva colección
- Insertaremos nuevos documentos
- Actualizaremos documentos
- Buscaremos documentos
- Borraremos documentos con remove y con drop


Y como petición especial (me enviarón la duda por MP) y ya que al parecer no puede esperar al próximo tutorial de MongoDB :

- Borraremos bases de datos

Bueno comenzemos importando pymongo :
Código: [ Debe registrarse para ver este enlace ]
from pymongo import Connection
Creamos la conexión con la BD :
Código: [ Debe registrarse para ver este enlace ]
conex = Connection('localhost') 
Ahí veís puse localhost por defecto porque la BD esta en nuestra PC y pymongo nos conecta con ella si le indicamos local pero ahi deberían de indicar el sitio de la BD y el puerto al que se conecta.

Bueno veamos las BD's que ya hay creadas :
conex.database_names()

Ahora creemos una BD nueva :
Código: [ Debe registrarse para ver este enlace ]
db = conex.nombredb
Creamos una nueva colección :
Código: [ Debe registrarse para ver este enlace ]
collect = db.coleccionnueva
Veamos que colecciones tenemos creadas :
Código: [ Debe registrarse para ver este enlace ]
db.collection_names()
Insertemos un documento :
Código: [ Debe registrarse para ver este enlace ]
collect.insert({"name":"sanko","twitter":"sankoSK"})
Actualizamos documentos con update(): Vamos a realizar una busqueda de documentos : Borremos documentos con remove(): Vaciamos la colección (borramos todos los documentos) con drop():
Y ahora la petición especial , borrar bases de datos...


Aquí me explicaré un poquito más puesto que este comando es nuevo(No lo dimos en el post introductorio a MongoDB).
En MongoDB borrariamos la BD de la siguiente manera:

-Accedemos a la database
-Nos borramos

Código: [ Debe registrarse para ver este enlace ]
use nuestrabd
db.dropDatabase()
Una vez aclarado esto , veamos como borrariamos la bd en pymongo:
Código: [ Debe registrarse para ver este enlace ]
conex.drop_database('nombredatabase')
Bueno , ahora pongamos esto en práctica creando un código SIMPLE, no nos vamos a matar creando un super manager para un tutorial... xd
Algo así :
Código: [ Debe registrarse para ver este enlace ]
#	Probaremos los codes , asi que los pondremos todos
#	Coded by Sanko
#	Haremos lo siguiente :
#		-Conectaremos con la BD
#		-Veremos las BD's que tenemos creadas
#		-Veremos las colecciones que ya tenemos creadas
#		-Crearemos una nueva BD
#		-Crearemos una nueva coleccion
#		-Insertaremos nuevos documentos
#		-Actualizaremos documentos
#		-Borraremos documentos con remove y drop

#	Simple MongoDB-Manager using pymongo - Sanko

from pymongo import Connection

def mongomanager():

	conex = Connection('localhost')

	def databases():
		print "Control de BD's , Que deseas hacer?"
		entrada = raw_input("- [1]Visualizar BD's | [2]Crear BD's | [3]Borrar BD's | [4]Home -> ")
		if entrada == '1':
			var = conex.database_names()
			print var
			databases()
		elif entrada == '2':
			name = raw_input("Nombre de la BD que quieres crear -> ")
			global db 
			db = conex.name
			databases()
		elif entrada == '3':
			delname = raw_input("Nombre de la BD que quieres eliminar -> ")
			conex.drop_database(delname)
			databases()
		elif entrada == '4':
			mongomanager()
		else:
			print "Error\n"
			mongomanager()

	def collections():
		print "Control de Colecciones , que deseas hacer?"
		entrada = raw_input("- [1]Visualizar colecciones | [2]Crear coleccion | [3]Home -> ")
		if entrada == '1':
			var = db.collection_names()
			print var
			collections()
		elif entrada == '2':
			global collectname 
			collectname = raw_input("Nombre de la coleccion que quieres crear -> ")
			collect = db.collectname
			collections()
		elif entrada == '3':
			mongomanager()
		else:
			print "error\n"
			mongomanager()

	def documents():
		print "Control de Documentos , que deseas hacer?"
		entrada = raw_input("[1]Crear documento | [2]Busqueda de documentos | [3]Eliminar documento | [4]Home -> ")
		if entrada == '1':
			#Escriba el contenido de esta manera "name":"sanko" por ejemplo.
			document = raw_input("Escriba el contenido del doc => ")
			collectname.insert({"name":"sankito"})
			documents()
		elif entrada == '2':
			content = raw_input("Parametros del contenido -> ")
			var = collectname.find(content)
			print var
			documents()
		elif entrada == '3':
			choosedel = raw_input("Desea vaciar el documento(1) o borrar algo especifico(2) -> ")
			if choosedel == '1':
				collectname.drop()
				documents()
			elif choosedel == '2':
				delcontent = raw_input("Parametros del borrado -> ")
				collectname.remove(delcontent)
				documents()
			else:
				print "error\n"
				documents()
		else:
			print "error\n"
			mongomanager()

	entrada = raw_input("PyMongo Manager => Exit(0) | Control BD's(1) | Control Colecciones(2) | Control de Documentos(3) -> ")
	if entrada == '0':
		exit
	elif entrada == '1':
		databases()
	elif entrada == '2':
		collections()
	elif entrada == '3':
		documents()
	else:
		print "Error\n"
		mongomanager()

mongomanager()
Una imagen del rápido testeo :




Para los vagos aca les dejo el code en Pastebin -> [ Debe registrarse para ver este enlace ]

El code esta creado muy rápidamente por eso tiene unos patrones muy rígidos a vuestra imaginación queda quitar lla necesidad de definir unas variables antes de crear el documento y demas cosas , eso ya se tiene que hacer pensando como sería más cómodo y dedicandole un buen rato.

Espero os sirviera este articulo , como siempre UN ABRAZO.
Saludos , Sanko