首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在pymssql中执行.sql文件

问如何在pymssql中执行.sql文件
EN

Stack Overflow用户
提问于 2015-05-29 15:30:30
回答 1查看 6.3K关注 0票数 11

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

我试图打开内存中的文件并执行以下内容:

代码语言:javascript
复制
file = open(options.sqlFile, 'r')
sqlFileContents = file.read()
file.close()

cursor.execute(sqlFileContents)
conn.commit()

但它让我犯了错误:

代码语言:javascript
复制
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")

基本上,我有两个问题:

  1. 是否有可能以我的方式执行查询?
  2. sql查询文件本身是否是问题所在?

谢谢你的帮助。

编辑:这是SQL:

下面是SQL:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-29 15:46:51

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

你能把SQL添加到你的帖子中吗?在某个地方可能有个角色搞砸了。

我这样做(用pyodbc):

代码语言:javascript
复制
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。

那就没问题了。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30533508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档