Skip to content

Version 0.24.0 breaks read_sql compatibility with read_sql_query #24988

Closed
@Shellcat-Zero

Description

@Shellcat-Zero

The following read_sql_query() works:

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://'+name+':'+pw+'@'+server+'/?charset=utf8')
sql = 'select * from MyDatabase.my_temp_table'
df = pd.read_sql_query(sql,engine)

The same statements now fail in read_sql():

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://'+name+':'+pw+'@'+server+'/?charset=utf8')
sql = 'select * from MyDatabase.my_temp_table'
df = pd.read_sql(sql,engine)
---------------------------------------------------------------------------
InternalError                             Traceback (most recent call last)
~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1235                     self.dialect.do_execute(
-> 1236                         cursor, statement, parameters, context
   1237                     )

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/default.py in do_execute(self, cursor, statement, parameters, context)
    535     def do_execute(self, cursor, statement, parameters, context=None):
--> 536         cursor.execute(statement, parameters)
    537

~/miniconda3/lib/python3.6/site-packages/pymysql/cursors.py in execute(self, query, args)
    169
--> 170         result = self._query(query)
    171         self._executed = query

~/miniconda3/lib/python3.6/site-packages/pymysql/cursors.py in _query(self, q)
    327         self._clear_result()
--> 328         conn.query(q)
    329         self._do_get_result()

~/miniconda3/lib/python3.6/site-packages/pymysql/connections.py in query(self, sql, unbuffered)
    515         self._execute_command(COMMAND.COM_QUERY, sql)
--> 516         self._affected_rows = self._read_query_result(unbuffered=unbuffered)
    517         return self._affected_rows

~/miniconda3/lib/python3.6/site-packages/pymysql/connections.py in _read_query_result(self, unbuffered)
    726             result = MySQLResult(self)
--> 727             result.read()
    728         self._result = result

~/miniconda3/lib/python3.6/site-packages/pymysql/connections.py in read(self)
   1065         try:
-> 1066             first_packet = self.connection._read_packet()
   1067

~/miniconda3/lib/python3.6/site-packages/pymysql/connections.py in _read_packet(self, packet_type)
    682         packet = packet_type(buff, self.encoding)
--> 683         packet.check_error()
    684         return packet

~/miniconda3/lib/python3.6/site-packages/pymysql/protocol.py in check_error(self)
    219             if DEBUG: print("errno =", errno)
--> 220             err.raise_mysql_exception(self._data)
    221

~/miniconda3/lib/python3.6/site-packages/pymysql/err.py in raise_mysql_exception(data)
    108     errorclass = error_map.get(errno, InternalError)
--> 109     raise errorclass(errno, errval)

InternalError: (1046, 'No database selected')

The above exception was the direct cause of the following exception:

InternalError                             Traceback (most recent call last)
<ipython-input-5-ebe084ae005c> in <module>
----> 1 df = pd.read_sql(sql,engine)

~/miniconda3/lib/python3.6/site-packages/pandas/io/sql.py in read_sql(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)
    381
    382     try:
--> 383         _is_table_name = pandas_sql.has_table(sql)
    384     except (ImportError, AttributeError):
    385         _is_table_name = False

~/miniconda3/lib/python3.6/site-packages/pandas/io/sql.py in has_table(self, name, schema)
   1198             self.connectable.dialect.has_table,
   1199             name,
-> 1200             schema or self.meta.schema,
   1201         )
   1202

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in run_callable(self, callable_, *args, **kwargs)
   2123         """
   2124         with self.contextual_connect() as conn:
-> 2125             return conn.run_callable(callable_, *args, **kwargs)
   2126
   2127     def execute(self, statement, *multiparams, **params):

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in run_callable(self, callable_, *args, **kwargs)
   1594
   1595         """
-> 1596         return callable_(self, *args, **kwargs)
   1597
   1598     def _run_visitor(self, visitorcallable, element, **kwargs):

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/dialects/mysql/base.py in has_table(self, connection, table_name, schema)
   2254                 rs = connection.execution_options(
   2255                     skip_user_error_events=True
-> 2256                 ).execute(st)
   2257                 have = rs.fetchone() is not None
   2258                 rs.close()

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in execute(self, object_, *multiparams, **params)
    972         """
    973         if isinstance(object_, util.string_types[0]):
--> 974             return self._execute_text(object_, multiparams, params)
    975         try:
    976             meth = object_._execute_on_connection

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in _execute_text(self, statement, multiparams, params)
   1145             parameters,
   1146             statement,
-> 1147             parameters,
   1148         )
   1149         if self._has_events or self.engine._has_events:

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1238         except BaseException as e:
   1239             self._handle_dbapi_exception(
-> 1240                 e, statement, parameters, cursor, context
   1241             )
   1242

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in _handle_dbapi_exception(self, e, statement, parameters, cursor, context)
   1456                 util.raise_from_cause(newraise, exc_info)
   1457             elif should_wrap:
-> 1458                 util.raise_from_cause(sqlalchemy_exception, exc_info)
   1459             else:
   1460                 util.reraise(*exc_info)
~/miniconda3/lib/python3.6/site-packages/sqlalchemy/util/compat.py in raise_from_cause(exception, exc_info)
    294     exc_type, exc_value, exc_tb = exc_info
    295     cause = exc_value if exc_value is not exception else None
--> 296     reraise(type(exception), exception, tb=exc_tb, cause=cause)
    297
    298

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/util/compat.py in reraise(tp, value, tb, cause)
    274             value.__cause__ = cause
    275         if value.__traceback__ is not tb:
--> 276             raise value.with_traceback(tb)
    277         raise value
    278

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1234                 if not evt_handled:
   1235                     self.dialect.do_execute(
-> 1236                         cursor, statement, parameters, context
   1237                     )
   1238         except BaseException as e:

~/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/default.py in do_execute(self, cursor, statement, parameters, context)
    534
    535     def do_execute(self, cursor, statement, parameters, context=None):
--> 536         cursor.execute(statement, parameters)
    537
    538     def do_execute_no_params(self, cursor, statement, context=None):

~/miniconda3/lib/python3.6/site-packages/pymysql/cursors.py in execute(self, query, args)
    168         query = self.mogrify(query, args)
    169
--> 170         result = self._query(query)
    171         self._executed = query
    172         return result

~/miniconda3/lib/python3.6/site-packages/pymysql/cursors.py in _query(self, q)
    326         self._last_executed = q
    327         self._clear_result()
--> 328         conn.query(q)
    329         self._do_get_result()
    330         return self.rowcount

~/miniconda3/lib/python3.6/site-packages/pymysql/connections.py in query(self, sql, unbuffered)
    514                 sql = sql.encode(self.encoding, 'surrogateescape')
    515         self._execute_command(COMMAND.COM_QUERY, sql)
--> 516         self._affected_rows = self._read_query_result(unbuffered=unbuffered)
    517         return self._affected_rows
    518

~/miniconda3/lib/python3.6/site-packages/pymysql/connections.py in _read_query_result(self, unbuffered)
    725         else:
    726             result = MySQLResult(self)
--> 727             result.read()
    728         self._result = result
    729         if result.server_status is not None:

~/miniconda3/lib/python3.6/site-packages/pymysql/connections.py in read(self)
   1064     def read(self):
   1065         try:
-> 1066             first_packet = self.connection._read_packet()
   1067
   1068             if first_packet.is_ok_packet():
~/miniconda3/lib/python3.6/site-packages/pymysql/connections.py in _read_packet(self, packet_type)
    681
    682         packet = packet_type(buff, self.encoding)
--> 683         packet.check_error()
    684         return packet
    685

~/miniconda3/lib/python3.6/site-packages/pymysql/protocol.py in check_error(self)
    218             errno = self.read_uint16()
    219             if DEBUG: print("errno =", errno)
--> 220             err.raise_mysql_exception(self._data)
    221
    222     def dump(self):

~/miniconda3/lib/python3.6/site-packages/pymysql/err.py in raise_mysql_exception(data)
    107         errval = data[3:].decode('utf-8', 'replace')
    108     errorclass = error_map.get(errno, InternalError)
--> 109     raise errorclass(errno, errval)

InternalError: (pymysql.err.InternalError) (1046, 'No database selected') [SQL: 'DESCRIBE `select * from MyDatabase.my_temp_table`'] (Background on this error at: http://sqlalche.me/e/2j85)

Problem description

Reverting to Pandas version 0.23.4 fixes the issue.

Output of pd.show_versions()

[paste the output of pd.show_versions() here below this line]
INSTALLED VERSIONS

commit: None
python: 3.6.5.final.0
python-bits: 64
OS: Linux
OS-release: 4.15.0-1021-aws
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: C.UTF-8
LOCALE: en_US.UTF-8

pandas: 0.24.0
pytest: None
pip: 19.0.1
setuptools: 39.2.0
Cython: None
numpy: 1.16.0
scipy: None
pyarrow: None
xarray: None
IPython: 7.2.0
sphinx: None
patsy: None
dateutil: 2.7.5
pytz: 2018.9
blosc: None
bottleneck: None
tables: None
numexpr: None
feather: None
matplotlib: None
openpyxl: None
xlrd: None
xlwt: None
xlsxwriter: None
lxml.etree: None
bs4: None
html5lib: None
sqlalchemy: 1.2.17
pymysql: 0.9.3
psycopg2: None
jinja2: None
s3fs: None
fastparquet: None
pandas_gbq: None
pandas_datareader: None
gcsfs: None

Metadata

Metadata

Assignees

No one assigned

    Labels

    IO SQLto_sql, read_sql, read_sql_queryRegressionFunctionality that used to work in a prior pandas version

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions