Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQLAlchemy 2.0 errors #118

Closed
lsmoker opened this issue Feb 2, 2023 · 10 comments
Closed

SQLAlchemy 2.0 errors #118

lsmoker opened this issue Feb 2, 2023 · 10 comments

Comments

@lsmoker
Copy link

lsmoker commented Feb 2, 2023

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)
@denmat-mwelch
Copy link

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

@lsmoker
Copy link
Author

lsmoker commented Feb 2, 2023

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

@denmat-mwelch
Copy link

try accessing it as person_record.last_name instead.

@lsmoker
Copy link
Author

lsmoker commented Feb 2, 2023

that works

@bimalkjha
Copy link
Member

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

@denmat-mwelch
Copy link

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

@bimalkjha bimalkjha reopened this Feb 7, 2023
@SimasJan
Copy link

SimasJan commented Feb 28, 2023

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

@bimalkjha
Copy link
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.

@anthobio23
Copy link

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

@bchoudhary6415
Copy link
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
Projects
None yet
Development

No branches or pull requests

6 participants