Azure SQL 服务器和具有 linux 和 windows 开发环境的 FreeTDS ODBC

Azure SQL Server and FreeTDS ODBC with linux and windows dev environments

我在 Windows Azure (Flask) 上托管了一个 Web 应用程序,它在 Windows 服务器上运行。

我有一个linux的开发环境(其他一些贡献者以后可能会使用windows),所以我们使用pyodbc与SQL服务器通信。不幸的是,由于 linux 和 windows ODBC 连接差异,每次从 Azure 部署中拉取或推送时,我都必须更改连接字符串。

考虑我的连接字符串:

pyodbc.connect('Driver=SQL Server;Server=tcp:mydbname.database.windows.net,1433;Database=mydbname;Uid=dbuser@mydbname;Pwd=topsecret;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;')

一旦部署到服务器(Windows 服务器)或 windows 机器上,它就可以正常工作,但在 linux 开发机器上不起作用。我发现了一些关于如何设置 FreeTDS 的问题和指南(例如 Connecting to Microsoft SQL Server through pyODBC on Ubuntu and 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 Server;Database=mydbname;Uid=dbuser@mydbname;Pwd=topsecret;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;')

您必须删除服务器名,否则它会与 odbc/FreeTDS 配置冲突。

未指定 DNS(此 post 中的第一个连接字符串):

pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)

使用 DNS 和服务器名称:

pyodbc.Error: ('HY000', '[HY000] [unixODBC][FreeTDS][SQL Server]Only one between SERVER, SERVERNAME and DSN can be specified (0) (SQLDriverConnect)')

有 DNS 但没有服务器名称

When deployed to the server it wont work.

我们使用 git 进行版本控制,我不希望在开发人员更改他们的连接字符串以匹配他们的开发环境 and/or 部署到 Azure 站点时出现连续的合并冲突。

是否有针对此问题的彻底修复。 直觉告诉我我做错了什么,这很微不足道。

首先,如果您在Windows和Linux平台上都成功连接到SQL服务器,恭喜您。在python中,有一个python默认安装的名为'platform'的包,我们可以用它来查看python脚本运行在什么平台。我们可以设置2 预先连接字符串,select 不同平台的具体字符串。 这是我的 python 代码片段:

import platform

def getOBCDString():
    stsos = platform.system()
    bol = False
    odbcstring=''
    if(stsos == "Windows"):
       bol = True
       odbcstring = 'windows_odbc_string'
    elif(stsos == "Linux"):
        bol = True
        odbcstring = 'Linux_odbc_string'
    #else:
        # custom error handle
    return (bol,odbcstring)

bol,string = getOBCDString()
if(bol):
    print(string)