【问题标题】:How to execute an .sql file in pymssql如何在 pymssql 中执行 .sql 文件
【发布时间】:2015-08-12 13:14:59
【问题描述】:

我正在尝试使用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")

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

  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

【问题讨论】:

    标签: python database file pymssql


    【解决方案1】:

    是的,可以这样做。 我经常这样做,在代码中硬编码 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

    那应该没问题。

    【讨论】:

    • 不客气。不要忘记接受答案;-)
    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 2019-04-27
    • 2019-06-23
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2016-11-18
    相关资源
    最近更新 更多