Хранимая процедура sqlalchemy с выводом - PullRequest
1 голос
/ 11 января 2020

Я хочу вызвать хранимую процедуру и получить выходной параметр в python. Я использую sqlAlchemy и могу использовать параметры, но не знаю, как сделать вывод в переменную. Я понимаю, что в sqlAlchemy есть атрибут outParam (), но я не нашел полезного примера.

Вот простой SQL код для тестирования:

CREATE PROCEDURE [dbo].[Test]
    @numOne int,
    @numTwo int,
    @numOut int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SET @numOut = @numOne + @numTwo

END

И простой python:

engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
outParam = 0
result = engine.execute('Test ? ,?, ? OUTPUT', [1, 2, outParam])

outParam по-прежнему равен 0. Я попытался изменить его с помощью:

outParam = sqlalchemy.sql.outparam("ret_%d", type_=int)

Но это приводит к «Ошибка программирования». Чего мне не хватает?

1 Ответ

1 голос
/ 11 января 2020

SQLAlchemy возвращает объект ResultProxy. Попробуйте это так:

engine = sqlalchemy.create_engine(...)
rproxy = engine.execute(...)
result = rproxy.fetchall()

result должен быть list из RowProxy объектов, которые вы можете рассматривать как словари, на основе имен столбцов из запроса.

Если вы ищете истинный OUT параметр, ваш подход почти правильный. В первом параметре при вызове sqlalchemy.sql.outparam есть только небольшая ошибка (но это правильный синтаксис Python). Это должно быть так:

outParam = sqlalchemy.sql.outparam("ret_%d" % i, type_=int)

Обратите внимание на изменение первого параметра: ему просто нужно было подставить значение в строку формата. Первый параметр - это значение key, и, скорее всего, %d должен быть заменен индексным номером столбца (который должен быть в i).

...