Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server, Python e OS X


Resumo

Estou usando um Mac no Yosemite versão 10.10.1 tentando me conectar a um banco de dados MS SQL Server. Pesquisei e não consegui encontrar uma resposta detalhada atualizada, então aqui está um artigo que é principalmente deste artigo incrível aqui . Estou adicionando no stackoverflow caso o link morra. A ideia é que tenhamos as seguintes camadas para configurar/conectar.

Camadas
  • PARTE 1 - pyodbc
  • PARTE 2 - freeTDS (pode verificar com tsql)
  • PARTE 3 - unixODBC (pode verificar com o isql)
  • PARTE 4 - MS SQL (pode verificar com um programa python normal)

Etapas

  1. Instale o Homebrew de aqui - este é um gerenciador de pacotes para Mac OSX. O artigo mostra como usar outro gerenciador de pacotes 'MacPorts'. Para minhas instruções, eles estão com homebrew. Basicamente homebrew tem uma pasta 'cellar' que contém diferentes versões de pacotes. Em vez de modificar seus arquivos normais, ele aponta para esses pacotes homebrew.

  2. Precisamos instalar o Pyodbc, mas o pyodbc usa drivers iODBC por padrão (que vem instalado com o mac), mas muitas pessoas têm problemas para fazê-lo funcionar. Então, vamos usar uma alternativa chamada unixodbc , que instalaríamos no futuro. Por enquanto, precisamos configurar a instalação do pyodbc para que funcione com unixodbc.

Vá para PyPi e baixe o tarball pyodbc e descompacte-o. Em seguida, altere essas linhas em setup.py :
elif sys.platform == 'darwin':
        # OS/X now ships with iODBC.
        settings['libraries'].append('iodbc')

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

e agora execute python setup.py install .

Isso faz com que nossa instalação do pyodbc use drivers unixodbc por padrão. Perfeito!

  1. Instalar o FreeTDS com brew install freetds --with-unixodbc (FreeTDS é o driver que fica entre o Mac ODBC e o MS SQL Server, this O gráfico aqui mostra qual versão do TDS você deve usar com base em sua versão específica do Microsoft Server; por exemplo. protocolo tds 7.2 para Microsoft SQL Server 2008).

  2. Configurar freetds.conf file (O arquivo deve estar em '/usr/local/etc/freetds.conf', que para Homebrew é um link para dizer '/usr/local/Cellar/freetds/0.91_2/etc', mas o seu pode estar em algum lugar diferente dependendo da versão). Editei o global e adicionei minhas informações de banco de dados ao final (por algum motivo, 'tds version =7.2' geraria um erro, mas ainda funciona, enquanto 8.0 funciona):
    [global]
    # TDS protocol version
    tds version = 8.0
    
    [MYSERVER]
    host = MYSERVER
    port = 1433
    tds version = 8.0
    

  3. Verifique se o FreeTDS está instalado corretamente com:tsql -S myserver -U myuser -P mypassword (você deve ver um prompt como este se funcionou)
    locale is "en_US.UTF-8"
    locale charset is "UTF-8"
    using default charset "UTF-8"
    1>
    

  4. Instale o unixODBC com brew install unixodbc .

  5. Configure seus arquivos de configuração unixODBC , que inclui odbcinst.ini (configuração do driver) e odbc.ini (arquivo de configuração DSN). Por padrão, meus arquivos estavam em:/Library/ODBC (Nota:NÃO é minha biblioteca de usuários, também conhecida como /Users/williamliu/Library). Ou eles também podem estar no diretório de instalação do homebrew /usr/local/Cellar/unixodbc/<version>/etc .

  6. Abra seu 'odbcinst.ini ' e adicione o seguinte (Nota:Diferente se você usar MacPorts. Para Homebrew, este arquivo é um link para a versão homebrew, por exemplo, o meu está em '/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. Abra seu 'odbc.ini ' e, em seguida, adicione o seguinte (geralmente junto com 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. Verificar unixODBC instalado corretamente com:isql MYSERVER MYUSER MYPASSWORD . Se você receber um erro que não pode se conectar, adicione -v para verificar qual é a saída detalhada e corrigi-la. Caso contrário, você deve ver isso:
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+ 
    

  9. Agora verifique se o pyodbc funciona com um programa python. Execute python no shell ou em um arquivo .py com isso e você deve obter sua consulta de volta:
    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)
    

Você pode consultar a documentação de pyodbc para obter mais ajuda depois disso.