I've run into an issue with Redshift and I thought I would post it here 
before logging a bug.  If I run a query against a Redshift database table 
that happens to return 0 rows I get an error when I try to iterate over the 
result set.  I run a pretty simple script that is looking for rows where a 
timestamp field contains a date time that is greater than the last time the 
query was run.  Most of the time there are several thousand rows, but at 
times there are no rows that have been updated and the query returns a 
result set with no records.

It is simple enough to reproduce simply be generating a query that always 
returns 0 records.
 
from sqlalchemy import create_engine
engine = create_engine(
'postgres+psycopg2://username:password@redshifthost:port/db_name')
with engine.connect().execute_options(stream_results=True) as conn:
    results = conn.execute(query)
    data = [r for r in results]

Traceback (most recent call last):
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/result.py",
 
line 1174, in fetchone
    row = self._fetchone_impl()
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/result.py",
 
line 1296, in _fetchone_impl
    self.__buffer_rows()
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/result.py",
 
line 1283, in __buffer_rows
    self.__rowbuffer = collections.deque(self.cursor.fetchmany(size))
psycopg2.InternalError: opening multiple cursors from within the same 
client connection is not allowed.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "<input>", line 3, in <module>
  File "<input>", line 3, in <listcomp>
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/result.py",
 
line 870, in __iter__
    row = self.fetchone()
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/result.py",
 
line 1183, in fetchone
    self.cursor, self.context)
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/base.py",
 
line 1402, in _handle_dbapi_exception
    exc_info
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/util/compat.py",
 
line 203, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/util/compat.py",
 
line 186, in reraise
    raise value.with_traceback(tb)
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/result.py",
 
line 1174, in fetchone
    row = self._fetchone_impl()
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/result.py",
 
line 1296, in _fetchone_impl
    self.__buffer_rows()
  File 
"/Users/dstovall/.virtualenvs/connectors/lib/python3.6/site-packages/sqlalchemy/engine/result.py",
 
line 1283, in __buffer_rows
    self.__rowbuffer = collections.deque(self.cursor.fetchmany(size))
sqlalchemy.exc.InternalError: (psycopg2.InternalError) opening multiple 
cursors from within the same client connection is not allowed.


I get the same problem using fetchone() or fetchmany() on the result set. 
 If I don't use .execute_options(stream_results=True) to create the 
connection then I don't get the error.  It seems that option somehow ends 
up creating multiple server-side cursors when the are no records in the 
result set.  If any records are returned in the result set then I don't get 
the error.  Right now, as a work around I simply check the results.rowcount 
attribute 
before iterating through results, but I don't really like that work around. 
 Has anyone else encountered this problem with streamed results from 
Redshift?

-- 
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 post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to