Python中使用pymssql连接SQL Server总是没反应

Python中使用pymssql连接SQL Server总是没反应

一、问题场景

仅仅是一个简单的连接数据库的操作,运行之后就一直是运行中迟迟无响应

pymssql.connect(server=host, user=username, password=password, database=database, port=port)

二、原因分析

我这里只简单阐述一下我这里遇到该问题的原因,是 pymssql 使用 FreeTDS 包连接到 SQL Server 实例。您必须告诉它如何找到您的数据库服务器。最基本的信息是主机名、端口号和要使用的协议版本。但是我遇到这个问题是因为没有告诉它要使用的协议版本。更多可能引起该问题的原因见参考文献1


三、排查思路

参考参考文献1中的提示:
在这里插入图片描述
在要运行的代码前加入下述代码,运行项目控制台就会多输出很多日志信息

import os
os.environ['TDSDUMP'] = 'stdout'

观察日志信息中的错误信息,可以看到没有找到freetds.conf,我们前往日志中给到的路径中检查对应配置文件,确实没有发现FreeTDS的配置文件

config.c:174:Attempting to read conf files.
config.c:362:... $FREETDSCONF not set.  Trying $FREETDS/etc.
config.c:375:... $FREETDS not set.  Trying $HOME.
config.c:301:Could not open 'C:\Users\Administrator\AppData\Roaming/.freetds.conf' ((.freetds.conf)).
config.c:301:Could not open 'c:\freetds.conf' ((default)).

四、解决方案

说明:下述解决方案中指定/配置的的FreeTDS的版本可根据自己的情况参考参考文献3进行选择

解决方案一

参考参考文献2中的提示在排查思路中错误日志中查找的路径下手动创建FreeTDS的配置文件.freetds.conf,内容如下

[global]
    tds version = 7.0

在这里插入图片描述

解决方案二

建立数据库连接时通过tds_version参数指定FreeTDS的版本

pymssql.connect(server=host, user=username, password=password, database=database, port=port, tds_version='7.0')

五、参考文献

【1】Frequently asked questions
【2】FreeTDS
【3】Choosing a TDS protocol version

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Tornado使用pymssql创建SQL Server连接池可以通过以下步骤实现: 1. 首先,确保已经安装了pymssql库。可以使用pip命令进行安装:`pip install pymssql` 2. 导入必要的模块: ```python import pymssql from tornado.ioloop import IOLoop from tornado.gen import coroutine from tornado.concurrent import Future ``` 3. 创建一个连接池类,用于管理数据库连接: ```python class ConnectionPool: def __init__(self, host, user, password, database, max_connections=10): self.host = host self.user = user self.password = password self.database = database self.max_connections = max_connections self.connections = [] def get_connection(self): if len(self.connections) < self.max_connections: conn = pymssql.connect( host=self.host, user=self.user, password=self.password, database=self.database ) self.connections.append(conn) return conn else: raise Exception("Connection pool is full") def release_connection(self, conn): if conn in self.connections: self.connections.remove(conn) conn.close() ``` 4. 在Tornado的请求处理器使用连接池: ```python class MyHandler(RequestHandler): def initialize(self, connection_pool): self.connection_pool = connection_pool @coroutine def get(self): conn = self.connection_pool.get_connection() cursor = conn.cursor() cursor.execute("SELECT * FROM table_name") result = cursor.fetchall() cursor.close() self.connection_pool.release_connection(conn) # 处理查询结果 # ... ``` 5. 创建连接池实例并启动Tornado应用: ```python if __name__ == "__main__": connection_pool = ConnectionPool(host="localhost", user="username", password="password", database="dbname") app = Application([ (r"/", MyHandler, dict(connection_pool=connection_pool)), ]) app.listen(8888) IOLoop.current().start() ``` 这样,你就可以在Tornado应用使用pymssql创建SQL Server连接池了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值