SQLAlchemy 参数化原始查询

问题描述 投票:0回答:1

我在 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 查询中的工作方式。

我错过了什么?

python python-3.x sql-server sqlalchemy
1个回答
0
投票

通过将 SQLAlchemy 从 1.4 更新到 2.0 来解决

© www.soinside.com 2019 - 2024. All rights reserved.