Введите несколько параметров в SQL хранимых процедурах из python с помощью sqlalchemy - PullRequest
0 голосов
/ 10 января 2020

Я могу успешно подключиться к SQL серверу из моего ноутбука jupyter с помощью этого сценария:

from sqlalchemy import create_engine
import pyodbc 
import csv
import time
import urllib

params = urllib.parse.quote_plus('''DRIVER={SQL Server Native Client 11.0};
                                    SERVER=SV;
                                    DATABASE=DB;
                                    TRUSTED_CONNECTION=YES;''')

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)

И я могу успешно выполнить SQL хранимые процедуры без параметров из ноутбука jupyter со следующей функцией:

def execute_stored_procedure(engine, procedure_name):
    res = {}
    connection = engine.raw_connection()

    try:
        cursor = connection.cursor()
        cursor.execute("EXEC "+procedure_name)
        cursor.close()
        connection.commit()
        res['status'] = 'OK'
    except Exception as e:
        res['status'] = 'ERROR'
        res['error'] = e
    finally:
        connection.close() 
    return res

Как можно преобразовать эту предыдущую функцию для хранимых процедур, имеющих несколько параметров (два в моем случае)?

1 Ответ

0 голосов
/ 20 января 2020

Решение моей проблемы, работающее только для хранимых процедур с 0 или 2 параметрами (просто измените 10-ю строку, если вам нужно другое количество параметров):

def execute_stored_procedure(engine, procedure_name,params_dict=None):
    res = {}
    connection = engine.raw_connection()
    try:
        cursor = connection.cursor()
        if params_dict is None:
            cursor.execute("EXEC "+procedure_name)
        else:
            req  = "EXEC "+procedure_name
            req += ",".join([" @"+str(k)+"='"+str(v)+"'" for k,v in params_dict.items()])               
            cursor.execute(req)
        cursor.close()
        connection.commit()
        res['status'] = 'OK'
    except Exception as e:
        res['status'] = 'ERROR'
        res['error'] = e
    finally:
        connection.close() 
    return res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...