16

将在 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)')
4

7 回答 7

34

概括

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

图层

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

脚步

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

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

转到 PyPi 并下载 pyodbc tarball 并解压缩它。然后将这些行更改为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. 安装 FreeTDSbrew install freetds --with-unixodbcFreeTDS 是位于 Mac ODBC 和 MS SQL Server 之间的驱动程序,此处的图表显示了您应该使用的 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

  5. 设置您的unixODBC 配置文件,其中包括odbcinst.ini(驱动程序配置)和odbc.ini(DSN 配置文件)。默认情况下,我的文件位于:(/Library/ODBC注意:不是我的用户库,即 /Users/williamliu/Library)。或者它们也可能在您的自制软件安装目录/usr/local/Cellar/unixodbc/<version>/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 的文档以获得更多帮助。

于 2014-12-01T23:54:06.500 回答
7

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

至于较低级别的接口,以下是 SQLAlchemy 网站上列出的三个 DBAPI 项目,它们具有 vanilla Python 和 Unix 支持:

  • pymssql似乎是最简单的设置;它不需要 FreeTDS。
  • pyodbc似乎比 pymssql 处于更积极的开发阶段。
  • mxODBC是许多数据库的商业许可接口。
于 2012-07-26T22:16:12.133 回答
5

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

安装 FreeTDS

brew install freetds --with-unixodbc

安装 PYODBC

从参考推断

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=...'

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

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)

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

于 2016-05-02T15:06:18.277 回答
3

威尔的回答对我真的很有帮助。

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

  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(以及 Python 代码中)的用户 ID。

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

于 2015-05-21T14:18:06.687 回答
3

Pyodbc + MS 自己的 odbc 提供程序msodbcsql,而不是 FreeTDS。我的理由很简单——谁最有动力获得良好的 SQL Server 支持?多发性硬化症。

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

这真的很简单,主要的麻烦是他们的安装程序只适用于Homebrew,而不是我通常使用的macports 。我首先尝试将 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 上为您的 IP 启用 TCPIP。2) 在Windows 防火墙( )中打开 1433 端口wf.mscMS 配置说明

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

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

于 2017-06-27T20:53:27.647 回答
2

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

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

这是建立连接的示例片段:

conn = pymssql.connect(serverhostname, username, password, dbname)
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
于 2017-02-06T05:09:37.827 回答
0

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

经过一番努力,我设法让它与 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>

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

如果您使用的是 Django,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",
        }
    }
}
于 2017-04-11T10:28:59.450 回答