Thank you for your reply, Richard! " a normalized way to represent web2py list:reference field with a proper many-to-many relation table " - yes! this is what I meant, 'alias_name' - just very bad example of field name - it isn't about aliasing - sorry for the mess
About views I think I found the acceptable way (for me at least) that is: 1. Get query string by _select() 2. Search string and add aliases to fields (if required) 3. Wrap string in "CREATE VIEW ... AS ..." and create view at db level by db.executesql( ) 4. Define corresponding table for created view using db.some_table.any_field.clone(name = alias_for_some_table_any_field) all could be wrapped in the function( view_query, alias_map) Parsing sql string (item 2) is not a better way, but DAL doesn't support aliases for fields :( P.S. db.table.field.clone() - very useful function, but still undocumented On Friday, December 9, 2016 at 4:31:48 AM UTC+3, Richard wrote: > > Hello Val K, > > I am not sure I understand fully what your are talking about. On one hand, > I do understand that you would like a proper way to define SQL VIEW in > web2py and you propose to add a switch/flag/argument to define_table() to > do so, which would result in a select only table or something like that... > It could make sens, but I am not sure it would be accept base on my > experience it wouldn't pass as it seems a bit hacky and Massimo would not > implement it that way in DAL... Actually, I think there is no proper way to > implement view in DAL, and it a shame (we could have care more and answer > this need) that we don't have it... But you can define a view as a table in > web2py and use all the available feature regarding selection with this > "false" table (except create/read/update/delete obviously). You can also, > write a plain SQL SELECT and embeded it into a db.executesql() function. > Disavantage of the later method is that you can't access field with dot > notation db.table_name.field_name as web2py doesn't know about field and > even table name in this case, as db.executesql() return rows... > > On the other hand, I heard you talk about "storedin" field and aliasing > but I don't really understand to which common pratice you refer there... > Are you talking of a normalized way to represent web2py list:reference > field with a proper many-to-many relation table or are you talking about > something else? Which level of normalization are you trying to achieve with > aliasing and storedin... I don't understand what you refering to here. > > > Thanks > > Richard > > On Thu, Dec 8, 2016 at 5:49 PM, Val K <valq...@gmail.com <javascript:>> > wrote: > >> It doesn't differ from reference fields. it is about automation >> distributed transaction. >> Table 'person' hasn't Field('alias_name' ) at db level, it's fake Field >> with reverse reference declaration ( 'storedin alias_opt.alias_name' ) that >> defines table.field that would be really involved in CRUD-process of table >> 'person' >> >> On Wednesday, December 7, 2016 at 5:29:28 AM UTC+3, Dave S wrote: >>> >>> >>> On Tuesday, December 6, 2016 at 3:41:38 PM UTC-8, Richard wrote: >>>> >>>> UP, never get any answer... >>>> >>> >>> How would this differ from reference fields? >>> >>> /dps >>> >>> >>>> >>>> On Sat, Jan 23, 2016 at 4:08 PM, Val K <valq...@gmail.com> wrote: >>>> >>>>> Hi guys! >>>>> I have an idea to improve DAL in scope of work with normalized DB. >>>>> As known It's a common practice to avoid NULL value by creating >>>>> separate (option) table(s) to store non required fields. >>>>> So, it would be great to have a field type like "storedin >>>>> table_name.field_name" >>>>> For example: >>>>> >>>>> db.define_table('alias_opt', Field('name'), Field('alias_name', >>>>> 'reference >>>>> person')) >>>>> db.define_table('person', Field('name'), Field('alias_name', 'storedin >>>>> alias_opt.alias_name')) >>>>> >>>>> #INSERT: >>>>> db.person.insert(name='Alex', alias_name='Macedonian') >>>>> # means: >>>>> id=db.person.insert(name='Alex') >>>>> db.alias_opt.insert(id=id, alias_name='Macedonian') >>>>> >>>>> #UPDATE: >>>>> db(db.person.id==id).update(... , alias_name=None) >>>>> # means: >>>>> # update person >>>>> ... >>>>> # update option table >>>>> update_opt_args = filter_storedin_fields(update_args) >>>>> opt_rec = db.alias_opt(id) >>>>> opt_rec.update(update_opt_args) >>>>> if not any(opt_rec.values()): # - all fields of option table >>>>> record is None >>>>> del db.alias_opt(id) >>>>> else: >>>>> db.alias_opt.update_or_insert(id==id, **update_opt_args) >>>>> >>>>> >>>>> #DELETE: >>>>> del db.person(id) also means del db.alias_opt(id), like ondelete= >>>>> 'CASCADE' >>>>> >>>>> #SELECT: >>>>> rows = db(db.person).select() >>>>> # means: >>>>> rows = db(db.person).select( left=[ db.alias_opt.on( db.alias_opt.id >>>>> == db.person.id ) ] ) >>>>> but only "storedin" fields should be selected from db.alis_opt >>>>> and they should be accessed by row.alias_name (not only by row. >>>>> joined_table.field_name ) >>>>> >>>>> Considering, that table person could be a VIEW (i.e. JOIN is already >>>>> performed at DB level), there is no need to make join at web2py level, >>>>> it could be fixed by passing an option arg like is_view=True to >>>>> define_table() >>>>> I know, that behavior of insert/update/delete could be easy realized >>>>> by custom class based on Table >>>>> with a little hacking Field-class to intercept field type to fix it to >>>>> web2py type ( considering person.alias_name.type == >>>>> alias_opt.alias_name.type ). >>>>> But it's hard for me to change select() behavior, because there is >>>>> only common_filter, but there isn't common_join/common_left with >>>>> providing of maping (aliasing) joined table fields to 'storedin' >>>>> fields. >>>>> >>>>> In fact, I dream of common_join depends on discriminator field, that >>>>> will switch tables to be joined depend on discriminator value specified >>>>> in >>>>> the query (something like db.object.type_id==type_id), >>>>> if descriminator is not specified or couldn't be resolved at web2py >>>>> level, it performs left join all tables (from a list containing possible >>>>> common_join tables) >>>>> >>>>> P.S. May be I try to reinvent the wheel, so feel free to shoot me! >>>>> >>>>> -- >>>>> Resources: >>>>> - http://web2py.com >>>>> - http://web2py.com/book (Documentation) >>>>> - http://github.com/web2py/web2py (Source code) >>>>> - https://code.google.com/p/web2py/issues/list (Report Issues) >>>>> --- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "web2py-users" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to web2py+un...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >> Resources: >> - http://web2py.com >> - http://web2py.com/book (Documentation) >> - http://github.com/web2py/web2py (Source code) >> - https://code.google.com/p/web2py/issues/list (Report Issues) >> --- >> You received this message because you are subscribed to the Google Groups >> "web2py-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to web2py+un...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.