В настоящее время пытаются использовать 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()
И собственно получение серверной версии.
Любые идеи, почему это может происходить и как исправить? Спасибо.
.execute()
разрешает только один запрос на команду. - person mechanical_meat   schedule 07.12.2017