当插入SQL Server时,我有一个奇怪的信号超时问题。以下是可以重现此问题的简短代码段。
运行相同代码库的所有同事都没有数据库问题。我们还有一个应用服务器,可以保持连接数据库数小时而不会出现问题。笔记本电脑上运行的不同之处是:1)我拥有与同事不同的最新Dell Precision 5530; 2)我的同事使用python 3.5 / 3.6 / Windows 7&Linux时,我正在使用Anaconda / Python 3.7 / pyodbc 4.0.26 / Windows 10的最新副本。谷歌搜索建议我尝试更新我尝试过的网络适配器驱动程序,并将其安装在最新的驱动程序上。
有人看到过类似的问题吗?
[编辑1]由于以下建议,我已更新为更新的驱动程序,但出现了其他错误。
import time
import pyodbc
cxn = pyodbc.connect('DSN=db;DATABASE=db;Uid=user;Pwd=password', autocommit=True)
def insert(cxn):
ids = [(i, ) for i in range(100000)]
cur = cxn.cursor()
cur.fast_executemany = True
cur.execute('create table #tmp (unique_id int)')
# cur.commit()
print(1)
cur.executemany('insert into #tmp values (?)', ids)
# cur.commit()
print(2)
cur.execute('create unique index tmp_pk on #tmp (unique_id)')
# cur.commit()
print(3)
cur.execute('select * from #tmp')
print(4)
cur.execute('drop table #tmp')
for i in range(1000):
print('loop {} {}'.format(i, time.time()))
insert(cxn)
time.sleep(60)
在ipython中经过多次迭代之后:
loop 6 1557992375.617378
1
---------------------------------------------------------------------------
OperationalError Traceback (most recent call last)
<ipython-input-1-8ceea4a06017> in <module>
23 for i in range(1000):
24 print('loop {} {}'.format(i, time.time()))
---> 25 insert(cxn)
26 time.sleep(60)
<ipython-input-1-8ceea4a06017> in insert(cxn)
11 # cur.commit()
12 print(1)
---> 13 cur.executemany('insert into #tmp values (?)', ids)
14 # cur.commit()
15 print(2)
OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.\r\n (10060) (SQLExecute); [08S01] [Microsoft][ODBC Driver 17 for SQL Server]Communication link failure (10060)')
错误是:
[08S01] [Microsoft] [用于SQL Server的ODBC驱动程序17] TCP提供程序:
连接尝试失败是因为被连接方在一段时间后未正确响应,或者建立连接失败是因为连接的主机未响应。
(10060)(SQLExecute); [08S01] [Microsoft] [用于SQL Server的ODBC驱动程序17]通信链接失败(10060)')
答案 0 :(得分:0)
这看起来像是一个客户端错误,但是不希望得到修复。本机客户端is deprecated:
重要
SQL Server本机客户端(SQLNCLI)仍被弃用,不建议将其用于新的开发工作。
Microsoft现在推荐ODBC已有一段时间,并将其大部分精力放在了这里。这是完全可以理解的,因为那是唯一可以在Linux上运行的功能。
SQL Server文档站点包含Python上的整个部分,以及pyodbc和pymssql的示例。正如他们解释的那样:
但是,Microsoft将测试工作和对pyodbc驱动程序的信心放在了首位。
您可以找到Windows,MacOS和各种Linux发行版here的ODBC驱动程序。
pyodbc
的示例很简单,不需要DSN:
import pyodbc
# Some other example server values are
# server = 'localhost\sqlexpress' # for a named instance
# server = 'myserver,port' # to specify an alternate port
server = 'tcp:myserver.database.windows.net'
database = 'mydb'
username = 'myusername'
password = 'mypassword'
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()