SQL Server,Python和OS X.

Ben*_*ner 15 python sql-server macos pyodbc

将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)')
Run Code Online (Sandbox Code Playgroud)

Wil*_*ill 32

摘要

我在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'.根据我的指示,他们是自制的.基本上自制软件有一个文件夹'cellar',可以容纳不同版本的软件包.它不是修改普通文件,而是指向这些自制程序包.

  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')
Run Code Online (Sandbox Code Playgroud)

至:

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

现在跑python setup.py install.

这使我们的pyodbc安装默认使用unixodbc驱动程序.完善!

  1. 安装FreeTDS with brew install freetds --with-unixodbc(FreeTDS是位于Mac ODBC和MS SQL Server之间的驱动程序,图表显示了您应根据特定Microsoft Server版本使用的TDS版本;例如,适用于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
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 安装了unixODBCbrew install unixodbc.

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

  6. 打开你的' odbcinst.ini '文件,然后添加以下内容(注意:如果你使用MacPorts则不同.对于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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  8. 验证unixODBC是否正确安装:isql MYSERVER MYUSER MYPASSWORD.如果您收到无法连接的错误,请添加-v以检查详细输出是什么并进行修复.否则,您应该看到:

    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+ 
    
    Run Code Online (Sandbox Code Playgroud)
  9. 现在验证pyodbc是否与python程序一起使用.在shell中运行python或使用此文件运行.py文件,你应该得到你的查询:

    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)
    
    Run Code Online (Sandbox Code Playgroud)

您可以参考pyodbc 的文档以获得更多帮助.

  • 很好的答案!我刚做了很多搜索,终于搞定了.我认为你应该改变这11个步骤的顺序.(在unixodbc之前安装TDSServer)因为我们必须在odbc ini文件中指定驱动程序.另外,在安装`pyodbc`时,我不得不将`setup.py`中的设置从`iodbc`更改为`odbc`以使其使用unixodbc,然后安装它.您应该使用此步骤更新第二步,然后我猜答案将完成.:) (3认同)
  • 我已经通过`brew install freetds --with-unixodbc`安装了freetds,并通过`pip install pymssql`安装了pymssql.然后pymssql在python中运行良好 (2认同)
  • 新的tarball不再包含`iodbc`,所以你现在应该可以跳过这一步了. (2认同)

Col*_*lau 7

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

对于低级接口,这里是SQLAlchemy网站上列出的三个DBAPI项目,它们具有vanilla Python和Unix支持:

  • pymssql似乎是最简单的设置; 它不需要FreeTDS.
  • pyodbc似乎比pymssql更活跃.
  • mxODBC是许多数据库的商业许可接口.

  • 有人有可能真正回答原来的问题吗?我有同样的问题,我很难找到解决方案.Colin的回答建议使用pyodbc,但是从OP的错误中,我们可以看到他已经在使用pyodbc了.此外,他在OSX上,所以Unix解决方案不一定适用...... (6认同)
  • @Dannid:最初的问题是“将 OS X 上运行的 Python 与基于云的 SQL Server 数据库连接起来的好方法是什么?”,这就是我的回答。试着问你自己的问题,详细说明出了什么问题。 (2认同)

ner*_*ler 5

我已经能够简化这一过程,并且从2016年5月开始在我的环境中重复使用它:

安装FreeTDS

brew install freetds --with-unixodbc
Run Code Online (Sandbox Code Playgroud)

安装PYODBC

参考文献推断

pip install -U \
    --global-option=build_ext \
    --global-option="-I/usr/local/include" \
    --global-option="-L/usr/local/lib" \
    pyodbc
Run Code Online (Sandbox Code Playgroud)

告诉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
Run Code Online (Sandbox Code Playgroud)

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

dsn = 'DRIVER=FreeTDS;DATABASE=MyDb;SERVER=...'
Run Code Online (Sandbox Code Playgroud)

这很棒,因为现在你可以使用它,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)
Run Code Online (Sandbox Code Playgroud)

或者:您可以使用pymssqlflat out,但如果您想使用odbc或asyncio,则无法使用.