с sql-сервера на pandas dataframe с pyodbc - при работе с небольшими таблицами выдает ошибку при сложных sql-запросах - PullRequest
0 голосов
/ 22 мая 2019
1 step: Create a temporary table with pyodbc into sql server for objects
2 step: Select objects from temporary table and load it into pandas dataframe
3 step: print dataframe

для создания временной таблицы я работаю с курсором pyodbc, так как он выдает ошибки командой pandas.read_sql. Когда появляется ошибка, я пытаюсь преобразовать курсор в панду. даже со специальной строкой для обработки кортежей в данных.

моя программа для подключения, создания, чтения и печати, которая работает до тех пор, пока запрос остается простым, как сейчас. (мой настоящий подход состоит из нескольких сотен строк SQL-запроса)

import codecs
import os
import io
import pandas as pd
import pyodbc as po

server = 'sql_server'
database = 'sql_database'

connection = po.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';Trusted_Connection=yes;')
cursor = connection.cursor()

query1 = """
CREATE TABLE #ttobject (object_nr varchar(6), change_date datetime)
INSERT INTO #ttobject (object_nr)
VALUES
('112211'),
('113311'),
('114411');
"""

query2 = """
SELECT *
FROM #ttobject

Drop table if exists #ttobject
"""


cursor.execute(query1)
df = pd.read_sql_query(query2, connection)
print(df)

Из-за длительности запроса я избавляю вас от хлопот, но вместо этого отправляю сюда код ошибки:

('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)')

Эта ошибка выдается в query2, который является оператором множественного выбора с некоторыми объединениями и функциями сводки

Когда я пытаюсь поместить все в один курсор, у меня возникают проблемы с преобразованием его из курсора в DataFrame (пробовал несколько методов, может быть, кто-то знает тот, который не на SO или уже имеет специальный заголовок, поэтому я не мог найди это)

та же проблема, если я пытаюсь использовать только pd.read_sql, тогда создание временной таблицы не работает

Я не знаю, куда идти дальше.

Пожалуйста, дайте мне знать, если я смогу помочь вам с более подробной информацией, которую я могу осмотреть в соответствии с моей утратой: S

23.5.19 Дальнейшее расследование:

  • По словам Горда, я попытался добавить autocommit в true, который будет работать для простых операторов SQL, но не для меня очень долго и требующий времени один.
  • Во-вторых, я пытался добавить

    "cursor.execute ('SET NOCOUNT ON; EXEC schema.proc @muted = 1')

  • На данный момент я предполагаю, что первый запрос занимает больше времени, поэтому Python уже начинается со второго, и поэтому соединение заблокирован. Или, что первый запрос возвращает некоторую обратную связь, поэтому Python думает, что это закончено, прежде чем это на самом деле.

  • Добавлен time.sleep (100) после обработки первого запроса, но по-прежнему возникает ошибка hstmt is busy. Интересно, почему это так, потому что у него должно было быть достаточно времени для обработки первого
  • Funfact: запрос выполняется гладко, пока я не пытаюсь вывести из него какой-либо результат
...