Выполнение последовательности запросов MS sql с временными таблицами в python

В настоящее время пытаются использовать pyodbc и pandas для чтения последовательности запросов sql (из MS sql server) и проверки как кадра данных, получая следующую ошибку в самом первом запросе в последовательности:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-95-5eec1638614b> in <module>()
    285 for count, q in enumerate(sql_in):
    286     print count
--> 287     frame_in = pd.read_sql(q, cnxn)
    288 print frame_in.head(n=10)
    289 

/home/mapr/anaconda2/lib/python2.7/site-packages/pandas/io/sql.pyc in read_sql(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)
    497             sql, index_col=index_col, params=params,
    498             coerce_float=coerce_float, parse_dates=parse_dates,
--> 499             chunksize=chunksize)
    500 
    501     try:

/home/mapr/anaconda2/lib/python2.7/site-packages/pandas/io/sql.pyc in read_query(self, sql, index_col, coerce_float, params, parse_dates, chunksize)
   1598         args = _convert_params(sql, params)
   1599         cursor = self.execute(*args)
-> 1600         columns = [col_desc[0] for col_desc in cursor.description]
   1601 
   1602         if chunksize is not None:

TypeError: 'NoneType' object is not iterable

Соответствующий фрагмент кода выглядит так:

sql_in = """
SET NOCOUNT ON;
select <stuff> from <table1> into #<temptable1>
----SPLIT
SET NOCOUNT ON;
select <stuff> from <table2> into #<temptable2>
----SPLIT
SET NOCOUNT ON;
select <stuff> from <table3> into #<temptable3>
----SPLIT
SET NOCOUNT ON;
select <stuff> from <table4> <joined with temptables1-3> into #<temptable4>
""".split('----SPLIT')

for count, q in enumerate(sql_in):
    print count
    frame_in = pd.read_sql(q, cnxn)

Сделано так, потому что интересует только окончательная временная таблица (используя split из-за совета, опубликованного здесь).

Можно подтвердить правильность настройки pyodbc, запустив:

cnxn = pyodbc.connect(cnxn_str)
cursor = cnxn.cursor()

#Sample select query
print 'Testing db connection...'
cursor.execute("SELECT @@version;") 
row = cursor.fetchone() 
while row: 
    print row[0] 
    row = cursor.fetchone()

И собственно получение серверной версии.

Любые идеи, почему это может происходить и как исправить? Спасибо.


person lampShadesDrifter    schedule 06.12.2017    source источник
comment
Я считаю, что DB-API указывает, что .execute() разрешает только один запрос на команду.   -  person mechanical_meat    schedule 07.12.2017
comment
@bernie - я только что еще раз посмотрел на PEP249 и не вижу упоминания того, что. Безусловно, анонимный блок кода (пакет из нескольких инструкций) может работать, если это разрешено драйвером ODBC (и драйвер Microsoft ODBC для SQL Server это позволяет).   -  person Gord Thompson    schedule 07.12.2017
comment
Ах хорошо. Спасибо @GordThompson. Должно быть, я ошибаюсь.   -  person mechanical_meat    schedule 07.12.2017


Ответы (1)


Я считаю, что это потому, что первые несколько запросов не возвращают никаких данных. Pandas read_sql ожидает, что данные вернутся. Вы должны просто использовать функцию выполнения pyodbc для запуска этих запросов.

person scomes    schedule 06.12.2017
comment
... или, возможно, попробовать передать весь анонимный блок кода (без его разделения) в read_sql? (Сейчас не могу попробовать, на моем телефоне нет панд....) - person Gord Thompson; 07.12.2017
comment
это будет работать лучше, я просто пытался ответить на вопрос, почему их код не работает - person scomes; 07.12.2017
comment
Этот пост отвечает на первоначальный вопрос о том, почему код не работал, хотя в конечном итоге он реализовал решение, предложенное пользователем GordThompson. Спасибо обоим. - person lampShadesDrifter; 07.12.2017
comment
Разве это не SELECT <stuff> INTO #<temptable1> FROM <table1>? Я считаю, что порядок ваших INTO/FROM в вашем необработанном SQL изменен на противоположный. - person FlipperPA; 07.12.2017
comment
@FlipperPA Я использую MS SQL Server, поэтому способ публикации мне подходит. - person lampShadesDrifter; 08.12.2017