No Persistent Store Error

22 views
Skip to first unread message

Curtis Rae

unread,
Feb 24, 2016, 7:28:56 PM2/24/16
to Tethys Platform
I am installing the SFPT onto my computer and keep getting an error. No persistent store "settings_db" for app "erfp_tool". Make sure you register the persistent store in app.py and run "tethys syncstores erfp_tool". I get this error when I run any of the following commands: tethys manage syncdb, tethys syncstores erfp_tool and tethys syncstores -f erfp_tool. It does not create a database at all either. I am using the code straight from github so I don't think I have broken anything. Is there something I am missing? Here is the traceback.

Traceback (most recent call last):
  File "/usr/lib/tethys/src/manage.py", line 20, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
    utility.execute()
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/base.py", line 398, in execute
    self.check()
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/base.py", line 426, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/checks/registry.py", line 75, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 10, in check_url_config
    return check_resolver(resolver)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 19, in check_resolver
    for pattern in resolver.url_patterns:
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 417, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 410, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/usr/lib/tethys/src/tethys_portal/urls.py", line 61, in <module>
    url(r'^apps/', include('tethys_apps.urls')),
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 52, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/usr/lib/tethys/src/tethys_apps/urls.py", line 21, in <module>
    app_url_patterns = generate_app_url_patterns()
  File "/usr/lib/tethys/src/tethys_apps/utilities.py", line 57, in generate_app_url_patterns
    module = __import__(module_name, fromlist=[function_name])
  File "/usr/lib/tethys/src/tethys_apps/tethysapp/erfp_tool/controllers.py", line 14, in <module>
    from .model import (BaseLayer, DataStore, DataStoreType, Geoserver, MainSettings,
  File "/usr/lib/tethys/src/tethys_apps/tethysapp/erfp_tool/model.py", line 10, in <module>
    settingsEngine = app.get_persistent_store_engine('settings_db')
  File "/usr/lib/tethys/src/tethys_apps/base/app_base.py", line 425, in get_persistent_store_engine
    'and run "tethys syncstores {1}".'.format(persistent_store_name, app_name))
Traceback (most recent call last):
  File "/usr/lib/tethys/src/manage.py", line 20, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
    utility.execute()
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/base.py", line 398, in execute
    self.check()
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/management/base.py", line 426, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/checks/registry.py", line 75, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 10, in check_url_config
    return check_resolver(resolver)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 19, in check_resolver
    for pattern in resolver.url_patterns:
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 417, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 410, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/usr/lib/tethys/src/tethys_portal/urls.py", line 61, in <module>
    url(r'^apps/', include('tethys_apps.urls')),
  File "/usr/lib/tethys/local/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 52, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/usr/lib/tethys/src/tethys_apps/urls.py", line 21, in <module>
    app_url_patterns = generate_app_url_patterns()
  File "/usr/lib/tethys/src/tethys_apps/utilities.py", line 57, in generate_app_url_patterns
    module = __import__(module_name, fromlist=[function_name])
  File "/usr/lib/tethys/src/tethys_apps/tethysapp/erfp_tool/controllers.py", line 14, in <module>
    from .model import (BaseLayer, DataStore, DataStoreType, Geoserver, MainSettings,
  File "/usr/lib/tethys/src/tethys_apps/tethysapp/erfp_tool/model.py", line 10, in <module>
    settingsEngine = app.get_persistent_store_engine('settings_db')
  File "/usr/lib/tethys/src/tethys_apps/base/app_base.py", line 425, in get_persistent_store_engine
    'and run "tethys syncstores {1}".'.format(persistent_store_name, app_name))

alansnow21

unread,
Feb 24, 2016, 8:10:33 PM2/24/16
to Tethys Platform
Hi Curtis,

This is most likely your issue. In app.py:

Change
from tethys_apps.base import TethysAppBase, url_map_maker
from tethys_apps.base import PersistentStore
To
from tethys_sdk.base import TethysAppBase, url_map_maker
from tethys_sdk.stores import PersistentStore

alansnow21

unread,
Feb 24, 2016, 8:13:28 PM2/24/16
to Tethys Platform
Also, you can try:
tethys syncstores erfp_tool -r

swainn

unread,
Feb 25, 2016, 10:38:06 AM2/25/16
to Tethys Platform
Can you please post the contents of your model.py. I think I know what is happening, but I want to confirm.

swainn

unread,
Feb 25, 2016, 10:47:51 AM2/25/16
to Tethys Platform
Also, the contents of your app.py would be useful.

Curtis Rae

unread,
Feb 25, 2016, 2:20:38 PM2/25/16
to Tethys Platform
Here is my app.py

from tethys_apps.base import TethysAppBase, url_map_maker
from tethys_apps.stores import PersistentStore

class ECMWFRAPIDFloodPredictionTool(TethysAppBase):
    """
    Tethys app class for ECMWF-RAPID Flood Prediction Tool.
    """

    name = 'NFIE Hydro Explorer'
    index = 'erfp_tool:home'
    icon = 'erfp_tool/images/logo.png'
    package = 'erfp_tool'
    root_url = 'erfp-tool'
    color = '#34495e'
        
    def url_maps(self):
        """
        Add controllers
        """
        UrlMap = url_map_maker(self.root_url)

        url_maps = (UrlMap(name='home',
                           url='erfp-tool',
                           controller='erfp_tool.controllers.home'),
        .....
        ......
        return url_maps
        
    def persistent_stores(self):
        """
        Add one or more persistent stores
        """
        stores = (PersistentStore(name='settings_db',
                                  initializer='init_stores:init_erfp_settings_db',
                                  spatial=False
                ),
        )

        return stores 


And finally here is my model.py

# Put your persistent store models in this file
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Boolean, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker, backref
from uuid import uuid5, NAMESPACE_DNS
from datetime import datetime
# from .utilities import get_persistent_store_engine
from app import ECMWFRAPIDFloodPredictionTool as app
# DB Engine, sessionmaker and base
settingsEngine = app.get_persistent_store_engine('settings_db')
SettingsSessionMaker = sessionmaker(bind=settingsEngine)
Base = declarative_base()

class MainSettings(Base):
    '''
    Main Settings SQLAlchemy DB Model
    '''
    __tablename__ = 'main_settings'

    # Columns
    id = Column(Integer, primary_key=True)
    base_layer_id = Column(Integer,ForeignKey('base_layer.id'))
    base_layer = relationship("BaseLayer")
    default_group_id = Column(Integer,ForeignKey('watershed_group.id'))
    default_group = relationship('WatershedGroup', backref=backref('main_settings', cascade='save-update, merge, refresh-expire, expunge'))
    ecmwf_rapid_prediction_directory = Column(String)
    era_interim_rapid_directory = Column(String)
    wrf_hydro_rapid_prediction_directory = Column(String)
    app_instance_id = Column(String)

    def __init__(self, base_layer_id, ecmwf_rapid_prediction_directory, default_group_id,
                 era_interim_rapid_directory, wrf_hydro_rapid_prediction_directory):

        self.base_layer_id = base_layer_id
        self.default_group_id = default_group_id
        self.ecmwf_rapid_prediction_directory = ecmwf_rapid_prediction_directory
        self.era_interim_rapid_directory = era_interim_rapid_directory
        self.wrf_hydro_rapid_prediction_directory = wrf_hydro_rapid_prediction_directory
        self.app_instance_id = uuid5(NAMESPACE_DNS, '%s%s' % ("sfpt", datetime.now())).hex
        
class BaseLayer(Base):
    '''
    BaseLayer SQLAlchemy DB Model
    '''
    __tablename__ = 'base_layer'

    # Columns
    id = Column(Integer, primary_key=True)
    name = Column(String)
    api_key = Column(String)

    def __init__(self, name, api_key):
        self.name = name
        self.api_key = api_key

class DataStore(Base):
    '''
    DataStore SQLAlchemy DB Model
    '''
    __tablename__ = 'data_store'

    # Columns
    id = Column(Integer, primary_key=True)
    name = Column(String)
    data_store_type_id = Column(Integer,ForeignKey('data_store_type.id'))
    data_store_type = relationship("DataStoreType")
    api_endpoint = Column(String)
    api_key = Column(String)

    def __init__(self, server_name, data_store_type_id, api_endpoint, api_key):
        self.name = server_name
        self.data_store_type_id = data_store_type_id
        self.api_endpoint = api_endpoint
        self.api_key = api_key

class DataStoreType(Base):
    '''
    DataStoreType SQLAlchemy DB Model
    '''
    __tablename__ = 'data_store_type'

    # Columns
    id = Column(Integer, primary_key=True)
    code_name = Column(String)
    human_readable_name = Column(String)

    def __init__(self, code_name, human_readable_name):
        self.code_name = code_name
        self.human_readable_name = human_readable_name

class Geoserver(Base):
    '''
    Geoserver SQLAlchemy DB Model
    '''
    __tablename__ = 'geoserver'

    # Columns
    id = Column(Integer, primary_key=True)
    name = Column(String)
    url = Column(String)
    username = Column(String)
    password = Column(String)
    
    def __init__(self, name, url, username, password):
        self.name = name
        self.url = url
        self.username = username
        self.password = password

class Watershed(Base):
    '''
    Watershed SQLAlchemy DB Model
    '''
    __tablename__ = 'watershed'

    # Columns
    id = Column(Integer, primary_key=True)
    watershed_name = Column(String)
    subbasin_name = Column(String)
    folder_name = Column(String)
    file_name = Column(String)
    data_store_id = Column(Integer,ForeignKey('data_store.id'))
    data_store = relationship("DataStore")
    ecmwf_rapid_input_resource_id = Column(String)
    ecmwf_data_store_watershed_name = Column(String)
    ecmwf_data_store_subbasin_name = Column(String)
    wrf_hydro_data_store_watershed_name = Column(String)
    wrf_hydro_data_store_subbasin_name = Column(String)
    geoserver_id = Column(Integer,ForeignKey('geoserver.id'))
    geoserver = relationship("Geoserver")
    geoserver_drainage_line_layer = Column(String)
    geoserver_catchment_layer = Column(String)
    geoserver_gage_layer = Column(String)
    geoserver_ahps_station_layer = Column(String)
    geoserver_outline_layer = Column(String)
    geoserver_drainage_line_uploaded = Column(Boolean)
    geoserver_catchment_uploaded = Column(Boolean)
    geoserver_gage_uploaded = Column(Boolean)
    geoserver_ahps_station_uploaded = Column(Boolean)
    geoserver_outline_uploaded = Column(Boolean)
    kml_drainage_line_layer = Column(String)
    kml_catchment_layer = Column(String)
    kml_gage_layer = Column(String)
    watershed_groups = relationship("WatershedGroup", 
                                    secondary='watershed_watershed_group_link')
                              
    def __init__(self, watershed_name, subbasin_name, folder_name, file_name,
                 data_store_id, ecmwf_rapid_input_resource_id, 
                 ecmwf_data_store_watershed_name, ecmwf_data_store_subbasin_name,
                 wrf_hydro_data_store_watershed_name, wrf_hydro_data_store_subbasin_name,
                 geoserver_id, geoserver_drainage_line_layer, geoserver_catchment_layer, 
                 geoserver_gage_layer, geoserver_ahps_station_layer, geoserver_outline_layer,
                 geoserver_drainage_line_uploaded, geoserver_catchment_uploaded, 
                 geoserver_gage_uploaded, geoserver_ahps_station_uploaded, geoserver_outline_uploaded,
                 kml_drainage_line_layer, kml_catchment_layer, kml_gage_layer):

        self.watershed_name = watershed_name
        self.subbasin_name = subbasin_name
        self.folder_name = folder_name
        self.file_name = file_name
        self.data_store_id = data_store_id
        self.ecmwf_rapid_input_resource_id = ecmwf_rapid_input_resource_id
        self.ecmwf_data_store_watershed_name = ecmwf_data_store_watershed_name
        self.ecmwf_data_store_subbasin_name = ecmwf_data_store_subbasin_name
        self.wrf_hydro_data_store_watershed_name = wrf_hydro_data_store_watershed_name
        self.wrf_hydro_data_store_subbasin_name = wrf_hydro_data_store_subbasin_name
        self.geoserver_id = geoserver_id
        self.geoserver_drainage_line_layer = geoserver_drainage_line_layer
        self.geoserver_catchment_layer = geoserver_catchment_layer
        self.geoserver_gage_layer = geoserver_gage_layer
        self.geoserver_ahps_station_layer = geoserver_ahps_station_layer
        self.geoserver_outline_layer = geoserver_outline_layer
        self.geoserver_drainage_line_uploaded = geoserver_drainage_line_uploaded
        self.geoserver_catchment_uploaded = geoserver_catchment_uploaded
        self.geoserver_gage_uploaded = geoserver_gage_uploaded
        self.geoserver_ahps_station_uploaded = geoserver_ahps_station_uploaded
        self.geoserver_outline_uploaded = geoserver_outline_uploaded
        self.kml_drainage_line_layer = kml_drainage_line_layer
        self.kml_catchment_layer = kml_catchment_layer
        self.kml_gage_layer = kml_gage_layer

class WatershedWatershedGroupLink(Base):
    '''
    SQLAlchemy many-to-many link between watershed and watershed_group
    '''
    __tablename__ = 'watershed_watershed_group_link'
    watershed_group_id = Column(Integer, ForeignKey('watershed_group.id'), primary_key=True)
    watershed_id = Column(Integer, ForeignKey('watershed.id'), primary_key=True)

class WatershedGroup(Base):
    '''
    WatershedGroup SQLAlchemy DB Model
    '''
    __tablename__ = 'watershed_group'

    # Columns
    id = Column(Integer, primary_key=True)
    name = Column(String)
    watersheds = relationship("Watershed", 
                              secondary='watershed_watershed_group_link')

    def __init__(self, name):
        self.name = name


swainn

unread,
Feb 25, 2016, 4:20:10 PM2/25/16
to Tethys Platform
I think you may have a slightly outdated version of Tethys Platform. My guess is that you updated Tethys on this machine prior to the official release and missed a few updates. Try switching over to the master branch and pulling the latest:

$ cd /usr/lib/tethys/src
$ git checkout master
$ git pull
$ . /usr/lib/tethys/bin/activate
(tethys) $ pip install --update -r requirements.txt
(tethys) $ python setup.py develop

Curtis Rae

unread,
Feb 29, 2016, 10:04:08 AM2/29/16
to Tethys Platform
Yep! This was it! Weird....
Reply all
Reply to author
Forward
0 new messages