I reviewed it! There is nothing special in Field(...,'id').

All tables must have a field of type 'id' with two exceptions:
- if you do not specify one, one is created automatically and called
'id' as the type (Field('id','id'), the default)

- legacy database can have more complex keys (Denes' keyed tables) and
they do not need an 'id' field (so far works only for mssql and ingres
I think).

Massimo

On Dec 11, 10:03 am, Yarko Tymciurak <resultsinsoftw...@gmail.com>
wrote:
> On Dec 11, 12:41 am, Brian M <bmere...@gmail.com> wrote:
>
> > t.staid could be the primary key as far as the database is concerned.
> > The issue is that web2py expects the primary key field to be called
> > ID.
>
> > I'd give Massimo's suggestion of db.define_table(...Field
> > ('staid','id'),...) a shot - he's the man, so he ought to know.
>
> > Massimo - what exactly does Field('staid','id') do? Is that just
> > telling web2py that field staid should be treated as the ID field? Is
> > 'id' now a valid fieldtype just like 'string' or 'integer'?
>
> This is probably another example where we would have benefitted from a
> code review / design review.
>
> "Field()" is constructor (manual, p.153), and used to define table
> fields within the define_table  constructor (the way that has been
> web2py/DAL, in one form or another, "forever").
>
> This is perhaps the first "special" form of "Field()", and the first
> one to define default behavior of the "ID" field (which is why it is
> natural at first blush to use the "Field()" constructor for this, but
> as we see from this thread it is not intuitive, and can confuse by
> virtue of a new, "special" form of a heretofore clear constructor).
>
> define_table() has a special first parameter, which is the table name,
> and an additional parameter which defines "special" table _behavior_,
> that is  "migrate=some_value".
>
> Probably a better form for this particular change in default behavior
> would have been something like:  id='stiad'
>
> Having an attribute of table called "id", once you look at the code,
> shows all the places that the "magic field" (literal)  "id" exists,
> and should be replaced by an attribute (with default of  id='id';  but
> I digress...
>
> I think, for define_table, a parameter of the form:   id='staid'
>
> would be both easier to explain (changes some default behavior of the
> table, just as migrate does), more consistent with the historical
> implementation, and at the same time would give the added benefit of
> showing up a common, and problematic coding style w/in  gluon of using
> FNMs  ("flaming magic numbers" - that is, a repetitive constant value
> where a symboic value would make the code both more readable, and more
> maintainable).
>
> - Yarko
>
>
>
> > ~Brian
>
> > On Dec 10, 6:50 pm, Tim Michelsen <timmichel...@gmx-topmail.de> wrote:
>
> > > > You can tell your model the path to the existing sqlite database file
> > > > with something like
>
> > > [...]
>
> > > Thanks a lot for your verbose help! I really appreciate it.
>
> > > > As for telling it which existing field to use as the ID, as DenesL
> > > > pointed out if the field isn't already named ID I don't think you can
> > > > at the moment.
>
> > > > If you really want to use the station number (t.staid) as your ID, why
> > > > not just add a new field called ID to your existing table (using
> > > > sqlite-browser) and then set the value to match t.staid? Something
> > > > like
>
> > > I am not a database guru. So I still do not understand why t.staid could
> > > not be the PK (= ID).
>
> > > Regards,
> > > Timmie
>
>

--

You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web...@googlegroups.com.
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en.


Reply via email to