Resumen
Estoy usando una Mac en Yosemite versión 10.10.1 tratando de conectarme a una base de datos de MS SQL Server. Busqué y no pude encontrar una respuesta detallada actualizada, así que aquí hay un artículo que proviene principalmente de este increíble artículo aquí . Lo estoy agregando en stackoverflow en caso de que el enlace muera. La idea es que tendremos las siguientes capas para configurar/conectar.
Capas
- PARTE 1 - pyodbc
- PARTE 2:freeTDS (puede consultar con tsql)
- PARTE 3 - unixODBC (puede consultar con isql)
- PARTE 4:MS SQL (se puede verificar con un programa Python normal)
Pasos
-
Instalar Homebrew desde aquí - este es un administrador de paquetes para Mac OSX. El artículo muestra cómo usar otro administrador de paquetes 'MacPorts'. Para mis instrucciones, son con homebrew. Básicamente, homebrew tiene una carpeta 'bodega' que contiene diferentes versiones de paquetes. En lugar de modificar sus archivos normales, apunta a estos paquetes homebrew.
-
Necesitamos instalar Pyodbc, pero pyodbc usa controladores iODBC de forma predeterminada (que viene instalado con Mac), pero muchas personas tienen problemas para que funcione. Entonces, vamos a usar una alternativa llamada
unixodbc
, que instalaríamos en el futuro. Por ahora, necesitamos configurar la instalación de pyodbc para que funcione con unixodbc.
Vaya a PyPi y descargue pyodbc tarball y descomprímalo. Luego cambie estas líneas en setup.py
:
elif sys.platform == 'darwin':
# OS/X now ships with iODBC.
settings['libraries'].append('iodbc')
a:
elif sys.platform == 'darwin':
# OS/X now ships with iODBC.
settings['libraries'].append('odbc')
y ahora ejecute python setup.py install
.
Esto hace que nuestra instalación de pyodbc utilice controladores unixodbc de forma predeterminada. ¡Perfecto!
-
Instalar FreeTDS con
brew install freetds --with-unixodbc
(FreeTDS es el controlador que se encuentra entre Mac ODBC y MS SQL Server, esto el gráfico aquí muestra qué versión de TDS debe usar en función de su versión específica de Microsoft Server; p.ej. protocolo tds 7.2 para Microsoft SQL Server 2008). -
Configurar
freetds.conf
(El archivo debe estar en '/usr/local/etc/freetds.conf', que para Homebrew es un enlace para decir '/usr/local/Cellar/freetds/0.91_2/etc', pero el suyo podría estar en otro lugar dependiendo de la versión). Edité el global y agregué la información de mi base de datos al final (por alguna razón, 'tds version =7.2' arrojaría un error, pero aún funciona, mientras que 8.0 solo funciona):[global] # TDS protocol version tds version = 8.0 [MYSERVER] host = MYSERVER port = 1433 tds version = 8.0
-
Verificar FreeTDS instalado correctamente con:
tsql -S myserver -U myuser -P mypassword
(Debería ver un aviso como este si funcionó)locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" 1>
-
Instalar unixODBC con
brew install unixodbc
. -
Configure sus archivos de configuración de unixODBC , que incluye odbcinst.ini (configuración del controlador) y odbc.ini (archivo de configuración de DSN). Por defecto, mis archivos estaban en:
/Library/ODBC
(Nota:NO es mi biblioteca de usuario, también conocida como /Users/williamliu/Library). O también podrían estar en el directorio de instalación de homebrew/usr/local/Cellar/unixodbc/<version>/etc
. -
Abra su 'odbcinst.ini ' y luego agregue lo siguiente (Nota:diferente si usa MacPorts. Para Homebrew, este archivo es un enlace a la versión homebrew, por ejemplo, el mío está en '/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
-
Abra su 'odbc.ini ' y luego agregue lo siguiente (generalmente junto con
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
-
Verificar unixODBC instalado correctamente con:
isql MYSERVER MYUSER MYPASSWORD
. Si recibe un error que indica que no puede conectarse, agregue-v
para comprobar cuál es el resultado detallado y solucionarlo. De lo contrario, debería ver esto:+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+
-
Ahora verifique que pyodbc funcione con un programa python. Ejecute python en el shell o un archivo .py con esto y debería recuperar su consulta:
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)
Puede consultar la documentación . de pyodbc para obtener más ayuda después de esto.