首页 > 解决方案 > Pyodbc 未从 SQL Server 返回错误

问题描述

好的,希望这是我忽略的非常愚蠢的事情......

我在 SQL Server 17 (14.0.2002.14) 上使用 Python 3.7.2 和 Pyodbc 4.0.24

在我的 SQL Server 上,我创建了一个表,如下所示:

create table test(
    test1 varchar(5)
)

但是当我尝试通过使用 pyodbc 执行相同的查询来抛出错误(因为表已经存在)时,我没有看到任何返回的错误:

def createSQLTable():
    try:
        sql_conn = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};'
                                    'Server=[SERVERNAME];'
                                    'Database=[DATABASENAME];'
                                    'Trusted_Connection=yes;')
        cursor = sql_conn.cursor()
        sql = '''set nocount on;
           use [DATABASENAME]
           create table test(test1 varchar(5));'''
        cursor.execute(sql)
    except Exception as e:
        print(e)
    finally:
        sql_conn.commit()
        cursor.close()
        sql_conn.close()

createSQLTable()

如果我在 SQL Server 上运行相同的 TSQL,我会收到错误消息:

消息 2714,级别 16,状态 6,第 1 行 数据库中已经有一个名为“测试”的对象。

那么如何让 Python/Pyodbc 抛出相同或类似的错误呢?

标签: pythonsqlsql-serverpython-3.xpyodbc

解决方案


Pyodbc 不会引发任何异常,因为USE [DATABASENAME]在多语句查询中哪个是第一个事务类型行没有错误。

与大多数 Python DB-API 一样,Pyodbc 不支持同一执行调用中的多个事务 SQL 语句,但有一些例外。通常只会运行第一个查询。

try考虑在同一块中单独发送它们:

cur.execute('set nocount on;')
cur.execute('use [DATABASENAME];')
cur.execute('create table test(test1 varchar(5));')

或者将行放在存储过程中并使用以下任一方式运行:

cursor.execute("EXEC mystoredProc")

cursor.execute("{CALL mystoredProc}")

USE或者只保留数据库连接规范不需要的相关行。

cur.execute('''set nocount on
               create table test(test1 varchar(5)
            ''')

推荐阅读