具有linux和windows dev环境的Azure SQL Server和FreeTDS ODBC

时间:2015-08-09 18:00:13

标签: python sql-server azure pyodbc freetds

我在Windows Azure(Flask)上托管一个Web应用程序,该应用程序在Windows Server上运行。

我有一个linux开发环境(其他一些贡献者可能会在将来使用windows),所以我们使用pyodbc与SQL Server进行通信。不幸的是,由于linux和Windows ODBC连接不同,每次从Azure部署中拉出或推送时,我都必须更改连接字符串。

考虑我的连接字符串:

  

pyodbc.connect('驱动器= SQL   服务器;服务器= TCP:mydbname.database.windows.net,1433;数据库= mydbname; UID = DBUSER @ mydbname; PWD =绝密;加密= YES; TrustServerCertificate =无;连接   超时= 30;&#39)

一旦它部署在服务器(Windows Server)或Windows机器上,但在Linux开发盒上没有工作,这样可以正常工作。我发现了一些SO问题以及如何设置FreeTDS的指南(例如Connecting to Microsoft SQL Server through pyODBC on Ubuntuhttp://www.gazoakley.com/content/connecting-sql-azure-python-ubuntu-using-freetds-and-unixodbchttp://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   服务器,数据库= mydbname; UID = DBUSER @ mydbname; PWD =绝密;加密= YES; TrustServerCertificate =无;连接   超时= 30;&#39)

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

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

  

pyodbc.Error:(' IM002',' [IM002] [unixODBC] [驱动程序管理器]数据源   找不到名称,并且未指定默认驱动程序(0)(SQLDriverConnect)

使用DNS和servername:

  

pyodbc.Error :(' HY000',' [HY000] [unixODBC] [FreeTDS] [仅限SQL Server]   可以指定SERVER,SERVERNAME和DSN之间的一个(0)   (的SQLDriverConnect)&#39)

使用DNS且没有服务器名称

  

当部署到服务器时它不会工作。

我们使用git进行版本控制,并且我不希望持续的合并冲突,因为开发人员更改其连接字符串以匹配其开发环境和/或部署到Azure站点。

这是否有一个干净的解决方案。 Gut告诉我,我做错了什么,这非常简单。

1 个答案:

答案 0 :(得分:3)

首先,如果您已经在Windows和Linux平台上成功连接到SQL Server,那么祝贺您。在python中,有一个由python默认安装的软件包名为'platform',我们可以用它来检查运行的平台python脚本。我们可以预先设置2个连接字符串,并在不同的平台中选择特定的字符串。 这是我的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)