我在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 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 服务器,数据库= 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告诉我,我做错了什么,这非常简单。
答案 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)