Hướng dẫn convert sql stored procedure to python - chuyển đổi thủ tục được lưu trữ sql sang 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 convert sql stored procedure to python - chuyển đổi thủ tục được lưu trữ sql sang 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 convert sql stored procedure to python - chuyển đổi thủ tục được lưu trữ sql sang 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 convert sql stored procedure to python - chuyển đổi thủ tục được lưu trữ sql sang python

Bastien Bbastien bBastien B

7576 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 cách nào để chuyển đổi một quy trình được lưu trữ thành SQL trong Python?

Bạn có 2 tùy chọn: 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. 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)Use sqlalchemy to map your db models and interact with them without using your procedures. Call your procedure through an SQL connector (that can be provided by SQLAlchemy)

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.

Làm cách nào để chuyển đổi một quy trình được lưu trữ thành SQL?

Trước hết bắt đầu với một kịch bản trống.Trong hai dòng tiếp theo sẽ bắt đầu và kết thúc theo cách này, bạn sẽ chắc chắn rằng mã của bạn có thể chạy toàn bộ.Bên trong bắt đầu và kết thúc, hãy viết truy vấn của bạn như thể nó chỉ là một truy vấn ... sau khi khai báo và trước khi bắt đầu, hãy đặt các giá trị thành các biến của bạn.

Tôi có thể thực hiện tập lệnh Python từ SQL Server không?

Dịch vụ học máy SQL Server cho phép bạn thực thi các tập lệnh Python và R trong cơ sở dữ liệu.Bạn có thể sử dụng nó để chuẩn bị và làm sạch dữ liệu, làm kỹ thuật tính năng và đào tạo, đánh giá và triển khai các mô hình học máy trong cơ sở dữ liệu.. You can use it to prepare and clean data, do feature engineering, and train, evaluate, and deploy machine learning models within a database.