私は次のように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を解析する必要があります。
コードの最小限の例を作成してください。参照先:https://stackoverflow.com/help/mcve – Enfenion
ここで問題となるのは、TSQL(SQL Serverの方言)は、分割に使用する便利な区切り文字であったステートメントの間にセミコロンを必要としないことです。 – Parfait