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: запрос выполняется гладко, пока я не пытаюсь вывести из него какой-либо результат