Skip to content

user and password are required even with sqlalchemy_url configured #124

@holly-evans

Description

@holly-evans

Describe the bug
The target docs say it accepts sqlalchemy_url which will override the other connection details but user and password are still required to run the tap.

sqlalchemy_url [env: TARGET_REDSHIFT__LOCALDEV_SQLALCHEMY_URL]
Sqlalchemy URL: SQLAlchemy connection string. This will override using host, user, password, port, dialect, and all ssl settings. Note that you must escape password special characters properly. See https://docs.sqlalchemy.org/en/20/core/engines.html#escaping-special-characters-such-as-signs-in-passwords

To Reproduce

  1. Configure the target with sqlalchemy_url
  2. Run the target (I used tap-postgres and meltano el)
  3. Load fails with KeyError for user

Expected behavior
Target uses credentials from sqlalchemy_url

Additional context
Traceback:

 Traceback (most recent call last):
   File "/project/.meltano/loaders/target-redshift/venv/bin/target-redshift", line 8, in <module>
     sys.exit(TargetRedshift.cli())
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/click/core.py", line 1157, in __call__
     return self.main(*args, **kwargs)
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/click/core.py", line 1078, in main
     rv = self.invoke(ctx)     
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/singer_sdk/plugin_base.py", line 80, in invoke
     return super().invoke(ctx)
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/click/core.py", line 1434, in invoke
     return ctx.invoke(self.callback, **ctx.params)
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/click/core.py", line 783, in invoke
     return __callback(*args, **kwargs)
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/singer_sdk/target_base.py", line 571, in invoke
     target.listen(file_input) 
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/singer_sdk/_singerlib/encoding/_base.py", line 48, in listen
     self._process_lines(file_input or self.default_input)
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/singer_sdk/target_base.py", line 307, in _process_lines
     counter = super()._process_lines(file_input)
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/singer_sdk/_singerlib/encoding/_base.py", line 67, in _process_lines
     self._process_schema_message(line_dict)
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/singer_sdk/target_base.py", line 422, in _process_schema_message
     _ = self.get_sink(        
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/singer_sdk/target_base.py", line 796, in get_sink
     return self.add_sqlsink(stream_name, schema, key_properties)
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/singer_sdk/target_base.py", line 730, in add_sqlsink
     sink.setup()              
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/target_redshift/sinks.py", line 77, in setup
     with self.connector._connect_cursor() as cursor:
   File "/usr/local/lib/python3.9/contextlib.py", line 119, in __enter__
     return next(self.gen)     
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/target_redshift/connector.py", line 62, in _connect_cursor
     user, password = self.get_credentials()
   File "/project/.meltano/loaders/target-redshift/venv/lib/python3.9/site-packages/target_redshift/connector.py", line 521, in get_credentials
     return self.config["user"], self.config["password"]
 KeyError: 'user'

I believe this is happening because _connect_cursor is using get_credentials directly, but sqlalchemy_url is only used in get_sqlalchemy_url.

user, password = self.get_credentials()

if config.get("sqlalchemy_url"):

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions