2017-08-01 1 views
0

私は次のようにMSSQLワークベンチから生成test.sql内のファイルがあります:どのようにPythonを介してSQLファイルを解析するのですか?

 /****** Object: Database [sample_test] Script Date: 7/19/2017 3:00:55 PM 
    ******/ 
    USE [sample_test] 
    GO 
    ALTER DATABASE [sample_test] SET COMPATIBILITY_LEVEL = 100 
    GO 
    IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 
    begin 
    EXEC [sample_test].[dbo].[sp_fulltext_database] @action = 'enable' 
    end 
    GO 
    ALTER DATABASE [sample_test] SET ANSI_NULL_DEFAULT OFF 
    GO 
    ALTER DATABASE [sample_test] SET ANSI_NULLS OFF 
    GO 
    ALTER DATABASE [sample_test] SET ANSI_PADDING OFF 
    GO 
    ALTER DATABASE [sample_test] SET ANSI_WARNINGS OFF 
    GO 
    USE [sample_test] 
    GO 
    /****** Object: Schema [sample_test] Script Date: 7/19/2017 3:00:55 PM ******/ 
    CREATE SCHEMA [sample_test] 
    GO 
    /****** Object: Table [sample_test].[test_items] Script Date: 7/19/2017 3:00:55 PM ******/ 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    CREATE TABLE [sample_test].[test_items](
     [test_detail] [nvarchar](max) NOT NULL, 
     [test_id] [int] IDENTITY(1,1) NOT NULL, 
     [test_date_time] [datetime2](0) NOT NULL, 
    CONSTRAINT [PK_test_items_test_id] PRIMARY KEY CLUSTERED 
    (
     [test_id] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

    GO 
    /****** Object: Table [sample_test].[test_history] Script Date: 7/19/2017 3:00:55 PM ******/ 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    CREATE TABLE [sample_test].[test_history](
     [test_history_id] [int] IDENTITY(1,1) NOT NULL, 
     [test_flag] [int] NOT NULL, 
     [test_date_time] [datetime2](0) NOT NULL, 
    CONSTRAINT [PK_test_history_test_history_id] PRIMARY KEY CLUSTERED 
    (
     [test_history_id] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

    GO 
    INSERT INTO [sample_test].[test_items] ([test_detail], [test_id]) VALUES (0, 'IN') 
    INSERT INTO [sample_test].[test_items] ([test_detail], [test_id]) VALUES (0, 'OUT') 
    INSERT INTO [sample_test].[test_items] ([test_detail], [test_id]) VALUES (1, 'NONE') 

は、いくつかの異なるサーバーに上記のSQLスクリプトを実行し、そのサーバー上のテーブルを取得する必要があります。 は、その目的のためとしてPythonスクリプトを持つ:

import pymssql 
    conn = pymssql.connect(host='xyz', user='abc', password='123', database='sks') 
    cursor=conn.cursor() 

    with open("test.sql", "r") as inp:  
     for line in inp.read().split("\r"): 
      cursor.execute(line)   
    conn.commit() 
    conn.close() 

しかし、それはその解析することができ、いくつかの他のステートメントではないとして、エラーがスローされます。その後、私は次のようにSQLスクリプトを実行:

import pymssql 

    conn = pymssql.connect(host='xyz', user='abc', password='123', database='sks') 
    cursor=conn.cursor() 

    sql1=""" 
    USE [sample_test] 
    /****** Object: Schema [sample_test] Script Date: 7/19/2017 3:00:55 PM ******/ 
    CREATE SCHEMA [sample_test] 
    /****** Object: Table [sample_test].[test_items] Script Date: 7/19/2017 3:00:55 PM ******/ 
    SET ANSI_NULLS ON 
    SET QUOTED_IDENTIFIER ON 
    CREATE TABLE [sample_test].[test_items](
     [test_detail] [nvarchar](max) NOT NULL, 
     [test_id] [int] IDENTITY(1,1) NOT NULL, 
     [test_date_time] [datetime2](0) NOT NULL, 
    CONSTRAINT [PK_test_items_test_id] PRIMARY KEY CLUSTERED 
    (
     [test_id] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

    /****** Object: Table [sample_test].[test_history] Script Date: 7/19/2017 3:00:55 PM ******/ 
    SET ANSI_NULLS ON 
    SET QUOTED_IDENTIFIER ON 
    CREATE TABLE [sample_test].[test_history](
     [test_history_id] [int] IDENTITY(1,1) NOT NULL, 
     [test_flag] [int] NOT NULL, 
     [test_date_time] [datetime2](0) NOT NULL, 
    CONSTRAINT [PK_test_history_test_history_id] PRIMARY KEY CLUSTERED 
    (
     [test_history_id] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

    INSERT INTO [sample_test].[test_items] ([test_detail], [test_id]) VALUES (0, 'IN_RETRIVAL') 
    INSERT INTO [sample_test].[test_items] ([test_detail], [test_id]) VALUES (0, 'IN_RETRIVAL') 
    INSERT INTO [sample_test].[test_items] ([test_detail], [test_id]) VALUES (1, 'RETRIVAL_FAILED') 

    """ 
    cursor.execute(sql1)  
    sql2= """ 
    CREATE NONCLUSTERED INDEX [fk_case_id_idx] ON [sample_test].[test_items] 
    (
     [case_id] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

    """ 
    cursor.execute(sql2) 
    conn.commit() 
    conn.close() 

は今、上記の作品は正常に動作してforeingnkeyとpriaryキー制約と一緒にテーブルが作成されます。 私が今したいのは、最初にcreateテーブルを実行してからCREATE NONCLUSTERED INDEXを実行するという方法でtest.sqlファイルを解析することです。 それでは、私はスクリプトをセクションごとに実行する方法でtest.sqlを解析する必要があります。

+0

コードの最小限の例を作成してください。参照先:https://stackoverflow.com/help/mcve – Enfenion

+0

ここで問題となるのは、TSQL(SQL Serverの方言)は、分割に使用する便利な区切り文字であったステートメントの間にセミコロンを必要としないことです。 – Parfait

答えて

1

なぜ正確に別のステップで解析しようとしていますか?それはちょうど1つの実行で行くことができます。

とにかく、あなたが探しているのは、スクリプトをGOで分割することです。権限が接続しているユーザーに付与されている場合は、これらのSQLコマンドからストアドプロシージャを作成し、保存を実行することを考慮して、

with open("test.sql", "r") as inp: 
    for section in inp.read().split("GO"): 
     cursor.execute(section) 
0

:次に、例えば、indepedently(ただしテストしていない)、このような何かを各部分を実行することができます手順:

import pymssql 
conn = pymssql.connect(host='xyz', user='abc', password='123', database='sks') 
cursor = conn.cursor() 

# READ SQL FILE CONTENT INTO STRING 
with open("test.sql", "r") as f: 
    sqlstr = f.read() 

# DROP STORED PROC IF EXISTS 
cur.execute("IF EXISTS (SELECT * FROM sys.objects" \ 
      "   WHERE type='P' AND name='myStoredProc')" \ 
      " DROP PROCEDURE myStoredProc" 
conn.commit() 

# CREATE STORED PROC (CONCATENATING SQL STRING) 
cur.execute("CREATE PROCEDURE myStoredProc AS" + \ 
      " BEGIN" + \ 
      " {}".format(sqlstr) + \ 
      " END") 
conn.commit() 

# EXECUTE STORED PROC 
cur.execute("EXEC myStoredProc") 
関連する問題