The explanation is really help. Especially to me, a newbie of web2py and 
even development.

On Tuesday, November 6, 2012 5:04:36 AM UTC+8, Niphlod wrote:
>
> in the "normal" way (i.e. a new Field(), with of course nothing set to 
> prevent migrations, such as migrate=False in the table def, migrate=False, 
> fake_migrate=False, migrate_enabled=False, fake_migrate_all=True in the 
> DAL, etc).
> There absolutely no problem on doing that.
> With the first error it seems that you added a Field but you didn't let 
> the table to migrate (i.e. web2py expected a column to be there already, 
> and it didn't find that)
> The second instead seems to point to a table that existed in the db and 
> was dropped manually (assuming that you defined the table 'source_via' and 
> you're trying to access it as 'source_via', your error seems like a typo 
> 'sourc_via' without the 'e').
>
> PS: let me explain for others stumbling on this post on how migrations 
> work. database/*.table files are there to "hold" the situation on the 
> current database status.
> With default settings (i.e., migrations turned on):
> - the database/ folder holds all the table definitions as they are on the 
> database (the *.table files)
> - whenever a request comes in and your db.py is executed, web2py "spots" 
> the differences between your .table files and the db.define_table() 
> statements (table files "holds a photography" on what was the model the 
> last time you executed db.py): if there are differencies (like a new 
> column, or a new table) the table is created on the db (check sql.log for 
> the statements used), and the .table file is updated to reflect what there 
> is in the db
>
> What happens if you set migrate=False in the table definition ? the check 
> between the model in db.py and the .table file is skipped, and web2py 
> assumes that on the db the table reflect exactly what there is in the model
>
> What happens if you set fake_migrate=True in the table definition ? web2py 
> assumes that on the db the table reflect exactly what there is in the 
> model, the .table files are recreated 
>
> What happens if you set fake_migrate_all=True in the DAL ? all .table 
> files are recreated, and web2py assumes that on the db the db tables are 
> reflecting the model.
>  
> What happens if you set migrate=False in the DAL? whatever table has no a 
> specific "migrate" parameter, the migrate=False is applied to every table
>
> This kind of errors can happen only if you messed with this logic, e.g.
> db.define_table('test', Field('test1'), migrate=True) #web2py create the 
> test table with the columns id and test1
>
>
> then
> db.define_table('test', Field('test1'), Field('test2'), 
> migrate=False,fake_migrate
> =True) # web2py assumes that you created manually on the db the column 
> test2, and updates the .table file
>
>
> then 
> db.define_table('test', Field('test1'), Field('test2')) # web2py sees no 
> change between the .table file and the model, but if there's not the column 
> on the db, when you try to use it you'll get the "no such column" error
>
>
>
> then you delete the 'test' .table file manually, then
> db.define_table('test', Field('test1'), Field('test2'), migrate=True) #web2py 
> assumes that the 'test' table is not on the db, because the corresponding 
> .table file is not there, so it tries to create it, and you get the error 
> "table 'test' already exists on the db"
>
>
>
> or, you delete the 'test' .table file manually, and drop the table 
> manually on the db then
> db.define_table('test', Field('test1'), migrate=False) #web2py assumes 
> that the table is already there, and when you try to use it you get the 
> error "table 'test' does not exist"
>
> PS: session.connect(db) where db is SQLite is bad on every possible level. 
> Everytime a session changes you won't be able to write to the database 
> (SQLite by default doesn't allow simultaneous writes). session.connect(db) 
> is there to allow several web2py instances on different machines to NOT 
> have the sessions/ folder shared among them (or when you don't have write 
> access to the disk), and to be used with "professional" db (postgres, 
> mssql, mysql, oracle, etc)
> Even better is to use memcached or redis for sessions, if you have those 
> available, or stick to cookie based sessions if your session data is little.
>
> PS2: what's wrong with default file-based sessions anyway? Unless you have 
> 100 concurrent requests AND ~40K separate sessions there is absolutely no 
> performance gain observable using other methods (db, redis, memcache, 
> cookies). The only "added feature" is being able to have separate web2py 
> instances on different servers without configuring a load balancer with 
> sticky sessions in front of those.
>

-- 
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/groups/opt_out.

Reply via email to