如何在 pymssql 中执行 .sql 文件
How to execute an .sql file in pymssql
我正在尝试使用 pymssql 在 python 中执行一个 sql 文件,该文件包含一个 BEGIN TRANSACTION、一个 COMMIT TRANSACTION 和一个 END,以及一些安全网之前和之后。
我正在尝试打开内存中的文件并执行内容:
file = open(options.sqlFile, 'r')
sqlFileContents = file.read()
file.close()
cursor.execute(sqlFileContents)
conn.commit()
但它返回错误:
pymssql.ProgrammingError: (102, "Incorrect syntax near 'GO'.DB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 1
5:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity
15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102,severity
15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")
基本上我有两个问题:
- 是否可以按照我的方式执行查询?
- 是 sql 查询文件本身的问题吗?
感谢您的帮助。
编辑:这是 SQL:
这里是 SQL:
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors
GO
CREATE TABLE #tmpErrors (Error int)
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
PRINT N'Adding Release Version to [admin].[ReleaseHistory]'
GO
INSERT INTO [admin].[ReleaseHistory] VALUES (GetUTCDate(), '1.7')
GO
IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END
GO
IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT>0 BEGIN
PRINT 'The database update succeeded'
COMMIT TRANSACTION
END
ELSE PRINT 'The database update failed'
GO
DROP TABLE #tmpErrors
GO
是的,可以这样做。
我经常这样做,在你的代码中硬编码 SQL 更干净。
你能把 SQL 添加到你的 post 吗?某处可能有一个乱七八糟的角色。
我是这样做的(使用 pyodbc):
with open('%smysql.sql' % SQL_DIR) as f:
sql = f.read() % params # Don't do that with untrusted inputs
cursor.execute(sql)
cursor.commit()
cursor.close()
编辑:删除所有 GO
它不是真正的 SQL 语句。
检查这个答案:Using "GO" within a transaction。
那应该没问题
我正在尝试使用 pymssql 在 python 中执行一个 sql 文件,该文件包含一个 BEGIN TRANSACTION、一个 COMMIT TRANSACTION 和一个 END,以及一些安全网之前和之后。
我正在尝试打开内存中的文件并执行内容:
file = open(options.sqlFile, 'r')
sqlFileContents = file.read()
file.close()
cursor.execute(sqlFileContents)
conn.commit()
但它返回错误:
pymssql.ProgrammingError: (102, "Incorrect syntax near 'GO'.DB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 1
5:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity
15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102,severity
15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")
基本上我有两个问题:
- 是否可以按照我的方式执行查询?
- 是 sql 查询文件本身的问题吗?
感谢您的帮助。
编辑:这是 SQL:
这里是 SQL:
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors
GO
CREATE TABLE #tmpErrors (Error int)
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
PRINT N'Adding Release Version to [admin].[ReleaseHistory]'
GO
INSERT INTO [admin].[ReleaseHistory] VALUES (GetUTCDate(), '1.7')
GO
IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END
GO
IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT>0 BEGIN
PRINT 'The database update succeeded'
COMMIT TRANSACTION
END
ELSE PRINT 'The database update failed'
GO
DROP TABLE #tmpErrors
GO
是的,可以这样做。 我经常这样做,在你的代码中硬编码 SQL 更干净。
你能把 SQL 添加到你的 post 吗?某处可能有一个乱七八糟的角色。
我是这样做的(使用 pyodbc):
with open('%smysql.sql' % SQL_DIR) as f:
sql = f.read() % params # Don't do that with untrusted inputs
cursor.execute(sql)
cursor.commit()
cursor.close()
编辑:删除所有 GO
它不是真正的 SQL 语句。
检查这个答案:Using "GO" within a transaction。
那应该没问题