Выполнить файл SQL, возвращать результаты как Pandas DataFrame -- python поле с участием sql-server поле с участием pandas поле с участием pyodbc пол Связанный проблема

Execute SQL file, return results as Pandas DataFrame


1
vote

проблема

русский

У меня есть сложный запрос SQL Server, который я хотел бы выполнить из Python и вернуть результаты в виде файла PandaFrame.

Моя база данных читается только так, чтобы у меня не было много вариантов, таких как другие ответы, скажем, для изготовления менее сложных запросов.

Этот ответ был полезным , но я продолжаю получать <код > TypeError: 'NoneType' object is not iterable

Пример SQL

Это не настоящий запрос - просто чтобы продемонстрировать у меня временные таблицы. Используя глобальные временные таблицы, потому что мои запросы не удалось ранее использовать местные таблицы TEMP: Смотрите этот вопрос

 <код> SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON SET NOCOUNT ON SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  IF OBJECT_ID('tempdb..##temptable') IS NOT NULL DROP TABLE ##temptable IF OBJECT_ID('tempdb..##results') IS NOT NULL DROP TABLE ##results  DECLARE @closing_period int = 0, @starting_period int = 0  Select col1, col2, col3 into ##temptable from readonlytables  Select * into ##results from ##temptable  Select * from ##results   

Выполните запрос с PyODBC и Pandas

 <код> conn = pyodbc.connect('db connection details')  sql = open('myquery.sql', 'r') df = read_sql_query(sql.read(), conn) sql.close() conn.close()   

Результаты - полный трассировка стека

 <код> ypeError                                 Traceback (most recent call last) <ipython-input-38-4fcfe4123667> in <module>       5        6 sql = open('sql/month_end_close_hp.sql', 'r') ----> 7 df = pd.read_sql_query(sql.read(), conn)       8 #sql.close()       9   C:ProgramDataAnaconda3libsite-packagespandasiosql.py in read_sql_query(sql, con, index_col, coerce_float, params, parse_dates, chunksize)     330         coerce_float=coerce_float,     331         parse_dates=parse_dates, --> 332         chunksize=chunksize,     333     )     334   C:ProgramDataAnaconda3libsite-packagespandasiosql.py in read_query(self, sql, index_col, coerce_float, params, parse_dates, chunksize)    1632         args = _convert_params(sql, params)    1633         cursor = self.execute(*args) -> 1634         columns = [col_desc[0] for col_desc in cursor.description]    1635     1636         if chunksize is not None:  TypeError: 'NoneType' object is not iterable   

Когда я запускаю запрос в своей базе данных, я получаю ожидаемые результаты. Если я передаю запрос в строку, я также получаю ожидаемые результаты:

запрос как строка

 <код> conn = pyodbc.connect('db connection details')  sql = ''' SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON SET NOCOUNT ON SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  IF OBJECT_ID('tempdb..##temptable') IS NOT NULL DROP TABLE ##temptable IF OBJECT_ID('tempdb..##results') IS NOT NULL DROP TABLE ##results  DECLARE @closing_period int = 0, @starting_period int = 0  Select col1, col2, col3 into ##temptable from readonlytables  Select * into ##results from ##temptable  Select * from ##results '''  df = read_sql(sql, conn)  conn.close()   

Я думаю, что это может иметь что-то делать с одним цитатами внутри моего запроса?

Английский оригинал

I have a complex SQL Server query that I would like to execute from Python and return the results as a Pandas DataFrame.

My database is read only so I don't have a lot of options like other answers say for making less complex queries.

This answer was helpful, but I keep getting TypeError: 'NoneType' object is not iterable

SQL Example

This is not the real query - just to demonstrate I have temporary tables. Using global temporary tables because my queries failed previously using local temp tables: See this question

SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON SET NOCOUNT ON SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  IF OBJECT_ID('tempdb..##temptable') IS NOT NULL DROP TABLE ##temptable IF OBJECT_ID('tempdb..##results') IS NOT NULL DROP TABLE ##results  DECLARE @closing_period int = 0, @starting_period int = 0  Select col1, col2, col3 into ##temptable from readonlytables  Select * into ##results from ##temptable  Select * from ##results 

Execute query with pyodbc and pandas

conn = pyodbc.connect('db connection details')  sql = open('myquery.sql', 'r') df = read_sql_query(sql.read(), conn) sql.close() conn.close() 

Results - Full Stack Trace

ypeError                                 Traceback (most recent call last) <ipython-input-38-4fcfe4123667> in <module>       5        6 sql = open('sql/month_end_close_hp.sql', 'r') ----> 7 df = pd.read_sql_query(sql.read(), conn)       8 #sql.close()       9   C:ProgramDataAnaconda3libsite-packagespandasiosql.py in read_sql_query(sql, con, index_col, coerce_float, params, parse_dates, chunksize)     330         coerce_float=coerce_float,     331         parse_dates=parse_dates, --> 332         chunksize=chunksize,     333     )     334   C:ProgramDataAnaconda3libsite-packagespandasiosql.py in read_query(self, sql, index_col, coerce_float, params, parse_dates, chunksize)    1632         args = _convert_params(sql, params)    1633         cursor = self.execute(*args) -> 1634         columns = [col_desc[0] for col_desc in cursor.description]    1635     1636         if chunksize is not None:  TypeError: 'NoneType' object is not iterable 

When I run the query in my database I get the expected results. If I pass the query in as a string I also get the expected results:

Query as String

conn = pyodbc.connect('db connection details')  sql = ''' SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON SET NOCOUNT ON SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  IF OBJECT_ID('tempdb..##temptable') IS NOT NULL DROP TABLE ##temptable IF OBJECT_ID('tempdb..##results') IS NOT NULL DROP TABLE ##results  DECLARE @closing_period int = 0, @starting_period int = 0  Select col1, col2, col3 into ##temptable from readonlytables  Select * into ##results from ##temptable  Select * from ##results '''  df = read_sql(sql, conn)  conn.close() 

I think it might have something to do with the single quotes inside my query?

</div
           
         
         

Список ответов

1
 
vote
<Р> Я получил это работает. <Р> Я должен был использовать глобальные переменные, заменяя @ с @@ я был в состоянии получить работу запроса, как и ожидалось.

<Код> DECLARE @@closing_period int = 0, @@starting_period int = 0

<Р> Обновление:. Драйвер ODBC Мой был очень устарел - после обновления до последней версии, я больше не нужны глобальные временные таблицы или переменные - и запрос значительно быстрее побежал
 

I got it working.

I had to use global variables by replacing @ with @@ I was able to get the query working as expected.

DECLARE @@closing_period int = 0, @@starting_period int = 0

Update: My ODBC driver was very outdated - after updating to the latest version, I no longer needed global temp tables or variables - and the query ran significantly faster.

</div
 
 

Связанный проблема

51  Запросы Python «Пропасные зависимости от поддержки носков» при использовании SOCKS5 из терминала  ( Pythons requests missing dependencies for socks support when using socks5 fro ) 
Я пытаюсь взаимодействовать с API из My Python 2.7 Shell, используя пакет, который опирается на запросы Python. Вещь - это удаленный адрес блокируется моей се...

2  подмодул .POPEN отказывается запускать команду, хотя OS.System работает нормально  ( Submodules popen refuses to run a command even though os system works fine ) 
Всякий раз, когда я запускаю этот скрипт: <код> gcalctool0 Я постоянно получаю эту ошибку: <код> gcalctool1 Тем не менее, <код> gcalctool2 определе...

0  Почему этот сценарий Python работает на Ubuntu, но не распачин?  ( Why does this python script work on ubuntu but not raspbian ) 
Друг, и я создал следующий скрипт, использующий BeautifulSoup, чтобы получить HTML страницы работы, а затем добавить работу на массив, затем файл, затем отпра...

0  Запустите сценарий Python в колбу  ( Run python script into flask ) 
У меня есть настольное приложение для обнаружения лиц, написанных в сценарии Python, используя OpenCV и Numpy. Я хочу поставить эти файлы Python в колбу и зап...

1  Нахождение корней с Scipy.Optimize.root  ( Finding roots with scipy optimize root ) 
Я пытаюсь найти root y функции, называемой f с помощью python. Вот мой код: <код> def f(y): w,p1,p2,p3,p4,p5,p6,p7 = y[:8] t1 = w - 0.500371726*...

2  Высокое использование ЦП в ткани 1.0.0  ( High cpu usage in fabric 1 0 0 ) 
в ткани 0,9, все работает нормально, но в 1.0.0, следующий скрипт ткани показывает 100% загрузку CPU в <Код> top : <код> from fabric.api import run def tes...

9  От CVX до CVXPY или CVXOPT  ( From cvx to cvxpy or cvxopt ) 
Я пытался пройти какой-код из Matlab в Python. У меня такая же проблема с выпуклой оптимизацией, работающая на MATLAB, но у меня возникли проблемы, передавающ...

-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict  ( How to sum values when zipping similar key to build a dict ) 
У меня есть <код> A = [a, b, c, d, a, d, c] и <код> B=[1, 2, 3, 4, 5, 6, 7] Почему <код> dict(zip(A,B)) не возвращается <код> {'a': 6, 'b': 2, 'c': 10, '...

1  Как мне позвонить в родительский класс в подклассе?  ( How do i call on a parent class in a subclass ) 
Мне нужно создать вызов несвязанного метода, чтобы установить имя и листья, и я не знаю, как. Любая помощь ценится. Мой код: <код> class Plant(object): ...

2  Скапировка не вызывает никакой другой функции после «__init__»  ( Scrapy not calling any other function after init ) 
ОС: Ubuntu 16.04 Стек - Scrapy 1.0.3 + Selenium Я довольно новичок в Scrape, и это может звучать очень простое, но в моем пауке только « init » выполняется. Л...

16  Как преобразовать шестигранную строку в шестнадцатеричный номер?  ( How to convert hex string to hex number ) 
У меня есть целое число в бывшем. 16 И я пытаюсь преобразовать этот номер в шестнадцатеричный номер. Я пытался достичь этого, используя функцию Hex, но всякий...

2  Векторный способ применить 3-измерительную маску к RGB в Pytorch  ( Vectorized way to apply a 3 dimension mask to rgb in pytorch ) 
У меня есть тензор HXWX3, представляющий изображение RGB, и тензора RGBX3 (Boolean) Tensor в качестве ввода. Предполагается, что для каждого (i, j) в маске те...

2  Добавьте номера в шестнадцатеричном базе без конвертации баз?  ( Add numbers in hexadecimal base without converting bases ) 
Мне нужно написать функцию, которая получает два числа в шестнадцатеричном базе, и вычисляет сумму обоих из них, мне не разрешено преобразовывать их в десятич...

0  NameError: Имя «Домашние животные» не определены. Питон  ( Nameerror name pets is not defined python ) 
Это код, который я использую, но каждый раз, когда я пытаюсь запустить его, я получаю эту ошибку в терминале: <код> Traceback (most recent call last): Fil...

0  После добавления клеток найдите мин и максимум пяти различных категорий в файле CSV  ( After appending cells find min and max of five different categories in a csv fi ) 
Привет всем У меня есть вопрос. Я просто сейчас изучаю мин и макс. У меня проблемы в нахождении мин и максимум пяти столбцов для каждой категории Вот, что...

Связанный проблема

51  Запросы Python «Пропасные зависимости от поддержки носков» при использовании SOCKS5 из терминала 
2  подмодул .POPEN отказывается запускать команду, хотя OS.System работает нормально 
0  Почему этот сценарий Python работает на Ubuntu, но не распачин? 
0  Запустите сценарий Python в колбу 
1  Нахождение корней с Scipy.Optimize.root 
2  Высокое использование ЦП в ткани 1.0.0 
9  От CVX до CVXPY или CVXOPT 
-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict 
1  Как мне позвонить в родительский класс в подклассе? 
2  Скапировка не вызывает никакой другой функции после «__init__» 
16  Как преобразовать шестигранную строку в шестнадцатеричный номер? 
2  Векторный способ применить 3-измерительную маску к RGB в Pytorch 
2  Добавьте номера в шестнадцатеричном базе без конвертации баз? 
0  NameError: Имя «Домашние животные» не определены. Питон 
0  После добавления клеток найдите мин и максимум пяти различных категорий в файле CSV