Generación y modificación dinamica (en runtime) de modelos.

31 views
Skip to first unread message

Sebastian Bassi

unread,
Aug 1, 2012, 10:54:02 AM8/1/12
to web2py-...@googlegroups.com
¿Es posible hacer como una ABM pero que tambien se pueda sacar y agregar campos? El ABM que viene con los modelos me permite agregar datos y hacer queries, pero no modificar el modelo o la DB. Editar db.py es facil para un dev., pero mi idea es que lo pueda editar un usuario final desde una GUI en web2py.

Javier Pepe

unread,
Aug 1, 2012, 12:45:27 PM8/1/12
to web2py-...@googlegroups.com
Hola sebastian

Creo que podrías definir los modelos dentro de una db, y ejecutarlos luego.
Entonces haces un abm para mantener los modelos.
Creo que algo asi hace movu.ca, pero por el la forma que que funciona DAL, no debería ser muy dificil.
Entonces en vez de tener los modelos en db.py los tendrías en otro base datos, y los ejecutas dentro de db.py.




2012/8/1 Sebastian Bassi <sba...@gmail.com>

Martín Mulone

unread,
Aug 2, 2012, 11:39:36 AM8/2/12
to web2py-...@googlegroups.com
Es buena la pregunta, creo que lo podés hacer hay que pensarlo un poco pero no veo porque no.

Teniendo en cuenta esto como bien básico: db.define_table('mytable',Field('myfield','string'))

Un ejemplo de definición sería esto por ejemplo:

registros = [{'name': 'myfield', 'type': 'string'}, {'name': 'myfield2', 'type': 'string'}]
db.define_table('mytable',*[Field(registro['name'], registro['type']) for registro in registros])
--

Sebastian Bassi

unread,
Aug 2, 2012, 1:24:51 PM8/2/12
to web2py-...@googlegroups.com
2012/8/2 Martín Mulone <mulone...@gmail.com>

Un ejemplo de definición sería esto por ejemplo:
registros = [{'name': 'myfield', 'type': 'string'}, {'name': 'myfield2', 'type': 'string'}]
db.define_table('mytable',*[Field(registro['name'], registro['type']) for registro in registros])


Eso en el controlador o en el archivo de modelos? 

Martín Mulone

unread,
Aug 2, 2012, 1:44:20 PM8/2/12
to web2py-...@googlegroups.com
en dónde vos definas los modelos de datos si lo hacés en models como gralmente se hace. Si vos por ejemplo lo que querés es definir una determinada tabla en un controlador podés hacerlo. A ver si se entiende:

un ejemplo:

models/db.py

db.define_table('latabla',Field('myfield','string'))

controllers/default.py


registros = [{'name': 'myfield', 'type': 'string'}, {'name': 'myfield2', 'type': 'string'}]
db.define_table('mytable',*[Field(registro['name'], registro['type']) for registro in registros])

NOTA: En controlador default.py voy a poder acceder a  db.latabla y a la recién creada db.mytable
--

Sebastian Bassi

unread,
Aug 2, 2012, 1:50:25 PM8/2/12
to web2py-...@googlegroups.com
2012/8/2 Martín Mulone <mulone...@gmail.com>

en dónde vos definas los modelos de datos si lo hacés en models como gralmente se hace. Si vos por ejemplo lo que querés es definir una determinada tabla en un controlador podés hacerlo. A ver si se entiende:

un ejemplo:

models/db.py

db.define_table('latabla',Field('myfield','string'))


Lo que no me queda claro, es que si desde el programa corriendo tengo que leer y escribr el archivo models/db.py para cada tabla que agrego en runtime. O sea, si para cada vez que agrego una tabla via el programa, tengo que agregar la definición de modelo en ese archivo.
O sino se me ocurre que puedo hacer a mano una "meta-tabla" que adentro tenga las demas tablas.


Martín Mulone

unread,
Aug 2, 2012, 2:05:28 PM8/2/12
to web2py-...@googlegroups.com
No te compliqués: La variable registros que es una lista puede ser registros de una tabla, a medida que vos agregués registros a la tabla en cada request la define.

sería algo así (no probé si anda):

db.define_table('definiciones',Field('name','string'),Field('type','string', default='string'))
db.mytable.insert(name='myfield', type='string')
registros = db(db.definiciones.id > 0).select()
db.define_table('mytable',Field(registro.name, registro.type) for registro in registros)

tené en cuenta que podés remover el insert que hice e insertarlo manualmente
--

Sebastian Bassi

unread,
Aug 2, 2012, 2:13:35 PM8/2/12
to web2py-...@googlegroups.com
2012/8/2 Martín Mulone <mulone...@gmail.com>

No te compliqués: La variable registros que es una lista puede ser registros de una tabla, a medida que vos agregués registros a la tabla en cada request la define.


Creo que no entendes el problema o yo no entiendo lo que me decis.
El problema es poner varias tablas en runtime, no una sola. Si cada vez que el programa arranca mira el archivo models/db.py, de alguna manera tengo que poner todas las tablas en ese archivo.

Martín Mulone

unread,
Aug 2, 2012, 2:24:15 PM8/2/12
to web2py-...@googlegroups.com
si llamá tantas veces como quieras al define_table con los nombres y definiciones de las tablas que quieras.

sería agregar algo así además:

models/db.py

db.define_table('tablas', Field('name','string'))
db.tablas.insert(name='tabla1')
db.tablas.insert(name='tabla2')
for tabla in tablas:
    db.define_table(tabla.name, Field(registro.name, registro.type) for registro in registros)

#Claro que no tiene mucho sentido si definiciones no esta referenciando a tabla.
--

Javier Pepe

unread,
Aug 2, 2012, 2:24:37 PM8/2/12
to web2py-...@googlegroups.com
Sebastian

No es necesario que escribas el db.py, ya que la definición se esta realizando al leer los registros de la tabla.
Como explica Martin, eso se hace el ejecutar el db.py, pueden estar definidas en el archivo y otras tables vienen de leer las definiciones por medio de una consulta.
Vos podes armar una tabla con el nombre de las tablas que vas a generar y otra tabla con los campos que van en cada tabla, después recorriendo las tablas en la base, y los campos en el detalle vas a construir todas tus tablas, y cuando agregues o saques campos se van a actualizar directamente en los modelos y en la db.

Es cuestión de probar y ver que sale, si queres te puedo dar una mano.



2012/8/2 Sebastian Bassi <sba...@gmail.com>

Gustavo Hernández Delgado

unread,
Aug 2, 2012, 6:05:40 PM8/2/12
to web2py-...@googlegroups.com

Saludos a todos:

Tengo una funci�n ajax que realiza una consulta y devuelve un grupo de
registros. hasta ah� sin problemas, el problema aparece cuando trato de
limitar la cantidad de registros a devolver, en este caso no me devuelve
nada.

les pongo mi consulta:

rows=db(tit1).select(db.tabla1.campo1, db.tabla1.campo2) devuelve todo
seg�n la consulta (tit1)

rows=db(tit1).select(db.tabla1.campo1, db.tabla1.campo2,
limitby=(0,10)) No devuelve nada


alguna opini�n al respecto?

gracias

gustavo

Martín Mulone

unread,
Aug 3, 2012, 6:55:54 AM8/3/12
to web2py-...@googlegroups.com
extraño y que te muestra si hacés un print db._lastsql después de la sentencia.

El 2 de agosto de 2012 19:05, Gustavo Hernández Delgado <gustavo....@etecsa.cu> escribió:

Saludos a todos:

Tengo una función ajax que realiza una consulta y devuelve un grupo de registros. hasta ahí sin problemas, el problema aparece cuando trato de limitar la cantidad de registros a devolver, en este caso no me devuelve nada.

les pongo mi consulta:

rows=db(tit1).select(db.tabla1.campo1, db.tabla1.campo2) devuelve todo según la consulta (tit1)


rows=db(tit1).select(db.tabla1.campo1, db.tabla1.campo2, limitby=(0,10))  No devuelve nada


alguna opinión al respecto?

gracias

gustavo

---
This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at host imx2.etecsa.cu
Visit our web-site: <http://www.kaspersky.com>, <http://www.viruslist.com>




--

Gustavo Hernández Delgado

unread,
Aug 3, 2012, 10:26:36 AM8/3/12
to web2py-...@googlegroups.com
El 03/08/12 06:55, Martín Mulone escribió:
--- 
This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at host imx3.etecsa.cu

    
No muestra nada, es como si quedara mareado en la sentencia

saludos

Gustavo Hernández Delgado

unread,
Aug 7, 2012, 10:46:01 AM8/7/12
to web2py-...@googlegroups.com
El 03/08/12 10:26, Gustavo Hernández Delgado escribió:
Sobre el problema, está solucionado parcialmente o sea puse la opción orderby=... delante del limitby y así si me funciona, realmente este es un problema que me gustaría solucionar pues no es lo mismo ordenar 10000 registros para seleccionar 10 que seleccionar 10 y ordenar 10, estoy usando la versión 1.99.4 del 14/12/2011

saludos

gustavo

Federico Ferraro

unread,
Aug 7, 2012, 4:07:17 PM8/7/12
to web2py-...@googlegroups.com

Probaste con:
rows=db(tit1).select(db.tabla1.campo1, db.tabla1.campo2)[ :10]
Slds

Reply all
Reply to author
Forward
0 new messages