the configman option, `database_class` already is a contextmanager.  You don't need this method at all.  In your ```__init__``` method, instantiate the class (it won't connect until you ask for a connection) and save as an attribute:

```   self._database = config.database.database_class(config)```

Then later when you want to use it, you can do this:

```    with self._database() as conn:
           return bool(
               single_value_sql(
                   conn, 
                   "SELECT COUNT(*) FROM crontabber"
               )
           )
```

Alternatively,  you've got a transaction class instance sitting in configuration, too.  You could use it to make the code even simpler:

in the ```__init__``` method:

```    self._database = config.database.database_class(config)
       self._transaction = config.transaction_executor_class(config, self._database)
```

then ```has_data``` could be:

```    def has_data(self):
           return bool(
               self._transaction(
                   single_value_sql,
                   "SELECT COUNT(*) FROM crontabber"
               )
           )
```
Writing it like that gives you automatic retry behavior if you want it.  Further, it handles all your connect/disconnect automatically.