python - 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 抛出相同或类似的错误呢?
解决方案
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)
''')
推荐阅读
- haskell - 功能“排序”和比较是一个巨大的错误帮助我解决这个问题
- yii2 - Yii2 国际化用代码代替整句
- python - 如何加载 keras 模型以转换为 tf lite?官方API返回错误
- ios - 在 Swift 中,我该如何做 'if let' 而不是这个?
- amazon-web-services - AWS Beanstalk 上的 jHipster 注册表
- assembly - AArch64 程序集中未采用无条件分支
- java - Subscene Javafx 中的鼠标偏移
- javascript - 使用 Laravel Livewire 传递隐藏的表单输入
- postgresql - 在 PostgreSQL 中创建触发器时出现语法错误
- python - discord.py 中的 member.kick 函数不起作用