在网页服务器上通过Python使用Microsoft SQL
我正在尝试从一个基于pylons(paster)的网络服务器向数据库发送一些查询,每次我尝试导入我正在使用的pymssql库时(顺便说一下,是这个库),我总是会遇到这个错误:
tds_init_winsock: WSAEnumProtocols failed with 10055(WSAENOBUFS: No buffer space
available.)
在导入的时候。我还尝试使用sqlalchemy,但在尝试创建sqlalchemy引擎时也遇到了完全相同的错误。我有什么办法可以让这个工作吗?我对这个网络服务器或pymssql库并没有特别的依赖,所以其他的库也可以。
环境信息:
我使用的机器是32位的Windows 7桌面,服务器在一个Python虚拟环境中运行,但pymssql库在虚拟环境中运行得很好,只是在服务器上不行。
更新:
再多提供一些背景信息(和解释):我不认为这与MSSQL或Python本身有关系,原因有两个:A)我和其他人仍然可以连接到MSSQL数据库,即使出现这个问题;B)如果不是从服务器导入,pymssql运行得非常好。不过,我确实觉得这可能与Python和_mssql处理套接字的方式有关,或者与服务器处理套接字的方式有关……希望这能提供一些帮助。
提前谢谢你!
3 个回答
看起来有人在这个链接上发布了一个可以解决pymssql问题的安装程序:http://code.google.com/p/pymssql/issues/detail?id=2。在运行这个安装程序之前,确保先卸载掉pymssql,否则你可能还是会从那个有问题的版本中导入。
如果你是通过egg文件安装的,可以通过删除你Python安装目录下的lib\site-packages中的pymssql*文件夹来卸载它(比如说C:\Python26)。
错误代码 WSAENOBUFS,翻译成“没有可用的缓冲区空间”,实际上是指(引用我刚才提到的MSDN页面):
在一个套接字上进行的操作无法执行,因为系统缺少足够的缓冲区空间,或者因为队列已满。
在实际操作中(例如在这里解释的),通常意味着(引用我刚才提到的文章):
在大多数情况下,当打开的套接字总数达到某个神秘的数字时,就会出现这个问题。微软写道,这个限制是同时打开3976个套接字,但在Win9x系统上,实际限制似乎要低得多。
由于每个套接字在关闭后会“忙碌”一段时间(那篇文章说是240秒),所以在一个中等繁忙的服务器上看到这个数字(无论在Windows 7中是多少)轻易超过限制也就不足为奇了,特别是因为桌面系统的套接字资源可能比真正的服务器系统要少。
那篇文章指出了几种解决这个问题的可能方法,尽管这些方法有些过时。但关键是,这似乎与Python、Pylons、Paster或Pymssql没有关系——这完全是Windows系统配置和控制的问题。因此,你可能在serverfault.com上问问会更有帮助,那里的系统管理员更懂这些问题!
好的,我终于把这个问题解决了。发现如果在Python中先导入socket再导入pymssql,pymssql会出现一些问题。在网页服务器上先导入pymssql再导入socket听起来有点荒唐,所以我最后选择了切换到pyodbc。结果发现它的语法和pymssql非常相似。这真是个不错的折中方案……