我在 SQL Server 中有一个过程,我想在参数化查询中使用 SQLAlchemy 执行它,但它不断引发
InvalidRequestError
,即使我以相同的方式运行类似的查询。
我的代码如下:
with engine_renda_dev.connect() as connection_renda_dev:
connection_renda_dev.execute(
statement = sa.text("""
EXECUTE insert_solicitacao_pipefy_boleta_de_cetipado
@id_solicitacao = :id_solicitacao,
@id_fase = :id_fase,
@data_solicitacao = :data_solicitacao,
@email_solicitante = :email_solicitante,
@codigo_assessor = :codigo_assessor,
@codigo_cliente = :codigo_cliente,
@codigo_ativo = :codigo_ativo,
@lado_operacao = :lado_operacao,
@valor_operacao = :valor_operacao,
@tipo_operacao = :tipo_operacao,
@incentivo_operacao = :incentivo_operacao,
@desagio_operacao = :desagio_operacao,
@corretagem_operacao = :corretagem_operacao
COMMIT;
"""),
parameters = {
"id_solicitacao": 1234,
"id_fase": 1234,
"data_solicitacao": datetime(2024, 6, 12),
"email_solicitante": "[email protected]",
"codigo_assessor": 1234,
"codigo_cliente": 1234,
"codigo_ativo": "PETR4",
"lado_operacao": "Compra",
"valor_operacao": 56.00,
"tipo_operacao": "financeiro",
"incentivo_operacao": 0.00,
"desagio_operacao": 0.00,
"corretagem_operacao": 0.00
}
)
程序配置如下:
IF OBJECT_ID('insert_solicitacao_pipefy_boleta_de_cetipado', 'P') IS NOT NULL
DROP PROCEDURE insert_solicitacao_pipefy_boleta_de_cetipado;
GO
CREATE PROCEDURE insert_solicitacao_pipefy_boleta_de_cetipado
@id_solicitacao INT,
@id_fase INT,
@data_solicitacao DATETIME,
@email_solicitante VARCHAR(100),
@codigo_assessor INT,
@codigo_cliente INT,
@codigo_ativo VARCHAR(6),
@lado_operacao VARCHAR(6),
@valor_operacao NUMERIC(13,2),
@tipo_operacao VARCHAR(10),
@incentivo_operacao NUMERIC(3,2),
@desagio_operacao NUMERIC(3,2),
@corretagem_operacao NUMERIC(3,2)
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
INSERT INTO [dbo].[solicitacoes_pipefy] (
[id_solicitacao],
[id_fase],
[data_solicitacao],
[email_solicitante],
[codigo_assessor]
) VALUES (
@id_solicitacao,
@id_fase,
@data_solicitacao,
@email_solicitante,
@codigo_assessor
);
INSERT INTO [dbo].[solicitacoes_pipefy_boletas_de_cetipados] (
[id_operacao],
[codigo_cliente],
[codigo_ativo],
[lado_operacao],
[valor_operacao],
[tipo_operacao]
) VALUES (
@id_solicitacao,
@codigo_cliente,
@codigo_ativo,
@lado_operacao,
@valor_operacao,
@tipo_operacao
);
IF @tipo_operacao = 'Compra'
INSERT INTO [dbo].[solicitacoes_pipefy_boletas_de_cetipados_taxas_de_compra] (
[id_operacao],
[incentivo_operacao],
[desagio_operacao],
[corretagem_operacao]
) VALUES (
@id_solicitacao,
@incentivo_operacao,
@desagio_operacao,
@corretagem_operacao
);
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
THROW;
END CATCH;
END;
该过程在不带参数的 Azure Data Studio 和 SQLAlchemy 中执行时有效,加上我参数化在其他 SELECT 查询中的工作方式。
我错过了什么?
通过将 SQLAlchemy 从 1.4 更新到 2.0 来解决