【问题标题】:SQL Server, Python, and OS XSQL Server、Python 和 OS X
【发布时间】:2012-07-25 14:15:57
【问题描述】:

将在 OS X 上运行的 Python 与基于云的 SQL Server 数据库接口的好方法是什么?

编辑:

使用 pyodbc 我收到此错误:

>>> import pyodbc
>>> cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=adsf.com;DATABASE=asdf;UID=asdf;PWD=asdf')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pyodbc.Error: ('00000', '[00000] [iODBC][Driver Manager]dlopen({SQL Server}, 6): image not found (0) (SQLDriverConnect)')

【问题讨论】:

    标签: python sql-server macos pyodbc


    【解决方案1】:

    Pyodbc + MS 自己的 odbc 提供程序,msodbcsql,而不是 FreeTDS。我的推理很简单——谁最有动力获得良好的 SQL Server 支持?女士。

    https://docs.microsoft.com/en-us/azure/sql-database/sql-database-connect-query-python

    这真的很简单,主要的麻烦是他们的安装程序只适用于 Homebrew,而不是我通常使用的 ma​​cports。我首先尝试将 Homebrew 安装到我的主目录,但是 pyodbc 并没有以这种方式“看到”实际的驱动程序,所以安装了标准的 Homebrew,然后是 brew install msodbcsql。这导致了以下软件包:

    (venv) jluc@sandbox$ brew list
     msodbcsql  openssl     unixodbc
    

    连接对我有用的字符串:

    Driver={ODBC Driver 13 for SQL Server};Server=192.168.1.xxx;Database=mydb;Uid=myuser;Pwd=mypassword;
    

    对于 SQL Alchemy:

    "mssql+pyodbc://%(user)s:%(password)s@%(hostname)s:%(port)s/%(dbname)s?driver=ODBC+Driver+13+for+SQL+Server"
    

    如果你还要安装 MS SQL Server(我有 2016 开发版),请记住:1)使用 SQL Server 配置管理器SQLServerManager13.msc)在端口 1433 上启用 TCPIP,为您的 IP。 2) 在 Windows 防火墙 (wf.msc) 中打开 1433 端口。 MS config instructions

    版本:Sierra、Python 2.7、SQL Server 2016 开发版、Win 10 Pro。

    注意:小心 MS 的 brew 安装。我认为它曾经主动安装 Homebrew。不确定这在实践中是否会成为问题。

    【讨论】:

    【解决方案2】:

    Will's answer 对我真的很有帮助。

    以下是我在此过程中遇到的一些差异的一些说明,以防它们对其他人有所帮助:

    1. pyodbc tarball 已经有了所需的更改,所以我所要做的就是下载并运行python setup.py install。 (注意:我用pip安装的版本还在用iodbc,所以没用。

    2. Verify FreeTDS installed 步骤不允许我连接到数据库,因为我无权访问master,而且显然无法指定。这似乎是一个众所周知的问题。我浪费了很多时间试图解决它,但失败了,最后它并没有阻止其他步骤的工作。

    3. 这些说明说将用户名和密码输入odbc.ini。由于我们在登录时需要再次说出登录凭据,因此我尝试从odbc.ini 中删除用户名和密码,希望它们不是真的必要。 (我宁愿在更少的地方写下我的密码!)这很好。

    4. 我必须将主机添加到 isql MYSERVER myname@foo.bar.com MYPASSWORD 中的用户 ID(以及 Python 代码中)。

    (我希望这意味着我不需要 freetds.conf 中的主机,但遗憾的是,它必须保留。)

    【讨论】:

      【解决方案3】:

      有很多箍要跳过。威尔的回答概述了其中很多。

      经过一番努力,我设法让它与 Docker 一起工作(所以这应该可以在任何运行 docker 的地方工作)。

      我已经使用 Python 3.6 和 Python 2.7 测试了设置:使用 pyodbc==3.0.10、django-pyodbc-azure 和 Django 1.10.4(此设置适用于 Django,但也适用于 vanilla python)。

      我创建了一个您可以使用的公共图像:https://hub.docker.com/r/toast38coza/python-mssql/

      这是一个简单的 docker 设置:

      version: "3"
      services:
        db:
          restart: on-failure:10
          image: microsoft/mssql-server-linux:latest
          environment:
            - ACCEPT_EULA=Y
            - SA_PASSWORD=SuperSecret(!)100
          ports:
            - "1433:1433"
        py:
          image: toast38coza/python-mssql
          links:
            - db
          environment:
            - SA_PASSWORD=SuperSecret(!)100
            - DB_NAME=mydb
      

      现在你可以运行了:

      docker-compose run --rm py python
      

      这将在上面的py 服务中运行 python cli

      然后尝试创建一个数据库:

      >>> import pyodbc, os
      >>> db_name = os.environ.get('DB_NAME')
      >>> pwd = os.environ.get('SA_PASSWORD')
      >>> connection_string = "driver=FreeTDS;server=db;PORT=1433 database=master;UID=sa;PWD={};TDS_Version=8.0;".format(pwd)
      >>> conn = pyodbc.connect(connection_string, autocommit=True)
      >>> conn.execute('create database {}'.format(db_name))
      <pyodbc.Cursor object at 0x7fb3067f0e70>
      

      这应该创建一个名为 mydb 的数据库(来自 docker-compose 文件环境变量的 DB_NAME)。注意:因为我们已经创建了指向db 服务(运行MS SQL)的链接,所以我们可以使用主机名db。如果您要连接到外部 MS SQL 设置,您显然不需要 db 服务(并相应地编辑您的连接字符串)

      如果您使用 Django,则有 a more complete example in the repo,但请注意,您需要 settings 看起来像这样:

      DATABASES = {
          'default': {
              'ENGINE': "sql_server.pyodbc",
              'HOST': "db",
              'PORT':'1433',
              'USER': "sa",
              'PASSWORD': os.environ.get('SA_PASSWORD'),
              'NAME': os.environ.get('DB_NAME'),
              'OPTIONS': {
                  "driver": "FreeTDS",
                  "host_is_server": True,
                  "unicode_results": True,
                  "extra_params": "tds_version=8.0",
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        我使用的是 macOS Sierra 10.12.3。 pymssql 完美地完成了这项工作。如果其他赞成的答案没有任何效果,请按照以下步骤操作:

        brew unlink freetds
        brew install homebrew/versions/freetds091
        pip install pymssql
        

        这是一个建立连接的示例 sn-p:

        conn = pymssql.connect(serverhostname, username, password, dbname)
        cursor = conn.cursor()
        cursor.execute('SELECT * FROM users')
        

        【讨论】:

          【解决方案5】:

          截至 2016 年 5 月,我已经能够简化它并反复让它在我的环境中工作:

          安装 FreeTDS

          brew install freetds --with-unixodbc
          

          安装 PYODBC

          Reference推断

          pip install -U \
              --global-option=build_ext \
              --global-option="-I/usr/local/include" \
              --global-option="-L/usr/local/lib" \
              pyodbc
          

          告诉 UnixODBC FreeTDS 驱动程序

          注意:您可能有不同的版本

          cat <<'EOF' >> /usr/local/Cellar/unixodbc/2.3.4/etc/odbcinst.ini
          [FreeTDS]
          Description=FreeTDS Driver for Linux & MSSQL on Win32
          Driver=/usr/local/lib/libtdsodbc.so
          Setup=/usr/local/lib/libtdsodbc.so
          UsageCount=1
          EOF
          

          从那里,我不得不告诉 pyodbc 使用 FreeTDS 驱动程序:

          dsn = 'DRIVER=FreeTDS;DATABASE=MyDb;SERVER=...'
          

          这太棒了,如果您在 Python 3.x 中进行异步编程,现在您可以将它与 aioodbc 一起使用:

          async with aioodbc.connect(dsn=dsn, loop=asyncio.get_event_loop()) as conn:
              async with conn.cursor() as cur:
                  await cur.execute('SELECT 42')
                  r = await cur.fetchall()
                  print(r)
          

          或者:您可以完全使用 pymssql,但如果您想使用 odbc 或 asyncio,这将不起作用。

          【讨论】:

            【解决方案6】:

            总结

            我在 Yosemite 版本 10.10.1 上使用 Mac 尝试连​​接到 MS SQL Server 数据库。我搜索并找不到更新的详细答案,所以这里有一篇文章,主要来自这篇精彩的文章here。我将它添加到 stackoverflow 以防链接失效。我们的想法是我们将有以下层来设置/连接。

            图层

            • 第 1 部分 - pyodbc
            • 第 2 部分 - freeTDS(可以使用 tsql 检查)
            • 第 3 部分 - unixODBC(可以使用 isql 检查)
            • 第 4 部分 - MS SQL(可以使用常规 python 程序检查)

            步骤

            1. here 安装 Homebrew - 这是 Mac OSX 的包管理器。本文展示了如何使用另一个包管理器“MacPorts”。根据我的指示,它们是自制的。基本上自制软件有一个文件夹“地窖”,其中包含不同版本的软件包。它不会修改您的普通文件,而是指向这些自制程序包。

            2. 我们需要安装 Pyodbc,但 pyodbc 默认使用 iODBC 驱动程序(随 mac 一起安装),但很多人在使其工作时遇到问题。因此,我们将使用一个名为unixodbc 的替代方案,我们将在未来安装它。现在,我们需要配置 pyodbc 安装,使其与 unixodbc 一起使用。

            转到 PyPi 并下载 pyodbc 压缩包并解压缩。然后在setup.py中更改这些行:

            elif sys.platform == 'darwin':
                    # OS/X now ships with iODBC.
                    settings['libraries'].append('iodbc')
            

            到:

            elif sys.platform == 'darwin':
                    # OS/X now ships with iODBC.
                    settings['libraries'].append('odbc')
            

            现在运行python setup.py install

            这使得我们的 pyodbc 安装默认使用 unixodbc 驱动程序。完美!

            1. 使用brew install freetds --with-unixodbc 安装 FreeTDS(FreeTDS 是位于 Mac ODBC 和 MS SQL Server 之间的驱动程序,this 此处的图表显示了您应该使用哪个版本的 TDS在您特定的 Microsoft Server 版本上;例如,用于 Microsoft SQL Server 2008 的 tds 协议 7.2)。

            2. 配置freetds.conf 文件(该文件应该在“/usr/local/etc/freetds.conf”中,对于 Homebrew 来说,它是一个指向“/usr/local/Cellar/”的链接freetds/0.91_2/etc',但您的可能会有所不同,具体取决于版本)。我编辑了全局并将我的数据库信息添加到末尾(出于某种原因,'tds version = 7.2' 会引发错误,但仍然可以工作,而 8.0 可以正常工作):

              [global]
              # TDS protocol version
              tds version = 8.0
              
              [MYSERVER]
              host = MYSERVER
              port = 1433
              tds version = 8.0
              
            3. 验证 FreeTDS 已正确安装tsql -S myserver -U myuser -P mypassword(如果有效,您应该会看到这样的提示)

              locale is "en_US.UTF-8"
              locale charset is "UTF-8"
              using default charset "UTF-8"
              1>
              
            4. 使用brew install unixodbc安装unixODBC

            5. 设置您的 unixODBC 配置文件,其中包括 odbcinst.ini(驱动程序配置)和 odbc.ini(DSN 配置文件)。默认情况下,我的文件位于:/Library/ODBC(注意:不是我的用户库,即 /Users/williamliu/Library)。或者它们也可能在您的自制软件安装目录/usr/local/Cellar/unixodbc/&lt;version&gt;/etc

            6. 打开您的“odbcinst.ini”文件,然后添加以下内容(注意:如果您使用 MacPorts,则不同。对于 Homebrew,此文件是指向 Homebrew 版本的链接,例如我的位于 ' /usr/local/Cellar/freetds/0.91_2/lib/libtdsodbc.so'):

              [FreeTDS]
              Description=FreeTDS Driver for Linux & MSSQL on Win32
              Driver=/usr/local/lib/libtdsodbc.so
              Setup=/usr/local/lib/libtdsodbc.so
              UsageCount=1
              
            7. 打开您的“odbc.ini”,然后添加以下内容(通常与 odbcinst.ini:

              [MYSERVER]
              Description         = Test to SQLServer
              Driver              = FreeTDS
              Trace               = Yes
              TraceFile           = /tmp/sql.log
              Database            = MYDATABASE
              Servername          = MYSERVER
              UserName            = MYUSER
              Password            = MYPASSWORD
              Port                = 1433
              Protocol            = 8.0
              ReadOnly            = No
              RowVersioning       = No
              ShowSystemTables    = No
              ShowOidColumn       = No
              FakeOidIndex        = No
              
            8. 验证 unixODBC 是否正确安装:isql MYSERVER MYUSER MYPASSWORD。如果您遇到无法连接的错误,请添加-v 以检查详细输出并修复它。否则,您应该会看到:

              +---------------------------------------+
              | Connected!                            |
              |                                       |
              | sql-statement                         |
              | help [tablename]                      |
              | quit                                  |
              |                                       |
              +---------------------------------------+ 
              
            9. 现在验证 pyodbc 工作 与 python 程序。在 shell 或 .py 文件中运行 python,你应该得到你的查询:

              import pyodbc
              import pandas
              import pandas.io.sql as psql
              
              cnxn = pyodbc.connect('DSN=MYSERVER;UID=MYUSER;PWD=MYPASSWORD')
              cursor = cnxn.cursor()
              sql = ("SELECT * FROM dbo.MYDATABASE")
              df = psql.frame_query(sql, cnxn)
              

            之后可以参考pyodbc的documentation获取更多帮助。

            【讨论】:

            • 不错的答案!我只是做了很多搜索,终于得到了这个工作。我认为您应该更改这 11 个步骤的顺序。 (在 unixodbc 之前安装 TDSServer)因为我们必须在 odbc ini 文件中指定驱动程序。此外,在安装pyodbc 时,我必须将setup.py 中的驱动程序设置从iodbc 更改为odbc 以使其使用unixodbc,然后安装它。你应该用这一步更新第二步,然后我猜答案就完成了。 :)
            • 我目前无法使用 Mac,因此无法对其进行测试,但请随时进行编辑,我会接受。
            • 我通过brew install freetds --with-unixodbc 安装了freetds,通过pip install pymssql 安装了pymssql。然后pymssql在python中运行良好
            • 新的压缩包不再包含iodbc,所以你现在应该可以跳过这一步了。
            • 我有 OSX 10.12.6 和 python 3.6,这个设置对我有用:+1:谢谢!
            【解决方案7】:

            SQLAlchemy 可能是您最好的选择。它有一个 ORM,但不需要使用它。许多 DBAPI 项目都支持 MS SQL。

            至于底层接口,以下是 SQLAlchemy 网站上列出的三个 DBAPI 项目,它们支持普通的 Python 和 Unix:

            • pymssql 似乎是最简单的设置;它不需要 FreeTDS。
            • pyodbc 似乎比 pymssql 处于更积极的开发阶段。
            • mxODBC 是许多数据库的商业许可接口。

            【讨论】:

            • 有没有人可以真正回答原来的问题?我有同样的问题,我很难找到解决方案。 Colin 的这个答案建议使用 pyodbc,但从 OP 的错误中,我们可以看到他已经在使用 pyodbc。此外,他在 OSX 上,所以 Unix 解决方案不一定适用......
            • @Dannid:最初的问题是“将运行在 OS X 上的 Python 与基于云的 SQL Server 数据库接口的好方法是什么?”,这就是我的回答。试着问你自己的问题,详细说明问题所在。
            • @Dannid:Ben Hamner 显然 asked another question 关于 pyodbc 的错误,但很遗憾,他显然不得不用“重新安装 SQL Server”锤子来解决这个问题。祝你好运!
            猜你喜欢
            • 2011-04-04
            • 2016-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-22
            • 1970-01-01
            • 1970-01-01
            • 2017-02-07
            相关资源
            最近更新 更多