Quijost

Por favor ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Búsqueda Avanzada  

Noticias:

Deja tu post en el foro para hacer algun tipo de consulta

Autor Tema: MongoDB  (Leído 6764 veces)

0 Usuarios y 1 Visitante están viendo este tema.

pythoner

  • Usuario nuevo
  • *
  • Karma: +4/-0
  • Desconectado Desconectado
  • Mensajes: 20
  • Open your eyes, open your mind, open your source
    • Ver Perfil
MongoDB
« en: Abril 09, 2011, 23:29:59 pm »

He visto que en hosting dais pymongo y también soporte de mongodb para django, pero al intentar sincronizar las bases de datos mediante la instrucción:

Código: [Seleccionar]
python manage.py syncdb
Me da un error diciendo que no encuentra el "master" del servidor, o lo que es lo mismo, que el servidor no está en ejecución, mi pregunta es ¿tengo que haccer algo en especial para que funcione mongodb en mi cuenta de hosting?

Un saludo

P.D.: se me olvidaba una vez que esté activo o sepa como ejecutarlo, habría que hacer una ligera modificación en el código original de django 1.3 para que sea totalmente compatible con mongodb y que no sepa no afecta al resto de bases de datos existentes o no he visto nada hasta ahora que pueda afectar, si lo haceis me avisais y os digo el archivo que hay que modificar ligeramente (básicamente sustituir uno por otro).
« última modificación: Abril 09, 2011, 23:31:55 pm por pythoner »
En línea

ernestmego

  • Soporte Técnico
  • Usuario experimentado
  • *
  • Karma: +1/-0
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 57
  • Soporte veloz y eficiente
    • Ver Perfil
Re:MongoDB
« Respuesta #1 en: Abril 10, 2011, 14:27:49 pm »

Ya esta encendido el master (estaba desactivado puesto que hasta el momento no había ningún cliente que lo solicitara activo).

Un ejemplo de ejecución:

Código: [Seleccionar]
# mongo
MongoDB shell version: 1.8.1
connecting to: test
> use test
switched to db test
> db.foo.find()
> db.foo.save({a: 1})
> db.foo.find()
{ "_id" : ObjectId("4da1a0e4cd52ba3009aa1a90"), "a" : 1 }
> db.foo.update( {a: 1}, {a: 5})
> db.foo.find()
{ "_id" : ObjectId("4da1a0e4cd52ba3009aa1a90"), "a" : 5 }
> bye

Ejemplo de acceso remoto (en localhost):

Código: [Seleccionar]
# mongo localhost:27017/test
MongoDB shell version: 1.8.1
connecting to: localhost:27017/test
> bye
En línea
Co-Soporte de Quijost
24x7 Rapido, eficiente y profesional

pythoner

  • Usuario nuevo
  • *
  • Karma: +4/-0
  • Desconectado Desconectado
  • Mensajes: 20
  • Open your eyes, open your mind, open your source
    • Ver Perfil
Re:MongoDB
« Respuesta #2 en: Abril 12, 2011, 16:07:57 pm »

Efectivamente el intérprete de comando mongodb funciona a la perfección, pero hay que modificar una cosita en el django original para poder realizar las conexiones y tambié poder crear las tablas y bases de datos mediante el administrador de proyecto django (manage.py), de momento da este error:

Código: [Seleccionar]
django.db.utils.DatabaseError: Ordering can't span tables on non-
relational backends (content_type__app_label)

La solución yo a seguí a través de este post en los mensajes de discusión del grupo de django-non-relational:

http://groups.google.com/group/django-non-relational/browse_thread/thread/050104dfb070b123

Es tan sólo modificar un archvio por otro, a mi  desde luego no me ha dado problemas al crear/modificar/actualizar otros modelos para otros tipos de bases de dato (sqlite y mysql), de todos modos probadlo a ver os funciona bien, Windows 7 si me ha ido bien, pero en linux Cent OS u otros sistemas *nix no sabría que decir, no he podido probarlo.

Un saludo y gracias por todo.
En línea

shakaran

  • Soporte
  • Administrator
  • Usuario profesional
  • *****
  • Karma: +12/-0
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 487
  • Un buen soporte lo es todo
    • Ver Perfil
    • Shakaran
Re:MongoDB
« Respuesta #3 en: Abril 13, 2011, 13:12:00 pm »

Hemos reemplazado el archivo:

Código: [Seleccionar]
/usr/lib/python2.6/site-packages/django/contrib/auth/management/__init__.py
Por el siguiente contenido sugerido, que debe arreglar el error y poder usar bases de datos no relacionales:

Código: [Seleccionar]
"""
Creates permissions for all installed apps that need permissions.
"""

from django.db.models import get_models, signals
from django.contrib.auth import models as auth_app

def _get_permission_codename(action, opts):
    return u'%s_%s' % (action, opts.object_name.lower())

def _get_all_permissions(opts):
    "Returns (codename, name) for all permissions in the given opts."
    perms = []
    for action in ('add', 'change', 'delete'):
        perms.append((_get_permission_codename(action, opts), u'Can %s %s' % (action, opts.verbose_name_raw)))
    return perms + list(opts.permissions)

def create_permissions(app, created_models, verbosity, **kwargs):
    from django.contrib.contenttypes.models import ContentType
    from django.contrib.auth.models import Permission
    app_models = get_models(app)
    if not app_models:
        return
    for klass in app_models:
        ctype = ContentType.objects.get_for_model(klass)
        for codename, name in _get_all_permissions(klass._meta):
            p, created = Permission.objects.get_or_create(codename=codename, content_type__pk=ctype.id,
                defaults={'name': name, 'content_type': ctype})
            if created and verbosity >= 2:
                print "Adding permission '%s'" % p

def create_superuser(app, created_models, verbosity, **kwargs):
    from django.contrib.auth.models import User
    from django.core.management import call_command
    if User in created_models and kwargs.get('interactive', True):
        msg = "\nYou just installed Django's auth system, which means you don't have " \
                "any superusers defined.\nWould you like to create one now? (yes/no): "
        confirm = raw_input(msg)
        while 1:
            if confirm not in ('yes', 'no'):
                confirm = raw_input('Please enter either "yes" or "no": ')
                continue
            if confirm == 'yes':
                call_command("createsuperuser", interactive=True)
            break

signals.post_syncdb.connect(create_permissions,
    dispatch_uid = "django.contrib.auth.management.create_permissions")
signals.post_syncdb.connect(create_superuser,
    sender=auth_app, dispatch_uid = "django.contrib.auth.management.create_superuser")

Prueba de nuevo ahora.
En línea
Ángel Guzmán Maeso
Quijost Founder - Backend Engineer & Main support

pythoner

  • Usuario nuevo
  • *
  • Karma: +4/-0
  • Desconectado Desconectado
  • Mensajes: 20
  • Open your eyes, open your mind, open your source
    • Ver Perfil
Re:MongoDB
« Respuesta #4 en: Abril 25, 2011, 14:45:17 pm »

Bien, funciona correctamente, crea las bases de datos y puedo meter los datos necesarios en los documentos y colecciones sin problemas, el único problema que tiene el ORM (Object Relational Mapper) de Django es que al actualizar un documento (una fila para las bases de datos relacionales) es que da un error de tipo de dato de tipo entero, pues en MongoDB los índices y claves primarias son basados en cadenas (el OpenID o algo así se llamaba), hay una forma de solucionarlo, pero aun estoy mirándolo en un tutorial que he encontrado en allbuttonspressed.com a ver si me funciona y es posible usar el ORM Django de siempre con MongoDB de forma transparente y portable a otras bases de datos relacionales (para bases de datos poco complejas).

En cuanto tenga la solución correcta (la solución está en la API QuerySet de Django) escribiré un tutorial de cómo hacerlo todo sin fallos o los mínimos posibles y de paso sea lo más sencillo posible como hice con el minitutorial de configurar una aplicación Django en el hosting.

Como nota aparte he de comentar algo, es una sugerencia con respecto a MongoDB y vuestro hosting, si quereis dar un panel de control tipo phpmyadmin pero hecho en django hay uno llamado Fang of mongo (https://github.com/Fiedzia/Fang-of-Mongo), teneis una demostración en http://178.63.232.124:8000/fangofmongo/, lo hubiera probado en el hosting, pero no se de que forma puedo instalar dicho proyecto en la misma cuenta, salvo que me ponga a  crear un nuevo host y ahí lo incluya, entonces sería posible, pero lo realmente importante es que parece un buen proyecto y como se quiere promocionar el uso de Django en vuestro host me parece una ide acertada tener ese entorno de administración de MongoDB basado en Web, la instalación es muy sencilla, pero el hacerlo disponible para cada uno de los usuarios no se como se haría, desde luego la instalación personal de cada uno es francamente fácil, es sólo subir el directorio llamado "fangofmongo" al raíz public_html con el archivo .htacces y django.wsgi debidamente configurados y debería funcionar, pero lo que he dicho, sólo para un único usuario, para el resto de usuarios no se hasta que punto es viable.

Espero que os guste y os sirva, desde luego al menos la licencia de este software es GPL.

Un saludo

Pythonero ;)
En línea

ernestmego

  • Soporte Técnico
  • Usuario experimentado
  • *
  • Karma: +1/-0
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 57
  • Soporte veloz y eficiente
    • Ver Perfil
Re:MongoDB
« Respuesta #5 en: Abril 25, 2011, 15:03:59 pm »

Gracias pythoner, agradecemos tu esfuerzo por la elaboración de tutoriales. Apoyamos el mundo del software libre y esta es una muy buena manera de contribuir.

Respecto a Fang of mongo parece muy interesante, vamos a probarlo unos días en servidores que no están en producción y comprobar si existe algún tipo de conflicto o riesgo de seguridad/visibilidad para el resto de usuarios. Si es factible, lo incorporaremos en los servidores compartidos para que se pueda disponer del software por defecto.

Sino, como comentas, los usuarios siempre tienen la elección de instalarlo ellos mismos (simplemente descomprimiendo el código en sus cuentas de usuario).
En línea
Co-Soporte de Quijost
24x7 Rapido, eficiente y profesional

pythoner

  • Usuario nuevo
  • *
  • Karma: +4/-0
  • Desconectado Desconectado
  • Mensajes: 20
  • Open your eyes, open your mind, open your source
    • Ver Perfil
Re:MongoDB
« Respuesta #6 en: Abril 25, 2011, 16:12:55 pm »

Personalmente el único fallo que tengo es con JavaScript, lo he probado con Firefox y con Chrome, pero falla igualmente, no se ve adecuadamente, si conseguis arreglarlo sería perfecto, si no ya se verá si se puede realizar una nueva GUI usando Django-UI o alguna así similar (estoy también con ello... ya tantas cosas que se me va ir la cabeza :S)

Un saludo, Pythonero
En línea

pythoner

  • Usuario nuevo
  • *
  • Karma: +4/-0
  • Desconectado Desconectado
  • Mensajes: 20
  • Open your eyes, open your mind, open your source
    • Ver Perfil
Re:MongoDB
« Respuesta #7 en: Abril 26, 2011, 10:24:51 am »

A ver, he hecho una prueba mirando este programa con Linux y con Windows, no debería haber diferencias, pero curiosamente en Linux lo visualizo sin problemsa, mientras que en Windows 7 no me funciona correctamente, probadlo con Opera y Safari a ver como funciona, por lo demás parece funcionar bien. El motivo de por qué no funciona en W7 no lo se, pero me resulta bastante curioso.

Un saludo
En línea
 

Página generada en 0.078 segundos con 32 consultas.