Cómo usar un mismo database en varias aplicaciones web2py

140 views
Skip to first unread message

camalotus

unread,
Feb 23, 2010, 8:36:49 AM2/23/10
to web2py-usuarios
Hola a todos, recién acabo de agregarme a este grupo.

Empecé a usar web2py hace muy poquito, así que pido disculpas si mis
consultas son demasiado básicas (de hecho, tengo unas cuantas
consultas, pero iré creando distintos posts con títulos descriptivos,
para que quien busca pueda encontrar respuesta rápidamente).

Estoy creando un sitio web en web2py. El mismo cuenta con 3
aplicaciones, "pyLicencias", "ciudadanos" y "turnos". Para las tres
aplicaciones, he definido una única base de datos. Todas las
aplicaciones se conectan a la misma base de datos, hecha en
postgresql, por lo que incluí la siguiente instrucción: "db =
DAL('postgres://user:password@localhost/pyLicencias')" en cada archivo
db.py de cada aplicación. (¿es esto correcto?).

Ahora bien, el modelo de base de datos (todos los db.define_table...)
están en el archivo db.py de la aplicación inicial, que es
"pyLicencias". Yo necesito acceder a dicha base de datos desde las
otras aplicaciones: "turnos" y "ciudadanos".
Por ejemplo, en el controlador "default" de la aplicación ciudadanos,
en la función "index", quiero seleccionar todos los ciudadanos de la
tabla "ciudadanos" y mostrarlos en una vista. Pero cuando intento
acceder a "db.ciudadanos", recibo el mensaje de "key error", es decir,
web2py no encuentra la tabla "ciudadanos".

Entonces: ¿cómo hago para utilizar una misma base de datos en varias
las aplicaciones web2py?

Yo antes usaba Django, y hacía algo como "from
mysite.myapplication.models import *", y eso me importaba todas las
clases definidas en el modelo de datos. ¿Hay algún método similar en
web2py?

Desde ya muchísimas gracias!
Y por supuesto, espero poder ayudar a otros usuarios, esto es, sólo
cuando domine mejor el framework!! :)

DenesL

unread,
Feb 23, 2010, 11:33:47 AM2/23/10
to web2py-usuarios

Debes definir una de las aplicaciones como aplicación maestra.
Si usas SQLite la apl. maestra define:

db=SQLDB('sqlite://storage.db')
db.define_table(.....)

y las otras apl. definen:

db=SQLDB('sqlite://../../masterapp/databases/storage.db')
db.define_table(.....,migrate=False) #### importante!

Si usas una BD diferente a SQLite la conexión db=SQLDB(...) es
idéntica para las tres aplicaciones pero debes conservar el
migrate=False en las tablas de las apl. no maestras.

Nota: la apl. maestra debe definir todas las tablas, las otras solo
las tablas que usan.

Mariano Reingart

unread,
Feb 23, 2010, 1:39:37 PM2/23/10
to web2py-...@googlegroups.com
También se podría encarar más como plugins que como aplicaciones:

http://www.web2py.com/plugins

Cada plugin es una mini-aplicación, que puede tener su modelo
(definición de base de datos), controladores, etc., y luego se pueden
incorporar a una aplicación más facilmente (y no hace falta importar
el modelo como en django, también se pueden distribuir por separado,
etc.)

Sds
Mariano Reingart
http://reingart.blogspot.com

2010/2/23 DenesL <dene...@yahoo.ca>:

Lisandro Rostagno

unread,
Feb 23, 2010, 1:01:30 PM2/23/10
to web2py-...@googlegroups.com
Ok, hasta aquí lo entiendo... Pero entonces debo tener código repetido?? No es uno de los principios de web2py? Dont' repeat yourself?
Tal vez lo estoy malentendiendo... 

Por ejemplo: suponiendo que mi sistema usa 10 tablas, y tengo una aplicación llamada "ciudadanos" que utiliza sólo 3 de aquellas 10 tablas... Tu me dices que, en este caso, debo definir las 10 tablas dentro del db.py de mi aplicación inicial, y luego, en el db.py de la aplicación "ciudadanos" debo definir 3 tablas de modo idéntico, pero con el migrate=False...

Esto es correcto? La verdad, podría ser una solución, pero esto implicaría la necesidad de escribir código repetido en varios lugares... Ni hablar de lo inmanejable que se volvería el desarrollo de un sistema que involucre más de 100 tablas y 7 u 8 aplicaciones... Me explico?

Lisandro Rostagno

unread,
Feb 23, 2010, 2:45:26 PM2/23/10
to web2py-...@googlegroups.com
Ok, entiendo... Investigué un poco, y es realmente útil la funcionalidad de los plugins... (de hecho, al ver algunos plugins se me ocurrieron algunas ideas interesantes para el sitio)...

Pero me parece que, para mi caso en particular, los plugins no son lo más adecuado. Si bien solucionan mi problema, al usar plugins estaría agregando cierta complejidad, y en realidad lo único que necesito es poder usar la misma base de datos en distintas aplicaciones, nada más.

Se me ocurre lo siguiente: en lugar de hacer varias aplicaciones, hago una única aplicación. Y en lugar de tener todo el código de controladores dentro del archivo "default.py", puedo crear varios archivos, por ejemplo: default.py, ciudadanos.py, turnos.py, etc. Todos estos archivos de controladores pertenecerían a la misma aplicación, por lo cual existe un único archivo db.py... Me explico? Creo que eso solucionaría mi problema...
Mi duda ahora es: ¿podría esta modalidad traerme problemas de algún tipo? Digo, problemas que no pueda predecir ahora por ser novato :)

Y otra pregunta que me surgió después de razonar: si alguien desea hacer un sitio en web2py que tenga un mínimo de 10 aplicaciones con muchas tablas (digamos, más de 100) todas en la misma base de datos... ¿Cómo construye ese sitio en web2py? ¿Es factible? ¿Tiene que usar plugins? ¿O está obligado a hacer todo en una única aplicación?

Desde ya muchísimas gracias por el soporte, no sólo fue eficiente y puntual, sino que además muy rápido!!
Saludos...

Mariano Reingart

unread,
Feb 23, 2010, 3:26:25 PM2/23/10
to web2py-...@googlegroups.com
No entiendo la complejidad (es lo mismo que como comentabas con
django: un plugin web2py es similar a una app de django), de hecho
hasta puede ser más fácil, y automáticamente te lo organiza de forma
separada y reusable, pudiendo descargar el tgz e implementarlo en otro
lado.

Lo que comentás de separar una app en varios controladores (turnos,
ciudadanos, etc.) es interesante , incluso podes separar los modelos
en varios archivos (db_turnos.py, db_ciudadanos.py, etc), para tener
todo mas o menos independiente sin llegar a tener que usar plugins
(pero en este caso web2py no te va a organizar de forma separada
automáticamente)

Yo te diría que pruebes uno y otro enfoque, y te fijes cual te
conviene más (y analises realmente en que medida cada parte es
independiente).
web2py es bastante flexible y rápido como para armar estos prototipos :-)

Sds
Mariano

2010/2/23 Lisandro Rostagno <rostagno...@gmail.com>:

Lisandro Rostagno

unread,
Feb 23, 2010, 3:57:10 PM2/23/10
to web2py-...@googlegroups.com
Ok perfecto, entiendo... De hecho, no me atrevo a decir "esto me conviene más que aquello" porque, como había comentado, soy novato!
Así que me parece bien lo que sugeris: probar un enfoque y otro, y luego comparar las alternativas y ver cuál se ajusta mejor a mi necesidades...

En fin, muchas gracias, Mariano y DenesL, por ayudarme con esto, ahora ya tengo un panorama mucho más claro para avanzar con mi proyecto.
Saludos y gracias otra vez!!

DenesL

unread,
Feb 23, 2010, 4:04:27 PM2/23/10
to web2py-usuarios

On Feb 23, 3:26 pm, Mariano Reingart <reing...@gmail.com> wrote:
> No entiendo la complejidad (es lo mismo que como comentabas con
> django: un plugin web2py es similar a una app de django), de hecho
> hasta puede ser más fácil, y automáticamente te lo organiza de forma
> separada y reusable, pudiendo descargar el tgz e implementarlo en otro
> lado.
>
> Lo que comentás de separar una app en varios controladores (turnos,
> ciudadanos, etc.) es interesante , incluso podes separar los modelos
> en varios archivos (db_turnos.py, db_ciudadanos.py, etc), para tener
> todo mas o menos independiente sin llegar a tener que usar plugins
> (pero en este caso web2py no te va a organizar de forma separada
> automáticamente)
>

Hay que tener cuidado, los modelos se ejecutan en orden alfabético.

> Yo te diría que pruebes uno y otro enfoque, y te fijes cual te
> conviene más (y analises realmente en que medida cada parte es
> independiente).
> web2py es bastante flexible y rápido como para armar estos prototipos :-)
>
> Sds
> Mariano
>

> 2010/2/23 Lisandro Rostagno <rostagnolisan...@gmail.com>:


>
> > Ok, entiendo... Investigué un poco, y es realmente útil la funcionalidad de
> > los plugins... (de hecho, al ver algunos plugins se me ocurrieron algunas
> > ideas interesantes para el sitio)...
>
> > Pero me parece que, para mi caso en particular, los plugins no son lo más
> > adecuado. Si bien solucionan mi problema, al usar plugins estaría agregando
> > cierta complejidad, y en realidad lo único que necesito es poder usar la
> > misma base de datos en distintas aplicaciones, nada más.
>
> > Se me ocurre lo siguiente: en lugar de hacer varias aplicaciones, hago una
> > única aplicación. Y en lugar de tener todo el código de controladores dentro
> > del archivo "default.py", puedo crear varios archivos, por ejemplo:
> > default.py, ciudadanos.py, turnos.py, etc. Todos estos archivos de
> > controladores pertenecerían a la misma aplicación, por lo cual existe un
> > único archivo db.py... Me explico? Creo que eso solucionaría mi problema...
> > Mi duda ahora es: ¿podría esta modalidad traerme problemas de algún tipo?
> > Digo, problemas que no pueda predecir ahora por ser novato :)
>

Pues precisamente eso iba a sugerir, no tener varias apl. sino varios
controladores.
No hay problema si no es mandatoria la separación a nivel aplicativo.

> > Y otra pregunta que me surgió después de razonar: si alguien desea hacer un
> > sitio en web2py que tenga un mínimo de 10 aplicaciones con muchas tablas
> > (digamos, más de 100) todas en la misma base de datos... ¿Cómo construye ese
> > sitio en web2py? ¿Es factible? ¿Tiene que usar plugins? ¿O está obligado a
> > hacer todo en una única aplicación?
>

Buena pregunta, al parecer es necesaria cierta redundancia.
Podemos abrir una consulta en el otro grupo a ver que dice Massimo.

> > Desde ya muchísimas gracias por el soporte, no sólo fue eficiente y puntual,
> > sino que además muy rápido!!
> > Saludos...
>

> > El 23 de febrero de 2010 15:39, Mariano Reingart <reing...@gmail.com>


> > escribió:
>
> >> También se podría encarar más como plugins que como aplicaciones:
>
> >>http://www.web2py.com/plugins
>
> >> Cada plugin es una mini-aplicación, que puede tener su modelo
> >> (definición de base de datos), controladores, etc., y luego se pueden
> >> incorporar a una aplicación más facilmente (y no hace falta importar
> >> el modelo como en django, también se pueden distribuir por separado,
> >> etc.)
>
> >> Sds
> >> Mariano Reingart
> >>http://reingart.blogspot.com
>

> >> 2010/2/23 DenesL <denes1...@yahoo.ca>:

Jose

unread,
Feb 23, 2010, 8:07:40 PM2/23/10
to web2py-usuarios

On 23 feb, 10:36, camalotus <rostagnolisan...@gmail.com> wrote:
> Hola a todos, recién acabo de agregarme a este grupo.

> Estoy creando un sitio web en web2py. El mismo cuenta con 3


> aplicaciones, "pyLicencias", "ciudadanos" y "turnos". Para las tres
> aplicaciones, he definido una única base de datos. Todas las
> aplicaciones se conectan a la misma base de datos, hecha en
> postgresql, por lo que incluí la siguiente instrucción: "db =
> DAL('postgres://user:password@localhost/pyLicencias')" en cada archivo
> db.py de cada aplicación. (¿es esto correcto?).
>
> Ahora bien, el modelo de base de datos (todos los db.define_table...)
> están en el archivo db.py de la aplicación inicial, que es
> "pyLicencias". Yo necesito acceder a dicha base de datos desde las
> otras aplicaciones: "turnos" y "ciudadanos".

Yo tengo algo similar y lo resolví con enlaces simbólicos.

Cree varios:
->db.py
->/databases
->/private
->/uploads

y algún otro que no recuerdo.

Te sirve?

Saludos
Jose

Lisandro Rostagno

unread,
Feb 24, 2010, 6:42:15 AM2/24/10
to web2py-...@googlegroups.com
Hola, gracias a todos por las sugerencias...

Me interesó el tema de los enlaces simbólicos (cosa que voy a probar), pero por el momento, voy a trabajar utilizando una única aplicación web2py, que contenga una única definición del modelo de datos (en el archivo db.py), pero que contenga varios controladores... Es decir, separar la estructura lógica del sitio utilizando diferentes archivos .py como controladores... Entonces, la lógica de lo que sería la "aplicación" de "turnos", quedaría dentro del controlador "turnos.py", y así sucesivamente con todas las "aplicaciones" que desee (sin necesidad de definir varias aplicaciones web2py)...

Luego comento qué tal anduvo lo de los enlaces simbólicos...

Muchas gracias!
Saludos...

kike

unread,
Mar 20, 2010, 3:59:53 PM3/20/10
to web2py-usuarios
como seria para el caso de tener un gestor MySQL de esta sintaxis:
> db=SQLDB('sqlite://../../masterapp/databases/storage.db')

Mariano Reingart

unread,
Mar 20, 2010, 4:12:31 PM3/20/10
to web2py-...@googlegroups.com
Calculo que es igual a la conexión que ya tenés, de tu post en web2py-users:

vul=DAL('mysql://root:root@localhost/sbdv',pool_size=20)
db = DAL('mysql://root:root@localhost/usbdv',pool_size=20)

Lo importante es volver a definir las tablas con
db.define_table(.....,migrate=False).

¿Es a eso lo que te referís?

Sds

Mariano Reingart
http://reingart.blogspot.com

2010/3/20 kike <eaca...@estudiantes.uci.cu>:

> To unsubscribe from this group, send email to web2py-usuarios+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.
>

kike

unread,
Mar 20, 2010, 4:27:17 PM3/20/10
to web2py-usuarios
exactamente eso hice, y entonces me dice lo siguiente:

Traceback (most recent call last):
File "/home/kike/sbdv/web2py/gluon/restricted.py", line 173, in
restricted
File "/home/kike/Desktop/web2py/applications/SBDV/models/db.py",
line 58, in <module>
Field('second_preference', vul.object_products, label='Preferencia
Secundaria'))
File "/home/kike/sbdv/web2py/gluon/sql.py", line 1270, in
define_table
File "/home/kike//sbdv/web2py/gluon/sql.py", line 1540, in
_create_references
SyntaxError: Table: table "object_vendors" does not exist


y esto fue lo que agregue anteriormente:

vul=DAL('mysql://root:root@localhost/sbdv',pool_size=20)

vul.define_table('object_vendors', migrate=False)
vul.define_table('object_products', migrate=False)
vul.define_table('object_versions', migrate=False)
vul.define_table('object_correlations', migrate=False)
vul.define_table('object_affect_types', migrate=False)
vul.define_table('object_links', migrate=False)
vul.define_table('vulnerabilities', migrate=False)
vul.define_table('credits', migrate=False)
vul.define_table('authors', migrate=False)
vul.define_table('ext_reference_types', migrate=False)
vul.define_table('ext_references', migrate=False)
vul.define_table('classification_types', migrate=False)
vul.define_table('classification_items', migrate=False)
vul.define_table('classifications', migrate=False)


Con eso no deberia ser suficiente???

On Mar 20, 3:12 pm, Mariano Reingart <reing...@gmail.com> wrote:
> Calculo que es igual a la conexión que ya tenés, de tu post en web2py-users:
>
> vul=DAL('mysql://root:root@localhost/sbdv',pool_size=20)
> db = DAL('mysql://root:root@localhost/usbdv',pool_size=20)
>
> Lo importante es volver a definir las tablas con
> db.define_table(.....,migrate=False).
>
> ¿Es a eso lo que te referís?
>
> Sds
>
> Mariano Reingarthttp://reingart.blogspot.com
>

> 2010/3/20 kike <eacarm...@estudiantes.uci.cu>:

Mariano Reingart

unread,
Mar 20, 2010, 5:05:41 PM3/20/10
to web2py-...@googlegroups.com
Tendrías que volver a definir los campos que uses (ademas del migrate=False).
Igual se me ocurre que si usas dos bases de datos distintas y tengas
tablas relacionadas entre ambas, probablemente eso no funcione del
todo (a nivel de base de datos y a nivel de web2py).

Sds

Mariano Reingart
http://reingart.blogspot.com

2010/3/20 kike <eaca...@estudiantes.uci.cu>:

Reply all
Reply to author
Forward
0 new messages