######################################################################
Traceback (most recent call last):
  File "/data/projects/Python/database/sqlalchemy/sqlalchemy_oracle.py", 
line 45, in <module>
    df = pd.read_sql_query(u'SELECT owner, table_name FROM all_tables 
 WHERE owner LIKE \'äöüßÄÖÜœ\'', con)
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/pandas/io/sql.py", 
line 326, in read_sql_query
    return pandas_sql.read_query(
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/pandas/io/sql.py", 
line 1218, in read_query
    result = self.execute(*args)
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/pandas/io/sql.py", 
line 1087, in execute
    return self.connectable.execute(*args, **kwargs)
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/sqlalchemy/engine/base.py"
, line 976, in execute
    return self._execute_text(object_, multiparams, params)
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/sqlalchemy/engine/base.py"
, line 1145, in _execute_text
    ret = self._execute_context(
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/sqlalchemy/engine/base.py"
, line 1287, in _execute_context
    self._handle_dbapi_exception(
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/sqlalchemy/engine/base.py"
, line 1485, in _handle_dbapi_exception
    util.raise_(exc_info[1], with_traceback=exc_info[2])
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/sqlalchemy/util/compat.py"
, line 178, in raise_
    raise exception
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/sqlalchemy/engine/base.py"
, line 1247, in _execute_context
    self.dialect.do_execute(
  File 
"/opt/pyenv/versions/3.8.2/lib/python3.8/site-packages/sqlalchemy/engine/default.py"
, line 590, in do_execute
    cursor.execute(statement, parameters)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 
60-66: ordinal not in range(128)
######################################################################




On Wednesday, 6 May 2020 10:01:22 UTC+2, Anno Nühm wrote:
>
> I am currently engaged in evaluating SQLAlchemy for a new project. When 
> trying to execute queries containing non-ascii characters an exception is 
> raised.
>
> The SQL statement used for carrying out the evaluation:
>
>     SELECT owner, table_name FROM all_tables  WHERE owner LIKE 'äöüßÄÖÜœ';
>
>
> Executing this statement in SQL*Plus, SQL Developer results--as 
> expected--in an empty list.
>
> In order to connect to an Oracle database the following code is being used:
>
>     from sqlalchemy import create_engine, MetaData, Table, inspect, select
>     import pandas as pd
>     import keyring
>     
>     dbtype = 'Oracle'
>     dbenv = 'LOCAL'
>     dbname = 'MYDB'
>     dbsys = '%s%s' % (dbtype, dbenv)
>     dbusr = 'myusr'
>     dbpwd = keyring.get_password(dbsys, dbusr)
>     dbhost = 'mydbhost'
>     dbport = 1521
>     dbconstr = 'oracle+cx_oracle://%s:%s@%s:%s/%s' % (dbusr, dbpwd, dbhost
> , dbport, dbname)
>
>
> To evaluate the database engine encoding: 
>
>     dbencs = ['UTF8', 'UTF-8', 'utf8', 'utf-8', 'latin1', 'ascii', None]
>     
>     for dbenc in dbencs:
>         if dbenc is None:
>             engine = create_engine(dbconstr)
>         else:
>             engine = create_engine(dbconstr, encoding=dbenc)
>         con = engine.connect()
>         
>         try:
>             df = pd.read_sql_query(u'SELECT owner, table_name FROM 
> all_tables  WHERE owner LIKE \'äöüßÄÖÜœ\'', con)
>             print('SUCCESS: sql query with db encoding %s succeeded!' % 
> dbenc)
>         except Exception as e:
>             print('ERROR: sql query with db encoding %s failed (%s)' % (
> dbenc, e))
>         
>         con.close()
>         engine.dispose()
>
>
> Regardless of the encoding specified when creating the db engine, every 
> single attempt to executed the query raises an exception
>
>     ERROR: sql query with db encoding UTF8 failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>     ERROR: sql query with db encoding UTF-8 failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>     ERROR: sql query with db encoding utf8 failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>     ERROR: sql query with db encoding utf-8 failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>     ERROR: sql query with db encoding latin1 failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>     ERROR: sql query with db encoding ascii failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>     ERROR: sql query with db encoding None failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>
>
> When connecting to the database directly with cx_Oracle (without 
> SQLAlchemy)
>
>     import cx_Oracle
>     import pandas as pd
>     import keyring
>     
>     dbtype = 'Oracle'
>     dbenv = 'LOCAL'
>     dbname = 'MYDB'
>     dbsys = '%s%s' % (dbtype, dbenv)
>     dbusr = 'myusr'
>     dbpwd = keyring.get_password(dbsys, dbusr)
>     dbhost = 'mydbhost'
>     dbport = 1521
>     dbconstr = '%s:%s/%s' % (dbhost, dbport, dbname)
>
>
>     dbencs = ['UTF8', 'UTF-8', 'utf8', 'utf-8', 'latin1', 'ascii', None]
>     
>     for dbenc in dbencs:
>         print('=' * 70)
>         print('db encoding: %s' % dbenc)
>         print('-' * 30)
>     
>         if dbenc is None:
>             connection = cx_Oracle.connect(dbusr, dbpwd, dbconstr)
>         else:
>             connection = cx_Oracle.connect(dbusr, dbpwd, dbconstr, 
> encoding=dbenc)
>         cursor = connection.cursor()
>         
>         try:
>             r = cursor.execute("SELECT owner, table_name FROM all_tables 
>  WHERE owner LIKE 'äöüßÄÖÜœ'")
>             recs = list()
>             for owner, table_name in cursor:
>                 recs.append({'owner': owner, 'table': table_name})
>             df = pd.DataFrame(recs)
>             print('SUCCESS: sql query with db encoding %s succeeded!' % 
> dbenc)
>         except Exception as e:
>             print('ERROR: sql query with db encoding %s failed (%s)' % (
> dbenc, e))
>     
>         cursor.close()
>         connection.close()
>
>
> everything works as expected.
>
>     SUCCESS: sql query with db encoding UTF8 succeeded!
>     SUCCESS: sql query with db encoding UTF-8 succeeded!
>     SUCCESS: sql query with db encoding utf8 succeeded!
>     SUCCESS: sql query with db encoding utf-8 succeeded!
>     SUCCESS: sql query with db encoding latin1 succeeded!
>     ERROR: sql query with db encoding ascii failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>     ERROR: sql query with db encoding None failed ('ascii' codec can't 
> encode characters in position 60-66: ordinal not in range(128))
>
>
> What do I have to do differently in order to have SQLAlchemy approache 
> rendering the identical results like the cx_Oracle one does?
>
> My environment comprises of
>
>    - Ubuntu linux 16.04LTS;
>    - Python 3.8;
>    - SQLAlchemy 1.3.16;
>    - cx_Oracle 7.3.0;
>    - psycopg2 2.8.5;
>    - local Oracle 18c Instant client;
>    - remote Oracle 19c database;
>    - local PostgreSQL 9.5 database.
>    
>
>

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/892c3f48-7782-467a-844f-bb87d18b9fa4%40googlegroups.com.

Reply via email to