【发布时间】:2013-12-10 20:16:46
【问题描述】:
我正在尝试使用pyodbc(使用 Python 2.7)调用存储过程以将记录插入到 SQL Server 2012 表中。我正在传递一个临时表。
我转储了我的 sql,当通过 SQL Server 管理控制台执行时,它产生了以下外键错误:
Msg 547, Level 16, State 0, Procedure spInsertBondTickerValues, Line 26
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__BondTickerValue__756D6ECB".
The conflict occurred in database "QuantDev", table "dbo.Tickers".
The statement has been terminated.
但是,pyodbc 没有引发异常。我将如何测试生成的游标或连接以了解发生了问题,以及如何获取错误消息?
非常感谢。
编辑这是完整的 sql 文本:
DECLARE @rawTbl [dbo].TickerValueTableType
INSERT INTO @rawTbl (Ticker, BBName, LastValue, ValueTime, SourceDescr) VALUES
('IBM', 'Equity', 179.230000, '2013-11-01 00:00:00.000000', 'Bloomberg'),
('SPX', 'Index', 1803.710000, '2013-12-10 00:00:00.000000', 'Bloomberg')
EXEC [dbo].spInsertBondTickerValues @rawTbl
EDIT 2 以下是相关的 Python 代码:
def execSQLwithCommit(self, sql):
cursor = self.conn.cursor()
cursor.execute(sql)
self.conn.commit()
以前通过什么方式建立连接的地方
self.conn = pyodbc.connect(app = appName,
driver = '{SQL Server Native client 11.0}',
server = server,
database = db,
Trusted_Connection = 'yes')
【问题讨论】:
-
请使用 pyodbc.Cursor 实例化和执行的相关 python 代码进行更新。
-
@beargle 完成。谢谢。
-
您的 SQL 脚本似乎缺少任何分号。我想知道它是否会被解析。 SQL Server 控制台可能足够聪明,可以解析它,但驱动程序同样聪明吗?我还怀疑该脚本包含三个不同的语句,每个语句都可能需要单独的
.execute调用。 -
@9000 当没有外键错误时,调用会正确插入所有内容。不要认为它是分号或多个语句。将它们分开可能会提供一种测试方法,但我希望
pyodbc会抛出错误情况......
标签: python sql-server pyodbc