Hướng dẫn how do i convert a stored procedure to sql in python? - làm cách nào để chuyển đổi một thủ tục được lưu trữ thành sql trong python?

Làm thế nào tôi có thể chuyển đổi thủ tục được lưu trữ SQL Server sang Python (SQLalchemy) def?

Mục tiêu của tôi: [MSSQL SP] đến [Python (Sqlalchemy) def]

Hướng dẫn how do i convert a stored procedure to sql in python? - làm cách nào để chuyển đổi một thủ tục được lưu trữ thành sql trong python?

Dale k

23.2K14 Huy hiệu vàng42 Huy hiệu bạc71 Huy hiệu đồng14 gold badges42 silver badges71 bronze badges

hỏi ngày 13 tháng 2 lúc 15:08Feb 13 at 15:08

Hướng dẫn how do i convert a stored procedure to sql in python? - làm cách nào để chuyển đổi một thủ tục được lưu trữ thành sql trong python?

1

Bạn đang nói rõ ràng về "quy trình được lưu trữ" vì vậy tôi cho rằng bạn không có mô hình cũng như ORM được sử dụng trong ứng dụng bằng DB này. Bạn có 2 tùy chọn:

  1. Sử dụng SQLalchemy để ánh xạ các mô hình DB của bạn và tương tác với chúng mà không cần sử dụng các quy trình của bạn.

  2. Gọi thủ tục của bạn thông qua Trình kết nối SQL (có thể được cung cấp bởi SQLalchemy)

Bạn có thể thực hiện hỗn hợp cả hai giải pháp nếu bạn có một phần của ứng dụng cần phải được duy trì bởi một ORM (ví dụ như các cuộc tấn công hợp pháp hoặc chứng nhận)

Vì bạn đã thêm thẻ Fastapi, liên kết đầu tiên là Fastapi Doc chính thức về cách sử dụng sqlalchemy với khung.

Đã trả lời ngày 13 tháng 2 lúc 18:23Feb 13 at 18:23

Hướng dẫn how do i convert a stored procedure to sql in python? - làm cách nào để chuyển đổi một thủ tục được lưu trữ thành sql trong python?

Bastien Bbastien bBastien B

7636 Huy hiệu bạc18 Huy hiệu đồng6 silver badges18 bronze badges

Tôi phải thêm một số logic bổ sung vào khoảng 80 quy trình được lưu trữ tương tự trên máy chủ DWH của tôi.

Tôi nghĩ rằng sẽ mất khá nhiều thời gian nếu tôi làm điều đó với Python và rất nhiều Googling (tôi không có kinh nghiệm Python) hoặc nếu tôi làm điều đó bằng tay. Vì vậy, tôi quyết định làm điều đó "cách thú vị".

Kịch bản của tôi hoạt động, nhưng xem xét rằng Python có thể làm những điều tuyệt vời với mã tối thiểu, tôi chắc chắn rằng nó có thể được rút ngắn.

Vì vậy, đây là kịch bản:

import pyodbc
import re
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=dwh-dev;DATABASE=STA;Trusted_Connection=Yes')
cursor = cnxn.cursor()
cursor.execute("select proc_schema = s.name, name = p.name, definition = object_definition(p.object_id) from sys.procedures p inner join sys.schemas s on s.schema_id = p.schema_id where 1=1 and s.name = 'xpert'")
rows = cursor.fetchall()
for row in rows:
    try:
        part1 = re.sub('(--\$\$proc\_header\_end\$\$\r\n\r\n\t[\-]*\r\n\r\n)', '\g<1>\tif Config.[conf].[f_get_value_bit] (\'STA\', \'LoadFromProd_Xpert\', 1) = 1\r\n\tbegin\r\n\r\n\t\t\r\n\r\n\tend\r\n\telse\r\n\tmybegin\r\n\r\n', row.definition)
        part2 = re.sub('(--- standard log/error/transaction block  --- footer)', 'myend\r\n\r\n\t\g<1>', part1)
        schemaName = row.proc_schema
        tableName = row.name.replace('p_load_', '')
        cursor1 = cnxn.cursor()
        sql = "select c.name from sys.columns c inner join sys.tables t on t.object_id = c.object_id inner join sys.schemas s on t.schema_id = s.schema_id where s.name = '" + schemaName + "' and t.name = '" + tableName + "'"
        cursor1.execute(sql)
        columns = cursor1.fetchall()
        columnDefinition = ''
        firstIteration = 1
        for column in columns:
            if firstIteration == 1:
                columnDefinition = column.name
                firstIteration = 0
            else:
                columnDefinition = columnDefinition + '\r\n\t\t\t,' + column.name
        replaceString = 'truncate table ' + schemaName + '.' + tableName + ';\r\n\r\n\t\tinsert into ' + schemaName + '.' + tableName + '\r\n\t\t(\r\n\t\t\t' + columnDefinition + '\r\n\t\t)\r\n\t\tselect\r\n\t\t\t' + columnDefinition + '\r\n\t\tfrom [ZSTARS-DWH].STA.' + schemaName + '.' + tableName + ';'
        almostFinal = part2.replace('', replaceString)
        oldLogic = re.findall('mybegin([\s\S\w\W\d\D]*)\tmyend', almostFinal)
        oldLogicIndented = 'begin' + oldLogic[0].replace('\r\n', '\r\n\t') + 'end'
        final = re.sub('mybegin([\s\S\w\W\d\D]*)\tmyend', oldLogicIndented, almostFinal)
        text_file = open('UpdateScripts\\' + schemaName + '.' + tableName + '.sql', 'w')
        text_file.write(final.replace('create procedure', 'use STA\r\ngo\r\nalter procedure').replace('\r\n', '\n'))
        text_file.close()
    except:
        print('Error editing ' + row.proc_schema + '.' + row.name)

Và đây là một ví dụ về định nghĩa kết quả từ truy vấn đầu tiên trước đây:

CREATE procedure xpert.p_load_t_afk1 (@BatchID uniqueidentifier = null)
as
begin

    -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
        SET NOCOUNT ON;

    --- standard log/error/transaction block  --- header ----
        --$$proc_header_start$$
        SET XACT_ABORT ON;
        DECLARE @CInfo ContextInformation;
        INSERT INTO @CInfo EXECUTE log.p_proc_start @@ProcID, @BatchID OUT;
        BEGIN TRY
        --$$proc_header_end$$

    -------------------------------------------------------

    declare @execution_id bigint
    EXEC [SSISDB].[catalog].[create_execution] @package_name=N't_afk1.dtsx', @execution_id=@execution_id OUTPUT, @folder_name=N'Projects', @project_name=N'AS400 Loads', @use32bitruntime=False, @reference_id=Null
    EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=1
    exec [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'SYNCHRONIZED', @parameter_value=1
    EXEC [SSISDB].[catalog].[start_execution] @execution_id

    --- standard log/error/transaction block  --- footer ----

        EXECUTE log.p_proc_end @CInfo;

        --$$proc_footer_start$$
        END TRY
        BEGIN CATCH
            IF XACT_STATE() =  1 -- committable
                COMMIT TRANSACTION;

            IF XACT_STATE() = -1 -- uncommittable
                ROLLBACK TRANSACTION;

            EXECUTE log.p_catch_error @CInfo;

        END CATCH
        --$$proc_footer_end$$
    --------------------------------------------------
end

và sau:

CREATE procedure xpert.p_load_t_afk1 (@BatchID uniqueidentifier = null)
as
begin

    -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
        SET NOCOUNT ON;

    --- standard log/error/transaction block  --- header ----
        --$$proc_header_start$$
        SET XACT_ABORT ON;
        DECLARE @CInfo ContextInformation;
        INSERT INTO @CInfo EXECUTE log.p_proc_start @@ProcID, @BatchID OUT;
        BEGIN TRY
        --$$proc_header_end$$

    -------------------------------------------------------

    if Config.[conf].[f_get_value_bit] ('STA', 'LoadFromProd_Xpert', 1) = 1
    begin

        truncate table xpert.t_afk1;

        insert into xpert.t_afk1
        (
            K1FIRM
            ,K1WKNR
            ,K1AFNR
            ,K1AFDA
            ,K1KDDA
            ,K1RLDA
            ,K1AART
            ,K1SACH
            ,K1ABTG
            ,K1AKDN
            ,K1AVSN
            ,K1KDMC
            ,K1AREF
            ,K1RFDA
            ,K1WACD
            ,K1MWKZ
            ,K1PSLI
            ,K1RBLI
            ,K1EIVB
            ,K1VATA
            ,K1ZULA
            ,K1FKTK
            ,K1SARG
            ,K1FKAT
            ,K1PFKZ
            ,K1FKNR
            ,K1PJNR
            ,K1AWFW
            ,K1AWSW
            ,K1ARFW
            ,K1ARSW
            ,K1BOFW
            ,K1BOSW
            ,K1NEGW
            ,K1BRGW
            ,K1VOLU
            ,K1KA01
            ,K1KA02
            ,K1KA03
            ,K1KA04
            ,K1FS01
            ,K1FS02
            ,K1FS03
            ,K1FS04
            ,K1WC01
            ,K1WC02
            ,K1WC03
            ,K1WC04
            ,K1PM01
            ,K1PM02
            ,K1PM03
            ,K1PM04
            ,K1ERG1
            ,K1ERG2
            ,K1ERG3
            ,K1ERG4
            ,K1BA01
            ,K1BA02
            ,K1BA03
            ,K1BA04
            ,K1ERK1
            ,K1ERK2
            ,K1ERK3
            ,K1ERK4
            ,K1NER1
            ,K1NER2
            ,K1NER3
            ,K1NER4
            ,K1ABV1
            ,K1ABV2
            ,K1ABV3
            ,K1ABV4
            ,K1ABK1
            ,K1ABK2
            ,K1ABK3
            ,K1ABK4
            ,K1NEWT
            ,K1ST01
            ,K1ST02
            ,K1AUCD
            ,K1KURS
            ,K1ABDR
            ,K1ABDS
            ,K1ABKT
            ,K1ABNU
            ,K1ZAAB
            ,K1DBNR
            ,K1KKDN
            ,K1WBUS
            ,K1ABDV
            ,K1BED1
            ,K1BED2
            ,K1DFUR
            ,K1LSNU
            ,K1EUKZ
            ,K1VZTA
            ,K1SALV
            ,K1PJNA
            ,K1VORB
            ,K1VTN1
            ,K1VTN2
            ,K1ERV1
            ,K1ERV2
            ,K1VTL1
            ,K1VTL2
            ,K1UKZ1
            ,K1UKZ2
            ,K1UKZ3
            ,K1UKZ4
            ,K1UKZ5
            ,K1KDF1
            ,K1KDF2
            ,K1KDF3
            ,K1KDF4
            ,K1KDF5
            ,K1RHF1
            ,K1RHF2
            ,K1RHF3
            ,K1RHF4
            ,K1RHF5
            ,K1RHF6
            ,K1RHF7
            ,K1RHF8
            ,K1NEKZ
            ,K1ANDA
            ,K1ANUS
            ,K1ANUZ
            ,K1AEDA
            ,K1AETI
            ,K1AEUS
            ,K1USER
            ,K1WSID
        )
        select
            K1FIRM
            ,K1WKNR
            ,K1AFNR
            ,K1AFDA
            ,K1KDDA
            ,K1RLDA
            ,K1AART
            ,K1SACH
            ,K1ABTG
            ,K1AKDN
            ,K1AVSN
            ,K1KDMC
            ,K1AREF
            ,K1RFDA
            ,K1WACD
            ,K1MWKZ
            ,K1PSLI
            ,K1RBLI
            ,K1EIVB
            ,K1VATA
            ,K1ZULA
            ,K1FKTK
            ,K1SARG
            ,K1FKAT
            ,K1PFKZ
            ,K1FKNR
            ,K1PJNR
            ,K1AWFW
            ,K1AWSW
            ,K1ARFW
            ,K1ARSW
            ,K1BOFW
            ,K1BOSW
            ,K1NEGW
            ,K1BRGW
            ,K1VOLU
            ,K1KA01
            ,K1KA02
            ,K1KA03
            ,K1KA04
            ,K1FS01
            ,K1FS02
            ,K1FS03
            ,K1FS04
            ,K1WC01
            ,K1WC02
            ,K1WC03
            ,K1WC04
            ,K1PM01
            ,K1PM02
            ,K1PM03
            ,K1PM04
            ,K1ERG1
            ,K1ERG2
            ,K1ERG3
            ,K1ERG4
            ,K1BA01
            ,K1BA02
            ,K1BA03
            ,K1BA04
            ,K1ERK1
            ,K1ERK2
            ,K1ERK3
            ,K1ERK4
            ,K1NER1
            ,K1NER2
            ,K1NER3
            ,K1NER4
            ,K1ABV1
            ,K1ABV2
            ,K1ABV3
            ,K1ABV4
            ,K1ABK1
            ,K1ABK2
            ,K1ABK3
            ,K1ABK4
            ,K1NEWT
            ,K1ST01
            ,K1ST02
            ,K1AUCD
            ,K1KURS
            ,K1ABDR
            ,K1ABDS
            ,K1ABKT
            ,K1ABNU
            ,K1ZAAB
            ,K1DBNR
            ,K1KKDN
            ,K1WBUS
            ,K1ABDV
            ,K1BED1
            ,K1BED2
            ,K1DFUR
            ,K1LSNU
            ,K1EUKZ
            ,K1VZTA
            ,K1SALV
            ,K1PJNA
            ,K1VORB
            ,K1VTN1
            ,K1VTN2
            ,K1ERV1
            ,K1ERV2
            ,K1VTL1
            ,K1VTL2
            ,K1UKZ1
            ,K1UKZ2
            ,K1UKZ3
            ,K1UKZ4
            ,K1UKZ5
            ,K1KDF1
            ,K1KDF2
            ,K1KDF3
            ,K1KDF4
            ,K1KDF5
            ,K1RHF1
            ,K1RHF2
            ,K1RHF3
            ,K1RHF4
            ,K1RHF5
            ,K1RHF6
            ,K1RHF7
            ,K1RHF8
            ,K1NEKZ
            ,K1ANDA
            ,K1ANUS
            ,K1ANUZ
            ,K1AEDA
            ,K1AETI
            ,K1AEUS
            ,K1USER
            ,K1WSID
        from [ZSTARS-DWH].STA.xpert.t_afk1;

    end
    else
    begin

        declare @execution_id bigint
        EXEC [SSISDB].[catalog].[create_execution] @package_name=N't_afk1.dtsx', @execution_id=@execution_id OUTPUT, @folder_name=N'Projects', @project_name=N'AS400 Loads', @use32bitruntime=False, @reference_id=Null
        EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=1
        exec [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'SYNCHRONIZED', @parameter_value=1
        EXEC [SSISDB].[catalog].[start_execution] @execution_id

    end

    --- standard log/error/transaction block  --- footer ----

        EXECUTE log.p_proc_end @CInfo;

        --$$proc_footer_start$$
        END TRY
        BEGIN CATCH
            IF XACT_STATE() =  1 -- committable
                COMMIT TRANSACTION;

            IF XACT_STATE() = -1 -- uncommittable
                ROLLBACK TRANSACTION;

            EXECUTE log.p_catch_error @CInfo;

        END CATCH
        --$$proc_footer_end$$
    --------------------------------------------------
end

Làm thế nào sử dụng thủ tục được lưu trữ trong SQL trong Python?

Các bước để thực hiện thủ tục lưu trữ MySQL trong Python..
Kết nối với MySQL từ Python. ....
Nhận đối tượng con trỏ từ kết nối. ....
Thực hiện thủ tục được lưu trữ. ....
Kết quả tìm nạp. ....
Đóng đối tượng đối tượng con trỏ và đối tượng cơ sở dữ liệu ..

Chúng ta có thể viết các thủ tục được lưu trữ trong Python không?

Chọn để tạo một quy trình được lưu trữ với mã nội tuyến hoặc với mã được tải lên từ một giai đoạn.Như trường hợp của Python UDFS, bạn có thể tạo một quy trình được lưu trữ nội tuyến hoặc quy trình được lưu trữ với mã được tải lên từ một giai đoạn.you can either create an in-line stored procedure or a stored procedure with code uploaded from a stage.

Python có thể tích hợp với SQL không?

Bước đầu tiên để thiết lập tích hợp máy chủ SQL Python yêu cầu bạn xây dựng kết nối giữa Python và SQL Server bằng PYODBC.Kết nối chức năng và chuyển một chuỗi kết nối.Chuỗi kết nối MSSQL Python sẽ xác định trình điều khiển DBMS, cài đặt kết nối, máy chủ và cơ sở dữ liệu cụ thể.

SQL có thể chạy tập lệnh Python không?

Microsoft SQL Server Machine Learning Services Dịch vụ máy học là một tính năng trong SQL Server cung cấp cho bạn khả năng chạy các tập lệnh Python và R với dữ liệu quan hệ.Bạn có thể sử dụng các gói và khung nguồn mở, và các gói Microsoft Python và R, để phân tích dự đoán và học máy.Machine Learning Services is a feature in SQL Server that gives you the ability to run Python and R scripts with relational data. You can use open-source packages and frameworks, and the Microsoft Python and R packages, for predictive analytics and machine learning.