2 votes

Python script ne peut pas exécuter l'instruction SQL Select

J'essaie d'exécuter un statut SQL SELECT à partir de Microsoft SQL Server et d'écrire ces données dans une feuille de calcul Excel.

Cependant, lorsque j'exécute le script Python script, j'obtiens cette erreur :

Traceback (most recent call last):
  File "C:\Users\rrw\AppData\Roaming\Python\Python310\site-packages\sqlalchemy\engine\cursor.py", line 955, in fetchone
    row = dbapi_cursor.fetchone()
pyodbc.Error: ('HY010', '[HY010] [Microsoft][ODBC Driver 17 for SQL Server]Function sequence error (0) (SQLFetch)')     

Traceback (most recent call last):
  File "F:\Astro\Python\AstroPy\WriteSQLData.py", line 91, in <module>
    for row in rs:

Je vois dans l'erreur qu'il n'aime pas la ligne : for row in rs à la toute fin du script. Mais je n'arrive pas à comprendre pourquoi.

Y a-t-il quelque chose qui m'échappe ?

Voici mon script :

from sqlalchemy import create_engine
from sqlalchemy.engine import URL
import pyodbc
import pandas as pd
import csv
import configparser

# Get data from configuration ini file
config = configparser.ConfigParser()
config.read('databaseConfig.ini')
destinationFile = config['destination']['fileName']

# Database Connection Code
connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=ASTROLAB;DATABASE=AstronomyMaps;UID=xyz;PWD=xyz"
connection_url = URL.create(
    "mssql+pyodbc", query={"odbc_connect": connection_string})

engine = create_engine(connection_url)

# Simple test query
qry = "SELECT TOP (1000) * FROM [AstronomyMaps].[dbo].[starMapA]"
with engine.connect() as con:
    rs = con.execute(qry)

# Write query data to Excel spreadsheet 
with open(destinationFile, 'w', newline='') as f:
    a = csv.writer(f, delimiter=',')
    a.writerow([x[0] for x in cursor.description])
    a.writerows(row)

    for row in rs:
        print(row)

2voto

Gord Thompson Points 30178

Lorsque vous quittez le gestionnaire de contexte ( with bloc) la déclaration a été exécutée mais les lignes n'ont pas encore été extraites. Cependant, la sortie du gestionnaire de contexte met également fin à la connexion. for row in rs: lance une erreur lorsque le pilote ODBC tente d'appeler la fonction SQLFetch .

Vous pouvez éviter l'erreur en utilisant .all() pour récupérer les lignes alors qu'elles se trouvent encore dans le fichier with bloc :

qry = "SELECT TOP (1000) * FROM [AstronomyMaps].[dbo].[starMapA]"
with engine.connect() as con:
    rs = con.exec_driver_sql(qry).all()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X