【发布时间】:2015-11-01 15:20:40
【问题描述】:
我在 Windows Azure (Flask) 上托管了一个 Web 应用程序,该应用程序在 Windows Server 上运行。
我有一个linux开发环境(其他一些贡献者将来可能会使用windows),所以我们使用pyodbc与SQL Server进行通信。不幸的是,由于 linux 和 windows ODBC 连接的差异,每次我从 Azure 部署中拉取或推送时,我都必须更改我的连接字符串。
考虑我的连接字符串:
pyodbc.connect('驱动程序=SQL 服务器;Server=tcp:mydbname.database.windows.net,1433;Database=mydbname;Uid=dbuser@mydbname;Pwd=topsecret;Encrypt=yes;TrustServerCertificate=no;Connection 超时=30;')
一旦部署在服务器(Windows Server)或 Windows 机器上,它就可以正常工作,但不能在 linux 开发机器上工作。我发现了一些关于 SO 问题和如何设置 FreeTDS 的指南(例如 Connecting to Microsoft SQL Server through pyODBC on Ubuntu 和 http://www.gazoakley.com/content/connecting-sql-azure-python-ubuntu-using-freetds-and-unixodbc、http://blog.tryolabs.com/2012/06/25/connecting-sql-server-database-python-under-ubuntu/)。
但是,在遵循这些指南之后,您必须删除服务器名称并将其替换为 DSN(数据源名称),这是一个本地配置的变量。虽然这可以在本地 linux 机器上运行,但一旦部署到 Azure Web 服务器(Windows)就行不通了。
pyodbc.connect('DSN=SQL Server;Driver=SQL 服务器;Database=mydbname;Uid=dbuser@mydbname;Pwd=topsecret;Encrypt=yes;TrustServerCertificate=no;Connection 超时=30;')
您必须删除服务器名称,否则它会与 odbc/FreeTDS 配置冲突。
未指定 DNS(本文中的第一个连接字符串):
pyodbc.Error: ('IM002', '[IM002] [unixODBC][驱动管理器]数据源 未找到名称,并且未指定默认驱动程序 (0) (SQLDriverConnect)
使用 DNS 和服务器名:
pyodbc.Error: ('HY000', '[HY000] [unixODBC][FreeTDS][SQL Server]Only 可以指定 SERVER、SERVERNAME 和 DSN 之间的一个 (0) (SQLDriverConnect)')
使用 DNS 且没有服务器名称
当部署到服务器时它不会工作。
我们使用 git 进行版本控制,我不希望出现持续的合并冲突,因为开发人员会更改他们的连接字符串以匹配他们的开发环境和/或部署到 Azure 站点。
是否有一个干净的解决方法。 直觉告诉我我做错了什么,这很简单。
【问题讨论】:
-
除了下面的答案之外,您是否尝试过在您的 pyodbc.connect 中包含“Driver=FreeTDS;TDS_Version=7.2”?此外,如果您想在任何地方使用相同的 DB 驱动程序,FreeTDS 也可用于 Windows,如果您可以通过 ODBC 运行,那么您似乎可以使用 pyodbc 而不是 pymssql。
-
@FlipperPA 为什么我想尝试将驱动程序设置为 FreeTDS。那给我买什么?很高兴知道我可以在 Windows 开发盒上安装 FreeTDS,但我是否也必须在 azure Web 应用程序上安装 FreeTDS?编辑:似乎有一种 MS 批准的方式在网络应用程序上安装 FreeTDS:azure.microsoft.com/en-us/documentation/articles/…
-
这里的终极“圣杯”是让您的开发环境与生产环境尽可能匹配。如果您已经在 Windows 上进行开发并在 Linux 上进行生产,则这是不可能的,但您可以通过在任何地方使用 FreeTDS(相同的驱动程序)更接近,而不必在代码中使用不同的连接字符串(避免使用“if”语句在连接期间基于哪个操作系统)。
标签: python sql-server azure pyodbc freetds