【问题标题】:Azure SQL Server and FreeTDS ODBC with linux and windows dev environments带有 linux 和 windows 开发环境的 Azure SQL Server 和 FreeTDS ODBC
【发布时间】: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 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 服务器;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


【解决方案1】:

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

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)

【讨论】:

  • 谢谢加里。我想我可以打开平台(life c++ ifdefs),但想要一个更简洁的解决方案。无论如何,在这个时间点我会尝试这个。再次感谢
  • 期待您的进一步消息
猜你喜欢
  • 1970-01-01
  • 2011-01-02
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2013-01-07
  • 1970-01-01
相关资源
最近更新 更多