superset icon indicating copy to clipboard operation
superset copied to clipboard

Superset Unable to Save Database Configurations in Database

Open bmschow opened this issue 10 months ago • 2 comments

Bug description

We are running Superset via helm chart (version 0.12.9) and running aurora postgres on AWS as the database backend. In the UI we are able to successfully test a connection. However, when we click "Connect" we receive a "Fatal Error." When we check the pod, we get this stack trace:

Traceback (most recent call last):                                                                                                                                                                                                       │
│ superset   File "/app/superset/commands/database/create.py", line 99, in run                                                                                                                                                                      │
│ superset     db.session.commit()                                                                                                                                                                                                                  │
│ superset   File "<string>", line 2, in commit                                                                                                                                                                                                     │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1435, in commit                                                                                                                                         │
│ superset     self._transaction.commit(_to_root=self.future)                                                                                                                                                                                       │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 829, in commit                                                                                                                                          │
│ superset     self._prepare_impl()                                                                                                                                                                                                                 │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 808, in _prepare_impl                                                                                                                                   │
│ superset     self.session.flush()                                                                                                                                                                                                                 │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 3367, in flush                                                                                                                                          │
│ superset     self._flush(objects)                                                                                                                                                                                                                 │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 3506, in _flush                                                                                                                                         │
│ superset     with util.safe_reraise():                                                                                                                                                                                                            │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__                                                                                                                                    │
│ superset     compat.raise_(                                                                                                                                                                                                                       │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_                                                                                                                                          │
│ superset     raise exception                                                                                                                                                                                                                      │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 3467, in _flush                                                                                                                                         │
│ superset     flush_context.execute()                                                                                                                                                                                                              │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 456, in execute                                                                                                                                      │
│ superset     rec.execute(self)                                                                                                                                                                                                                    │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 630, in execute                                                                                                                                      │
│ superset     util.preloaded.orm_persistence.save_obj(                                                                                                                                                                                             │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj                                                                                                                                    │
│ superset     _emit_insert_statements(                                                                                                                                                                                                             │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 1238, in _emit_insert_statements                                                                                                                    │
│ superset     result = connection._execute_20(                                                                                                                                                                                                     │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1631, in _execute_20                                                                                                                                    │
│ superset     return meth(self, args_10style, kwargs_10style, execution_options)                                                                                                                                                                   │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/sql/elements.py", line 325, in _execute_on_connection                                                                                                                         │
│ superset     return connection._execute_clauseelement(                                                                                                                                                                                            │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1498, in _execute_clauseelement                                                                                                                         │
│ superset     ret = self._execute_context(                                                                                                                                                                                                         │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1725, in _execute_context                                                                                                                               │
│ superset     self._handle_dbapi_exception(                                                                                                                                                                                                        │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2043, in _handle_dbapi_exception                                                                                                                        │
│ superset     util.raise_(                                                                                                                                                                                                                         │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_                                                                                                                                          │
│ superset     raise exception                                                                                                                                                                                                                      │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1719, in _execute_context                                                                                                                               │
│ superset     context = constructor(                                                                                                                                                                                                               │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 1091, in _init_compiled                                                                                                                              │
│ superset     param = {                                                                                                                                                                                                                            │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 1092, in <dictcomp>                                                                                                                                  │
│ superset     key: processors[key](compiled_params[key])                                                                                                                                                                                           │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/sql/type_api.py", line 1631, in process                                                                                                                                       │
│ superset     return impl_processor(process_param(value, dialect))                                                                                                                                                                                 │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py", line 471, in process_bind_param                                                                                                     │
│ superset     value = super().process_bind_param(value=value, dialect=dialect)                                                                                                                                                                     │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py", line 397, in process_bind_param                                                                                                     │
│ superset     self._update_key()                                                                                                                                                                                                                   │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py", line 392, in _update_key                                                                                                            │
│ superset     self.engine._update_key(key)                                                                                                                                                                                                         │
│ superset   File "/usr/local/lib/python3.10/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py", line 52, in _update_key                                                                                                             │
│ superset     digest.update(key)                                                                                                                                                                                                                   │
│ superset sqlalchemy.exc.StatementError: (builtins.TypeError) argument 'data': a bytes-like object is required, not 'tuple'                                                                                                                        │
│ superset [SQL: INSERT INTO dbs (uuid, created_on, changed_on, verbose_name, database_name, sqlalchemy_uri, password, cache_timeout, select_as_create_table_as, expose_in_sqllab, configuration_method, allow_run_async, allow_file_upload, allow_ │
│ superset [parameters: [{'configuration_method': <ConfigurationMethod.DYNAMIC_FORM: 'dynamic_form'>, 'password': [redacted], 'sqlalchemy_uri': 'postgresql+psycop ... (213 characters truncated) ... ows_virtual_table_explore":true}' │
│ superset                                    

We have gotten this in helm chart installs locally as well (without AWS hosted dbs) and have confirmed that the user can insert into the dbs table. This behavior has been seen in attempting to create connections to both Redshift and Postgres databases.

How to reproduce the bug

Go to "Settings" -> "Database Connections" in the UI, then click on "+Database".

Fill out the form to connect to a database, test the connection then press "Connect". This is where the error pops up.

Screenshots/recordings

No response

Superset version

master / latest-dev

Python version

3.9

Node version

16

Browser

Chrome

Additional context

Traceback (most recent call last): │ │ superset File "/app/superset/commands/database/create.py", line 99, in run │ │ superset db.session.commit() │ │ superset File "", line 2, in commit │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1435, in commit │ │ superset self._transaction.commit(_to_root=self.future) │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 829, in commit │ │ superset self._prepare_impl() │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 808, in _prepare_impl │ │ superset self.session.flush() │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 3367, in flush │ │ superset self.flush(objects) │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 3506, in flush │ │ superset with util.safe_reraise(): │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in exit │ │ superset compat.raise( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise │ │ superset raise exception │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 3467, in _flush │ │ superset flush_context.execute() │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 456, in execute │ │ superset rec.execute(self) │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 630, in execute │ │ superset util.preloaded.orm_persistence.save_obj( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj │ │ superset _emit_insert_statements( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 1238, in _emit_insert_statements │ │ superset result = connection._execute_20( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1631, in _execute_20 │ │ superset return meth(self, args_10style, kwargs_10style, execution_options) │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/sql/elements.py", line 325, in _execute_on_connection │ │ superset return connection._execute_clauseelement( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1498, in _execute_clauseelement │ │ superset ret = self._execute_context( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1725, in _execute_context │ │ superset self.handle_dbapi_exception( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2043, in handle_dbapi_exception │ │ superset util.raise( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise │ │ superset raise exception │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1719, in _execute_context │ │ superset context = constructor( │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 1091, in _init_compiled │ │ superset param = { │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 1092, in │ │ superset key: processorskey │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy/sql/type_api.py", line 1631, in process │ │ superset return impl_processor(process_param(value, dialect)) │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py", line 471, in process_bind_param │ │ superset value = super().process_bind_param(value=value, dialect=dialect) │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py", line 397, in process_bind_param │ │ superset self._update_key() │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py", line 392, in _update_key │ │ superset self.engine._update_key(key) │ │ superset File "/usr/local/lib/python3.10/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py", line 52, in update_key │ │ superset digest.update(key) │ │ superset sqlalchemy.exc.StatementError: (builtins.TypeError) argument 'data': a bytes-like object is required, not 'tuple' │ │ superset [SQL: INSERT INTO dbs (uuid, created_on, changed_on, verbose_name, database_name, sqlalchemy_uri, password, cache_timeout, select_as_create_table_as, expose_in_sqllab, configuration_method, allow_run_async, allow_file_upload, allow │ │ superset [parameters: [{'configuration_method': <ConfigurationMethod.DYNAMIC_FORM: 'dynamic_form'>, 'password': [redacted], 'sqlalchemy_uri': 'postgresql+psycop ... (213 characters truncated) ... ows_virtual_table_explore":true}' │ │ superset

Checklist

  • [X] I have searched Superset docs and Slack and didn't find a solution to my problem.
  • [X] I have searched the GitHub issue tracker and didn't find a similar bug report.
  • [X] I have checked Superset's logs for errors and if I found a relevant Python stacktrace, I included it here as text in the "additional context" section.

bmschow avatar Apr 15 '24 22:04 bmschow