pandas .read_sql_query () выбрасывает TypeError: объект 'NoneType' не повторяется - PullRequest
1 голос
/ 05 февраля 2020

Я использую функцию pandas .read_sql_query для чтения из нескольких sql файлов. Один запрос выдает ошибку в одном конкретном бите, который я выделил.

(python бит - ничего не указано c и работает с другими запросами)

@contextmanager
def open_db_connection(connection_string):
    pyodbc.pooling = False
    connection = pyodbc.connect(connection_string)

    try:
        yield connection
    except pyodbc.DatabaseError as err:
        error, = err.args
        sys.stderr.write(error.message)
    finally:
        connection.close()

noCount = """ SET NOCOUNT ON; """
with open_db_connection(connection_string) as conn:
    res = pd.read_sql_query(noCount+queryObj, conn)

Следующий бит sql выдает ошибку, и я понятия не имею, почему это может быть так. Предыдущие операторы и различные временные таблицы работают и могут быть собраны с помощью pandas .read_sql_query (), однако в следующем бите он прерывается.


IF OBJECT_ID('tempdb..#test1') IS NOT NULL DROP TABLE #test1;
select t.PositionID, b.SecurityID
into #test1
from #tmp as t
inner join placeholder.dbo.items  as b on (b.PositionID = t.PositionID and b.StudyDate = '20191230')
where t.ast = 'eq';

IF OBJECT_ID('tempdb..#test2') IS NOT NULL DROP TABLE #test2;
select t.PositionID,    
       case
       when count(i.beta_index)=0 then 1
       else count(i.beta_index)
       end as noIndex
into #test2 
from #test1 as t 
   left join #beta_index as i on (t.SecurityID = i.isin)
   group by t.PositionID;

select * from #test2

Это должно вернуть данные из test2. Одно замечание - он отлично работает с SQL Server Management Studio.

1 Ответ

1 голос
/ 11 февраля 2020

Проблема все время заключалась в том, что я игнорировал / игнорировал предупреждающие сообщения в SSMS, что, по-моему, приводит к тому, что курсор не является запросом, а pyodb c throwing ProgrammingError "Нет результатов. Предыдущий SQL не был запросом «. и, следовательно, pandas .read_sql_query () аварийно завершается.

Предупреждение:

Предупреждение: нулевое значение удаляется с помощью агрегата или другой операции SET.

«SET ANSI_WARNINGS OFF» в начале запроса решил проблему.

Я не думаю, что это лучшая практика, хотя в моем случае я могу игнорировать эти предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...