使用 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】:因为我刚刚遇到了同样的问题。
因为我可以绕过sqlalchemy
让pymssql
连接,所以我认为其他一切都应该没问题,所以我使用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 连接失败错误的主要内容,如果未能解决你的问题,请参考以下文章
无法使用带有 Windows 身份验证的 pymssql 进行连接