I uploaded a local application to my DigitalOcean droplet and have been having a nightmare of a time with the databases. I get this variety of errors on various pages:
*Error 1:* Traceback (most recent call last): File "/home/murtyjones/app/gluon/restricted.py", line 227, in restricted exec ccode in environment File "/home/murtyjones/app/applications/nolabills/controllers/default.py" <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, line 230, in <module> File "/home/murtyjones/app/gluon/globals.py", line 417, in <lambda> self._caller = lambda f: f() File "/home/murtyjones/app/gluon/tools.py", line 4241, in f return action(*a, **b) File "/home/murtyjones/app/applications/nolabills/controllers/default.py" <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, line 73, in dashboard data_requests = SQLFORM.grid(db(db.data_requests.company==auth.user.company), File "/home/murtyjones/app/gluon/packages/dal/pydal/objects.py", line 91, in __getattr__ raise AttributeError AttributeError *Error 2 (trying to apply changes as a user to own profile):* Traceback (most recent call last): File "/home/murtyjones/app/gluon/restricted.py", line 227, in restricted exec ccode in environment File "/home/murtyjones/app/applications/nolabills/controllers/default.py" <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, line 230, in <module> File "/home/murtyjones/app/gluon/globals.py", line 417, in <lambda> self._caller = lambda f: f() File "/home/murtyjones/app/applications/nolabills/controllers/default.py" <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, line 211, in user return dict(form=auth()) File "/home/murtyjones/app/gluon/tools.py", line 1941, in __call__ return getattr(self, args[0])() File "/home/murtyjones/app/gluon/tools.py", line 4026, in profile hideerror=self.settings.hideerror): File "/home/murtyjones/app/gluon/sqlhtml.py", line 1744, in accepts self.id_field_name]).update(**fields) File "/home/murtyjones/app/gluon/packages/dal/pydal/objects.py", line 2041, in update ret = db._adapter.update("%s" % table._tablename, self.query, fields) File "/home/murtyjones/app/gluon/packages/dal/pydal/adapters/base.py", line 519, in update raise e OperationalError: attempt to write a readonly database *Error 3 (trying to logout as a user):* Traceback (most recent call last): File "/home/murtyjones/app/gluon/restricted.py", line 227, in restricted exec ccode in environment File "/home/murtyjones/app/applications/nolabills/controllers/default.py" <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, line 230, in <module> File "/home/murtyjones/app/gluon/globals.py", line 417, in <lambda> self._caller = lambda f: f() File "/home/murtyjones/app/applications/nolabills/controllers/default.py" <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, line 211, in user return dict(form=auth()) File "/home/murtyjones/app/gluon/tools.py", line 1941, in __call__ return getattr(self, args[0])() File "/home/murtyjones/app/gluon/tools.py", line 3235, in logout self.log_event(log, self.user) File "/home/murtyjones/app/gluon/tools.py", line 2530, in log_event self.table_event().insert(description=str(description % vars), origin=origin, user_id=user_id) File "/home/murtyjones/app/gluon/packages/dal/pydal/objects.py", line 740, in insert ret = self._db._adapter.insert(self, self._listify(fields)) File "/home/murtyjones/app/gluon/packages/dal/pydal/adapters/base.py", line 482, in insert raise e IntegrityError: FOREIGN KEY constraint failed *db.py* ## app configuration made easy. Look inside private/appconfig.ini from gluon.contrib.appconfig import AppConfig ## import current for current.db = db line from gluon import current ## once in production, remove reload=True to gain full speed myconf = AppConfig(reload=True) ## if NOT running on Google App Engine use SQLite or other DB db = DAL(myconf.take('db.uri'), pool_size=myconf.take('db.pool_size', cast=int), migrate_enabled = myconf.get('db.migrate'), check_reserved=['all']) ## define current.db for module usage current.db = db ## by default give a view/generic.extension to all actions from localhost ## none otherwise. a pattern can be 'controller/function.extension' response.generic_patterns = ['*'] if request.is_local else [] ## choose a style for forms response.formstyle = myconf.take('forms.formstyle') # or 'bootstrap3_stacked' or 'bootstrap2' or other response.form_label_separator = myconf.take('forms.separator') from gluon.tools import Auth, Service, PluginManager auth = Auth(db) service = Service() plugins = PluginManager() auth.settings.extra_fields['auth_user']= [ Field('company'), ] ## create all tables needed by auth if not custom tables auth.define_tables(username=False, signature=False, migrate=True, fake_migrate=True) ## configure email mail = auth.settings.mailer mail.settings.server = 'smtp.gmail.com' mail.settings.sender = 'em...@gmail.com' mail.settings.login = 'em...@gmail.com:password' ## configure auth policy auth.settings.registration_requires_verification = True auth.settings.registration_requires_approval = True auth.settings.reset_password_requires_verification = True ## after defining tables, uncomment below to enable auditing # auth.enable_record_versioning(db) ## create list of companies for which this is available db.define_table('company_info', Field('name'), Field('street_address'), ) ## create a table for the queue of not yet fulfilled data requests db.define_table('data_requests', Field('first_name'), Field('last_name'), Field('entergy_username'), Field('entergy_password'), Field('email'), Field('company'), Field('status', default='QUEUED'), Field('runs', 'integer', default=0), Field('bill_1', 'upload', uploadfield='bill_1_file'), Field('bill_1_file', 'blob'), ) ## create a table for generating tokens db.define_table('tokens', Field('first_name'), Field('last_name'), Field('email'), Field('company'), Field('token'), Field('submitted', default=False), ) *sql.log* timestamp: 2016-06-15T14:20:52.811948 CREATE TABLE auth_user( id INTEGER PRIMARY KEY AUTOINCREMENT, first_name CHAR(128), last_name CHAR(128), email CHAR(512), password CHAR(512), registration_key CHAR(512), reset_password_key CHAR(512), registration_id CHAR(512) ); success! timestamp: 2016-06-15T14:20:52.856816 CREATE TABLE auth_group( id INTEGER PRIMARY KEY AUTOINCREMENT, role CHAR(512), description TEXT ); success! timestamp: 2016-06-15T14:20:52.899975 CREATE TABLE auth_membership( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE , group_id INTEGER REFERENCES auth_group (id) ON DELETE CASCADE ); success! timestamp: 2016-06-15T14:20:53.040386 CREATE TABLE auth_permission( id INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER REFERENCES auth_group (id) ON DELETE CASCADE , name CHAR(512), table_name CHAR(512), record_id INTEGER ); success! timestamp: 2016-06-15T14:20:53.092848 CREATE TABLE auth_event( id INTEGER PRIMARY KEY AUTOINCREMENT, time_stamp TIMESTAMP, client_ip CHAR(512), user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE , origin CHAR(512), description TEXT ); success! timestamp: 2016-06-15T14:20:53.223004 CREATE TABLE auth_cas( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE , created_on TIMESTAMP, service CHAR(512), ticket CHAR(512), renew CHAR(1) ); success! timestamp: 2016-06-15T14:22:53.166163 ALTER TABLE auth_user ADD company CHAR(512); success! timestamp: 2016-06-15T14:22:53.554653 CREATE TABLE company_info( id INTEGER PRIMARY KEY AUTOINCREMENT, name CHAR(512), street_address CHAR(512) ); success! timestamp: 2016-06-15T14:22:53.604055 CREATE TABLE data_requests( id INTEGER PRIMARY KEY AUTOINCREMENT, first_name CHAR(512), last_name CHAR(512), entergy_username CHAR(512), entergy_password CHAR(512), email CHAR(512), company CHAR(512), status CHAR(512), runs INTEGER, bill_1 CHAR(512), bill_1_file BLOB ); success! timestamp: 2016-06-15T14:22:53.645905 CREATE TABLE tokens( id INTEGER PRIMARY KEY AUTOINCREMENT, first_name CHAR(512), last_name CHAR(512), email CHAR(512), company CHAR(512), token CHAR(512), submitted CHAR(512) ); success! timestamp: 2016-06-15T14:22:56.435830 CREATE TABLE scheduler_task( id INTEGER PRIMARY KEY AUTOINCREMENT, application_name CHAR(512), task_name CHAR(512), group_name CHAR(512), status CHAR(512), function_name CHAR(512), uuid CHAR(255) UNIQUE, args TEXT, vars TEXT, enabled CHAR(1), start_time TIMESTAMP, next_run_time TIMESTAMP, stop_time TIMESTAMP, repeats INTEGER, retry_failed INTEGER, period INTEGER, prevent_drift CHAR(1), timeout INTEGER, sync_output INTEGER, times_run INTEGER, times_failed INTEGER, last_run_time TIMESTAMP, assigned_worker_name CHAR(512) ); success! timestamp: 2016-06-15T14:22:56.501649 CREATE TABLE scheduler_run( id INTEGER PRIMARY KEY AUTOINCREMENT, task_id INTEGER REFERENCES scheduler_task (id) ON DELETE CASCADE , status CHAR(512), start_time TIMESTAMP, stop_time TIMESTAMP, run_output TEXT, run_result TEXT, traceback TEXT, worker_name CHAR(512) ); success! timestamp: 2016-06-15T14:22:56.546304 CREATE TABLE scheduler_worker( id INTEGER PRIMARY KEY AUTOINCREMENT, worker_name CHAR(255) UNIQUE, first_heartbeat TIMESTAMP, last_heartbeat TIMESTAMP, status CHAR(512), is_ticker CHAR(1), group_names TEXT, worker_stats TEXT ); success! timestamp: 2016-06-15T14:22:56.589493 CREATE TABLE scheduler_task_deps( id INTEGER PRIMARY KEY AUTOINCREMENT, job_name CHAR(512), task_parent INTEGER, task_child INTEGER REFERENCES scheduler_task (id) ON DELETE CASCADE , can_visit CHAR(1) ); success! No idea where to even start with this and would appreciate help. -- 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.