如何在pymssql中执行.sql文件

2024-04-26 11:54:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pymssql在python中执行一个sql文件,这个文件包含一个BEGIN事务、一个COMMIT事务和一个END,以及前后的一些安全网。在

我正在尝试打开内存中的文件并执行内容:

file = open(options.sqlFile, 'r')
sqlFileContents = file.read()
file.close()

cursor.execute(sqlFileContents)
conn.commit()

但它会返回错误:

^{pr2}$

所以基本上我有两个问题:

  1. 有没有可能像我这样执行查询?在
  2. 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

Tags: 文件gosqliftableselectfileend
1条回答
网友
1楼 · 发布于 2024-04-26 11:54:17

是的,这样做是可能的。 我经常这样做,在代码中硬编码SQL会更干净。在

你能把SQL添加到你的帖子里吗?可能有个混乱的角色。在

我是这样做的(使用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。在

那就没事了。在

相关问题 更多 >