Skip to content

SQLAlchemy 2.0 errors #118

Closed
Closed

Description

@lsmoker

This package needs updates to be compatible with SQLAlchemy 2.0.

Here are some errors but there are probably more...

Traceback (most recent call last):
  File "/home/user/dev/project/main.py", line 21, in <module>
    ks_engine = create_engine(ks_uri)
  File "<string>", line 2, in create_engine
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 277, in warned
    return fn(*args, **kwargs)  # type: ignore[no-any-return]
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 556, in create_engine
    entrypoint = u._get_entrypoint()
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/engine/url.py", line 754, in _get_entrypoint
    cls = registry.load(name)
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 363, in load
    return impl.load()
  File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 171, in load
    module = import_module(match.group('module'))
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/ibm_db_sa/__init__.py", line 22, in <module>
    from . import ibm_db, pyodbc, base
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/ibm_db_sa/ibm_db.py", line 20, in <module>
    from .base import DB2ExecutionContext, DB2Dialect
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/ibm_db_sa/base.py", line 661, in <module>
    class DB2Dialect(default.DefaultDialect):
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/ibm_db_sa/base.py", line 674, in DB2Dialect
    returns_unicode_strings = sa_types.String.RETURNS_CONDITIONAL
AttributeError: type object 'String' has no attribute 'RETURNS_CONDITIONAL'
Traceback (most recent call last):
  File "/home/user/dev/project/main.py", line 21, in <module>
    ks_engine = create_engine(ks_uri)
  File "<string>", line 2, in create_engine
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 277, in warned
    return fn(*args, **kwargs)  # type: ignore[no-any-return]
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 556, in create_engine
    entrypoint = u._get_entrypoint()
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/engine/url.py", line 754, in _get_entrypoint
    cls = registry.load(name)
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 363, in load
    return impl.load()
  File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 171, in load
    module = import_module(match.group('module'))
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/ibm_db_sa/__init__.py", line 22, in <module>
    from . import ibm_db, pyodbc, base
  File "/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/ibm_db_sa/ibm_db.py", line 21, in <module>
    from sqlalchemy import processors, types as sa_types, util
ImportError: cannot import name 'processors' from 'sqlalchemy' (/home/user/.local/share/virtualenvs/project-QDj23CGR/lib/python3.10/site-packages/sqlalchemy/__init__.py)

Activity

  1. denmat-mwelch commented on Feb 2, 2023

    @denmat-mwelch

    This is what I did to get it working with sqlalchemy 2.0

    set returns_unicode_strings = True

    and changing _IBM_Numeric_ibm_db to

    class _IBM_Numeric_ibm_db(sa_types.Numeric):
        def result_processor(self, dialect, coltype):
            def to_float(value):
                if value is None:
                    return None
                else:
                    return float(value)
            if self.asdecimal:
                return None
            else:
                return to_float
  2. lsmoker commented on Feb 2, 2023

    @lsmoker
    Author

    One step closer.

    Now this error...

    Traceback (most recent call last):
      File "/home/user/dev/project/main.py", line 73, in <module>
        if person_record['last_name'] != member.properties['last_name']:
      File "lib/sqlalchemy/cyextension/resultproxy.pyx", line 67, in sqlalchemy.cyextension.resultproxy.BaseRow.__getitem__
    TypeError: tuple indices must be integers or slices, not str
    
  3. denmat-mwelch commented on Feb 2, 2023

    @denmat-mwelch

    try accessing it as person_record.last_name instead.

  4. lsmoker commented on Feb 2, 2023

    @lsmoker
    Author

    that works

  5. bimalkjha commented on Feb 6, 2023

    @bimalkjha
    Member

    Good that it is working now. Closing the issue. Thanks.

  6. denmat-mwelch commented on Feb 6, 2023

    @denmat-mwelch

    Good that it is working now. Closing the issue. Thanks.

    This hasn't actually been fixed. The library still needs to be updated, this is really only a temporary fix for people that need this working with SQLalchemy 2.0

  7. SimasJan commented on Feb 28, 2023

    @SimasJan

    Hello, chiming in on the error.

    Versions:

    pyreadstat.__version__='1.2.1'
    pd.__version__='1.3.4'
    sqlalchemy.__version__='2.0.4'
    ibm-db-sa.__version__='0.3.8'
    

    Create engine connection string:

    db2_engine = create_engine('ibm_db_sa://{username}:{password}@{hostname}:{port}/{database}'.format(
            username=DB_CREDS['username'],
            password=quote_plus(DB_CREDS['password']),
            hostname=DB_CREDS['host'],
            port=DB_CREDS['port'],
            database=DB_CREDS['database']
        ))
    

    Error stack trace:

    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    /usr/local/share/jupyter/kernels/python39/scripts/launch_ipykernel.py in <module>
          1 # create db2 engine
    ----> 2 db2_engine = create_engine('ibm_db_sa://{username}:{password}@{hostname}:{port}/{database}'.format(
          3         username=DB_CREDS['username'],
          4         password=quote_plus(DB_CREDS['password']),
          5         hostname=DB_CREDS['host'],
    
    <string> in create_engine(url, **kwargs)
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/sqlalchemy/util/deprecations.py in warned(fn, *args, **kwargs)
        275                         stacklevel=3,
        276                     )
    --> 277             return fn(*args, **kwargs)  # type: ignore[no-any-return]
        278 
        279         doc = fn.__doc__ is not None and fn.__doc__ or ""
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/sqlalchemy/engine/create.py in create_engine(url, **kwargs)
        554     u, plugins, kwargs = u._instantiate_plugins(kwargs)
        555 
    --> 556     entrypoint = u._get_entrypoint()
        557     _is_async = kwargs.pop("_is_async", False)
        558     if _is_async:
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/sqlalchemy/engine/url.py in _get_entrypoint(self)
        752         else:
        753             name = self.drivername.replace("+", ".")
    --> 754         cls = registry.load(name)
        755         # check for legacy dialects that
        756         # would return a module with 'dialect' as the
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/sqlalchemy/util/langhelpers.py in load(self, name)
        350     def load(self, name: str) -> Any:
        351         if name in self.impls:
    --> 352             return self.impls[name]()
        353 
        354         if self.auto_fn:
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/setuptools/_vendor/importlib_metadata/__init__.py in load(self)
        192         """
        193         match = self.pattern.match(self.value)
    --> 194         module = import_module(match.group('module'))
        195         attrs = filter(None, (match.group('attr') or '').split('.'))
        196         return functools.reduce(getattr, attrs, module)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/__init__.py in import_module(name, package)
        125                 break
        126             level += 1
    --> 127     return _bootstrap._gcd_import(name[level:], package, level)
        128 
        129 
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _gcd_import(name, package, level)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _find_and_load(name, import_)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _find_and_load_unlocked(name, import_)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _call_with_frames_removed(f, *args, **kwds)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _gcd_import(name, package, level)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _find_and_load(name, import_)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _find_and_load_unlocked(name, import_)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _load_unlocked(spec)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap_external.py in exec_module(self, module)
    
    /opt/ibm/conda/miniconda/lib/python3.9/importlib/_bootstrap.py in _call_with_frames_removed(f, *args, **kwds)
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/ibm_db_sa/__init__.py in <module>
         20 __version__ = '0.3.8'
         21 
    ---> 22 from . import ibm_db, pyodbc, base
         23 
         24 
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/ibm_db_sa/ibm_db.py in <module>
         18 # +--------------------------------------------------------------------------+
         19 
    ---> 20 from .base import DB2ExecutionContext, DB2Dialect
         21 from sqlalchemy import processors, types as sa_types, util
         22 from sqlalchemy import __version__ as SA_Version
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/ibm_db_sa/base.py in <module>
        659 
        660 
    --> 661 class DB2Dialect(default.DefaultDialect):
        662     name = 'ibm_db_sa'
        663     max_identifier_length = 128
    
    /opt/ibm/conda/miniconda/lib/python/site-packages/ibm_db_sa/base.py in DB2Dialect()
        672         returns_unicode_strings = False
        673     else:
    --> 674         returns_unicode_strings = sa_types.String.RETURNS_CONDITIONAL
        675     postfetch_lastrowid = True
        676     supports_sane_rowcount = True
    
    AttributeError: type object 'String' has no attribute 'RETURNS_CONDITIONAL'
    

    Any pointers on how to resolve it?
    p.s. this is while working on cp4d

  8. bimalkjha commented on Mar 16, 2023

    @bimalkjha
    Member

    @SimasJan ibm_db_sa do not support SQLAlchemy 2.0 yet. The documented version of SQLAlchemy is 1.4.x, so you need to downgrade your SQLAlchemy version. We are working on enhancement to support sqlalchemy 2.0 and once the support get released, you can use that. Thanks.

  9. anthobio23 commented on Mar 29, 2023

    @anthobio23

    @SimasJan can use SQLAlchemy==1.3.24 for ibm_db_sa version lastest

  10. bchoudhary6415 commented on Apr 13, 2023

    @bchoudhary6415
    Collaborator

    @lsmoker, @SimasJan and @denmat-mwelch The fix for this issue is given. Please verify through the latest PR - #124
    I'm closing this issue now.
    Thank you

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions