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)
我在 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)