fetchall () выдает «Предыдущий SQL не был запросом». для запроса DELETE - PullRequest
1 голос
/ 13 мая 2019

У меня есть скрипт Python, который подключается к экземпляру сервера SQL.Я запустил cte запрос на удаление дубликатов.Запрос выполняется успешно, но когда я использовал функцию fetchall (), это приводит к ошибке: предыдущий запрос не является sql-запросом и после проверки в таблице БД на наличие дубликатов показывает, что дубликат все еще существует.Это то же самое, что и с pyodbc и sqlalchemy.

Код pyodbc:

import pyodbc

conn = pyodbc.connect(connection_string)
cursor = conn.cursor()

query = ''';with cte as
(
  SELECT [ID], [TIME], ROW_NUMBER() OVER 
  (PARTITION BY [ID] order by [TIME] desc) as rn
  from table
)delete from cte WHERE rn > 1'''

cursor.execute(query)

cursor.close()
conn.close()

Code for sqlalchemy:

from sqlalchemy import create_engine 
from sqlalchemy.sql import text
import urllib

conn = urllib.parse.quote_plus(connection_string)
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(conn))

query = '''with cte as
(
  SELECT [ID], [TIME], ROW_NUMBER() OVER (PARTITION BY [ID] order by [TIME] desc) as rn
  from table
)
delete from cte WHERE rn > 1'''

connect = engine.connect()

result = connect.execute(query)

if result.returns_rows:
    print("Duplicates removed")
else:
    print("No row is returned")

1 Ответ

2 голосов
/ 13 мая 2019

, когда я использовал функцию fetchall (), это приводит к ошибке: предыдущий запрос не является sql-запросом

Это ожидаемое поведение.Хотя ваш запрос включает SELECT как часть CTE, сам запрос в конечном итоге является запросом DELETE, который не возвращает строки.Он вернет количество строк, которое вы можете получить с помощью Cursor # rowcount , но Cursor # fetchall () выдаст ошибку, так как нет строк для извлечения.

...