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上添加它,以防链接死亡.我们的想法是,我们将有以下层来设置/连接.
图层
脚步
从这里安装Homebrew - 这是Mac OSX的软件包管理器.本文展示了如何使用另一个包管理器'MacPorts'.根据我的指示,他们是自制的.基本上自制软件有一个文件夹'cellar',可以容纳不同版本的软件包.它不是修改普通文件,而是指向这些自制程序包.
我们需要安装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驱动程序.完善!
安装FreeTDS with brew install freetds --with-unixodbc(FreeTDS是位于Mac ODBC和MS SQL Server之间的驱动程序,此图表显示了您应根据特定Microsoft Server版本使用的TDS版本;例如,适用于Microsoft SQL Server 2008的tds协议7.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)验证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)安装了unixODBC用brew install unixodbc.
设置unixODBC配置文件,包括odbcinst.ini(驱动程序配置)和odbc.ini(DSN配置文件).默认情况下,我的文件位于:( /Library/ODBC注意:不是我的用户库aka/Users/williamliu/Library).或者它们也可以在您的自制安装目录中/usr/local/Cellar/unixodbc/<version>/etc.
打开你的' 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)打开你的' 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)验证unixODBC是否正确安装:isql MYSERVER MYUSER MYPASSWORD.如果您收到无法连接的错误,请添加-v以检查详细输出是什么并进行修复.否则,您应该看到:
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
Run Code Online (Sandbox Code Playgroud)现在验证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 的文档以获得更多帮助.
SQLAlchemy可能是你最好的选择.它有一个ORM,但不需要使用它.许多DBAPI项目都支持MS SQL.
对于低级接口,这里是SQLAlchemy网站上列出的三个DBAPI项目,它们具有vanilla Python和Unix支持:
我已经能够简化这一过程,并且从2016年5月开始在我的环境中重复使用它:
brew install freetds --with-unixodbc
Run Code Online (Sandbox Code Playgroud)
从参考文献推断
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)
注意:您可能有不同的版本
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,则无法使用.