Skip to content

TypeError: __init__() got multiple values for argument 'cache_key' #91

Open
@jasheldo

Description

@jasheldo

After upgrading to sqlalchemy.__version__>=1.4.0, I've been receiving the title error.

Prior to version 1.4.0, the following would work as expected.

import os
import urllib

from sqlalchemy import create_engine

def create_connection():
    user = os.environ['USER']
    passwd = ***
    server = SERVER
    scheme = 'teradatasql'
    netloc = f'{user}:{passwd}@{server}'
    path = '/'
    query = 'logmech=LDAP&encryptdata=true'
    url = (scheme, netloc, path, '', query, '')
    cnxn_str = urllib.parse.urlunparse(url)
    engine = create_engine(cnxn_str)
    return engine

engine = create_connection()

sql = "SELECT TOP 10 * FROM SCHEMA.TABLE"
with engine.connect() as cnxn:
    data = cnxn.execute(sql).fetchall()

I'm now met with the following StackTrace:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~/test_sqlalchemy/sqlalchemy_test.py in 
      26 sql = "SELECT TOP 10 * FROM SCHEMA.TABLE"
----> 27 with engine.connect() as cnxn:
      28     data = cnxn.execute(sql).fetchall()
      29 
      30 data

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/engine/base.py in connect(self, close_with_result)
   3065         """
   3066 
-> 3067         return self._connection_cls(self, close_with_result=close_with_result)
   3068 
   3069     @util.deprecated(

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/engine/base.py in __init__(self, engine, connection, close_with_result, _branch_from, _execution_options, _dispatch, _has_events)
     89                 connection
     90                 if connection is not None
---> 91                 else engine.raw_connection()
     92             )
     93 

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/engine/base.py in raw_connection(self, _connection)
   3144 
   3145         """
-> 3146         return self._wrap_pool_connect(self.pool.connect, _connection)
   3147 
   3148 

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/engine/base.py in _wrap_pool_connect(self, fn, connection)
   3111         dialect = self.dialect
   3112         try:
-> 3113             return fn()
   3114         except dialect.dbapi.Error as e:
   3115             if connection is None:

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/pool/impl.py in connect(self)
    381                 return rec._checkout_existing()
    382 
--> 383         return _ConnectionFairy._checkout(self, self._fairy)
    384 
    385     def _return_conn(self, record):

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/pool/base.py in _checkout(cls, pool, threadconns, fairy)
    746     def _checkout(cls, pool, threadconns=None, fairy=None):
    747         if not fairy:
--> 748             fairy = _ConnectionRecord.checkout(pool)
    749 
    750             fairy._pool = pool

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/pool/base.py in checkout(cls, pool)
    417     @classmethod
    418     def checkout(cls, pool):
--> 419         rec = pool._do_get()
    420         try:
    421             dbapi_connection = rec.get_connection()

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/pool/impl.py in _do_get(self)
    363         except AttributeError:
    364             pass
--> 365         c = self._create_connection()
    366         self._conn.current = weakref.ref(c)
    367         if len(self._all_conns) >= self.size:

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/pool/base.py in _create_connection(self)
    245         """Called by subclasses to create a new ConnectionRecord."""
    246 
--> 247         return _ConnectionRecord(self)
    248 
    249     def _invalidate(self, connection, exception=None, _checkin=True):

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/pool/base.py in __init__(self, pool, connect)
    360         self.__pool = pool
    361         if connect:
--> 362             self.__connect(first_connect_check=True)
    363         self.finalize_callback = deque()
    364 

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/pool/base.py in __connect(self, first_connect_check)
    603                 ).exec_once_unless_exception(self.connection, self)
    604             if pool.dispatch.connect:
--> 605                 pool.dispatch.connect(self.connection, self)
    606 
    607 

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/event/attr.py in __call__(self, *args, **kw)
    318             fn(*args, **kw)
    319         for fn in self.listeners:
--> 320             fn(*args, **kw)
    321 
    322     def __len__(self):

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py in go(*arg, **kw)
   1640             once_fn = once.pop()
   1641             try:
-> 1642                 return once_fn(*arg, **kw)
   1643             except:
   1644                 if retry_on_exception:

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/engine/create.py in first_connect(dbapi_connection, connection_record)
    668 
    669             try:
--> 670                 dialect.initialize(c)
    671             finally:
    672                 dialect.do_rollback(c.connection)

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/engine/default.py in initialize(self, connection)
    356     def initialize(self, connection):
    357         try:
--> 358             self.server_version_info = self._get_server_version_info(
    359                 connection
    360             )

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/teradatasqlalchemy/dialect.py in _get_server_version_info(self, connection, **kw)
    959                 where(text('InfoKey=\'VERSION\''))
    960 
--> 961         res = connection.execute(stmt).scalar()
    962         return res
    963 

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/engine/base.py in execute(self, statement, *multiparams, **params)
   1198             )
   1199         else:
-> 1200             return meth(self, multiparams, params, _EMPTY_EXECUTION_OPTS)
   1201 
   1202     def _execute_function(self, func, multiparams, params, execution_options):

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/sql/elements.py in _execute_on_connection(self, connection, multiparams, params, execution_options)
    311     ):
    312         if self.supports_execution:
--> 313             return connection._execute_clauseelement(
    314                 self, multiparams, params, execution_options
    315             )

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/engine/base.py in _execute_clauseelement(self, elem, multiparams, params, execution_options)
   1379         )
   1380 
-> 1381         compiled_sql, extracted_params, cache_hit = elem._compile_w_cache(
   1382             dialect=dialect,
   1383             compiled_cache=compiled_cache,

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/sql/elements.py in _compile_w_cache(self, dialect, compiled_cache, column_keys, for_executemany, schema_translate_map, **kw)
    531             if compiled_sql is None:
    532                 cache_hit = dialect.CACHE_MISS
--> 533                 compiled_sql = self._compiler(
    534                     dialect,
    535                     cache_key=elem_cache_key,

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/sqlalchemy/sql/elements.py in _compiler(self, dialect, **kw)
    564         Dialect."""
    565 
--> 566         return dialect.statement_compiler(dialect, self, **kw)
    567 
    568     def __str__(self):

~/.local/share/virtualenvs/test_sqlalchemy-l7yAJfC_/lib/python3.9/site-packages/teradatasqlalchemy/dialect.py in __init__(self, dialect, statement, column_keys, inline, **kwargs)
     81 
     82     def __init__(self, dialect, statement, column_keys=None, inline=False, **kwargs):
---> 83         super(TeradataCompiler, self).__init__(dialect, statement, column_keys, inline, **kwargs)
     84 
     85     def get_select_precolumns(self, select, **kwargs):

TypeError: __init__() got multiple values for argument 'cache_key'

Here's my full environment for reference. Per @zzzeek, this is a Teradata issue.

Package            Version
------------------ ----------
appnope            0.1.2
backcall           0.2.0
decorator          4.4.2
greenlet           1.0.0
ipykernel          5.5.0
ipython            7.21.0
ipython-genutils   0.2.0
jedi               0.18.0
jupyter-client     6.1.12
jupyter-core       4.7.1
parso              0.8.1
pexpect            4.8.0
pickleshare        0.7.5
pip                21.0.1
prompt-toolkit     3.0.17
ptyprocess         0.7.0
pycryptodome       3.10.1
Pygments           2.8.1
python-dateutil    2.8.1
pyzmq              22.0.3
setuptools         53.0.0
six                1.15.0
SQLAlchemy         1.4.1
teradata           15.10.0.21
teradatasql        17.0.0.8
teradatasqlalchemy 17.0.0.0
tornado            6.1
traitlets          5.0.5
wcwidth            0.2.5
wheel              0.36.2

The issue I opened and close this AM, along with @zzzeek's suggested fix is here.

Metadata

Metadata

Assignees

No one assigned

    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