I thought I would share some routines I find useful for backing up sqlite to dropbox I believe safely.
The nice thing about backing up to dropbox, is that the backup ends up on your local machine and so can be backed up more safely from there. First execute 'setup_dropbox'. This should only need to be done once per application. Then run copy_to_backup and finally backup_to_dropbox This copies storage.sqlite in what I believe is a safe way, it is easy to get a corrupted fileif you do not do it right like below. The file is copied to a backup directory def copy_database(): import os, sqlite3, shutil, time source=os.getcwd()+'/applications/'+request.application+'/databases/storage.sqlite' target_dir=os.getcwd()+'/applications/'+request.application+'/backup' db = sqlite3.connect (source) backupfile = os.path.join (target_dir, os.path.basename(source) + time.strftime(".%Y%m%d-%H%M") ) cur = db.cursor () cur.execute ('begin immediate') shutil.copyfile (source, backupfile) db.rollback() return dict() This routines zips files except any ending in '.sqlite', and copies them to the target directory def do_zip_except_sqlite(target_dir, file_name): import os, zipfile zip = zipfile.ZipFile(file_name, 'w', zipfile.ZIP_DEFLATED) rootlen = len(target_dir) + 1 print rootlen for base, dirs, files in os.walk(target_dir): print dir for file in files: if file.find('.sqlite',len(file)-7) ==-1: fn = os.path.join(base, file) zip.write(fn, fn[rootlen:]) zip.close() return dict() This uses both routines to copy the database files to the backup directory. It time stamps their names. def copy_to_backup(): import os, time base='applications/'+request.application backupfile = os.path.join (base, 'backup/databases.zip' + time.strftime(".%Y%m%d-%H%M") ) do_zip_except_sqlite(os.path.join(base,'databases'),backupfile) copy_database() return dict() This copies files from backup folder to dropbox.. It assumes the dropbox access token has been written to the file applications/my_app/dropbox_token.txt Writing it to this file means that permission only has to be given once per application. This seems appropriate for backing up. def backup_to_dropbox(): import os, zipfile from gluon import current from dropbox import client, rest, session token=current.session.token # Get your app key and secret from the Dropbox developer website APP_KEY = 'put_your_key_here' APP_SECRET = 'put_your_secret_here' ACCESS_TYPE = 'app_folder' token_file = 'applications/'+request.application+'/dropbox_token.txt' token_file = open(token_file) token_key,token_secret = token_file.read().split('|') token_file.close() sess = session.DropboxSession(APP_KEY,APP_SECRET, ACCESS_TYPE ) sess.set_token(token_key,token_secret) client = client.DropboxClient(sess) target_dir = 'applications/'+request.application+'/backup' rootlen = len(target_dir) + 1 for base, dirs, files in os.walk(target_dir): for file in files: f = open(target_dir+'/'+file) client.put_file('f1/'+file,f) f.close() return dict() To setup dropbox you need two routines. One to do the initial setting up, and one to 'redirect' to after the permission has been granted. def setup_dropbox(): from gluon import current # Include the Dropbox SDK libraries from dropbox import client, rest, session # Get your app key and secret from the Dropbox developer website APP_KEY = 'put_your_key_here' APP_SECRET ='put_your_secret_here' ACCESS_TYPE = 'app_folder' sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE) request_token = sess.obtain_request_token() url = sess.build_authorize_url(request_token, URL('finish_setup_dropbox', scheme=True, host=True)) current.session.token=(request_token.key,request_token.secret) TOKENS = 'applications/'+request.application+'/dropbox_tokenr.txt' token_file = open(TOKENS,'w') token_file.write("%s|%s" % (request_token.key,request_token.secret) ) token_file.close() redirect(url) return This routine catches the redirection after the permission has been given def finish_setup_dropbox(): from dropbox import client, rest, session APP_KEY = 'put_your_key_here' APP_SECRET = 'put_your_secret_here' ACCESS_TYPE = 'app_folder' sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE) request_token = sess.obtain_request_token() TOKENS = 'applications/'+request.application+'/dropbox_tokenr.txt' token_file = open(TOKENS) request_token.key,request_token.secret = token_file.read().split('|') token_file.close() access_token = sess.obtain_access_token(request_token) TOKENS = 'applications/'+request.application+'/dropbox_token.txt' token_file = open(TOKENS,'w') token_file.write("%s|%s" % (access_token.key,access_token.secret) ) token_file.close() client = client.DropboxClient(sess) # print "linked account:", client.account_info() return --