Background: web2py keeps track of database definitions using files in each 
app's ./databases directory.  The basic concept is, for each table 
definition a pickle file is created storing attributes defined in web2py / 
not necessarily defined in the database; and the name of each pickle file 
incorporates a hash based on the database URI + the table name, so one app 
can access multiple databases and not experience name collisions if tables 
with the same name occur in more than one database.  Seems like a good 
approach overall.

The only problem I've had with this approach is, the hash is based on the 
full URI, and therefore it changes when the user name and/or password for a 
database connection changes.  If you change a password, then you have to 
change the URI, and the "same" database will have a different hash, and the 
next time you run the app, web2py won't be able to identify the .table 
files for that DB, and you end up with a bunch of "Table already exists" 
errors and possibly a failed migration to clean up.  Changing passwords 
regularly is good practice, and in my case where we move code amon servers 
as a project moves from dev --> test --> stage --> prod, this changes 
fairly often.

Here's my solution to the problem:

0.  know that the hash is computed as hashlib.md5('uri string').hexdigest()
1.  get the old URI, run it through MD5 --> oldhash
2.  get the new URI, run it though MD5 --> newhash
3.  now assuming you are running bash ...
4.  cd /to/the/databases/folder
5.  for i in oldhash*.table; do j=`echo $i | sed 's/oldhash/newhash/g'`; cp 
"$i" "$j"; done

In other words, copy all existing .table files the name of which used the 
old hash, to use the new hash.

Two questions:

(1)  Do you have a better way to deal with this?

(2)  I wonder if a change to the current behavior would be better -- change 
the logic to build a hash using all of the URI except the password part? 
 Changing server or DB name feels like a real change to me; and in general 
changing just the user ID is too since the user may have different 
permissions, views etc. in the same database.  But changing just the 
password?  Should not change the underlying identity of the database 
connection or database object definitions.  (In my view of the world.) 
 What do you think?


Cheers
-- Chris

-- 



Reply via email to