使用 pymssql 的 Python/Flask/sqlAlchemy 环境中的 Adaptive Server 连接失败错误

Posted

技术标签:

【中文标题】使用 pymssql 的 Python/Flask/sqlAlchemy 环境中的 Adaptive Server 连接失败错误【英文标题】:Adaptive Server connection failed error in Python/Flask/sqlAlchemy environment with pymssql 【发布时间】:2015-02-17 22:31:08 【问题描述】:

更新:我已经确认这只是使用 Azure SQL 实例时的问题。我可以使用相同的 conn 字符串连接到本地、网络和远程 SQL (AWS) 实例 - 只有在连接到 Azure 时才会失败。我可以使用 Management Studio 等其他工具连接到 Azure 实例。

我正在构建一个小型 Python(3.4.x)/Flask 应用程序。我在这里完全是菜鸟,如果我在发帖时违反任何规则,请原谅我。

我已经创建了数据库引擎:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('mssql+pymssql://dbadmin:dbadminpass@somedomain.server.net/databasename?charset=utf8')
db_session = scoped_session(sessionmaker(autocommit = False, autoflush = False, bind = engine))

Base = declarative_base()
Base.query = db_session.query_property()

def init_db():
    import models
    Base.metadata.creat_all(bind=engine)

一切都在运行时正确构建/解释,但运行查询时出现错误:

usr = User.query.filter_by(username=form.user.data).first()

错误是:

sqlalchemy.exc.OperationalError: (OperationalError) (20002, b'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed\n') None None

包是:Flask==0.10.1、pymssql==2.1.1、SQLAlchemy==0.9.8

提前致谢。

【问题讨论】:

您是否对该错误消息进行了一些研究?如果是这样 - 为什么结果不令人满意(所以我们不会重复您的努力)? 好的,谢谢。我发现的一切似乎都围绕着一个 freeTDS 版本问题,但是,我不确定它是否相关(除了它给出了相同的错误消息)。我的理解是,freeTDS 是一组用于 *nix 盒子的库,允许它们使用 MS SQL 服务器。我正在开发、测试应用程序并将其部署到基于 Windows 的环境中。 你有你的 C:\freetds.conf 文件吗?见pymssql.org/en/latest/freetds.html freetds.conf 文件是: [global] port = 1433 tds version = 7.0 有没有办法在 app.config 文件中设置这个?我正在将其部署到 Azure,需要一种方法将其包含在应用程序配置中,而不是硬盘驱动器上的位置。 即使我在使用 pymssql 时也面临同样的问题。尝试了 pyodbc,但它的安装本身在 azure 上失败。你能解决这个问题吗? 【参考方案1】:

我遇到了类似的问题,并通过显式设置tds version = 7.0 解决了它。 FreeTDS 在诉诸系统范围的sysconfdir/freetds.conf 之前读取用户的$HOME/.freetds.conf。所以,我用[global] 部分创建了~/.freetds.conf

[global]
tds version = 7.0

您可以在freetds.con找到更多信息:http://www.freetds.org/userguide/freetdsconf.htm

【讨论】:

【参考方案2】:

因为我刚刚遇到了同样的问题。

因为我可以绕过sqlalchemypymssql 连接,所以我认为其他一切都应该没问题,所以我使用create_engine 参数connect_args 将所有内容直接传递给pymssql.connect

server_name = "sql_server_name"
server_addres = server_name + ".database.windows.net"
database = "database_name"
username = "@".format("my_username", server_name)
password = "strong_password"

arguments = dict(server=server_addres, user=username,
                                 password=password, database=database, charset="utf8")

AZURE_ENGINE = create_engine('mssql+pymssql:///', connect_args=arguments)

这很好用,根本不需要干预.freetds.conf 文件。

另外,请注意pymssql 要求用户名采用username@servername 的形式。有关详细信息,请参阅链接文档。

【讨论】:

以上是关于使用 pymssql 的 Python/Flask/sqlAlchemy 环境中的 Adaptive Server 连接失败错误的主要内容,如果未能解决你的问题,请参考以下文章

pymssql(python 模块)无法使用临时表

如何使用 pymssql 获取 sql 打印消息

无法使用带有 Windows 身份验证的 pymssql 进行连接

使用 pymssql 连接到 SQL Server 实例

使用 pymssql 将文本文件批量插入 SQL Server

python - 使用 python 和 pymssql 获取一系列行号之间的行