Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server, Python, dan OS X

Ringkasan

Saya menggunakan Mac di Yosemite Versi 10.10.1 mencoba menyambung ke database MS SQL Server. Saya mencari dan tidak dapat menemukan jawaban terperinci yang diperbarui, jadi inilah artikel yang sebagian besar berasal dari artikel luar biasa ini di sini . Saya menambahkannya di stackoverflow jika tautannya mati. Idenya adalah bahwa kita akan memiliki lapisan berikut untuk disiapkan/dihubungkan.

Lapisan

  • BAGIAN 1 - pyodbc
  • BAGIAN 2 - freeTDS (bisa dicek dengan tsql)
  • BAGIAN 3 - unixODBC (bisa dicek dengan isql)
  • BAGIAN 4 - MS SQL (dapat memeriksa dengan program python biasa)

Langkah

  1. Instal Homebrew dari di sini - ini adalah manajer paket untuk Mac OSX. Artikel ini menunjukkan cara menggunakan manajer paket lain 'MacPorts'. Untuk instruksi saya, mereka dengan homebrew. Pada dasarnya homebrew memiliki folder 'gudang' yang menyimpan berbagai versi paket. Alih-alih memodifikasi file normal Anda, itu malah menunjuk ke paket homebrew ini.

  2. Kita perlu menginstal Pyodbc, tetapi pyodbc menggunakan driver iODBC secara default (yang disertakan dengan mac), tetapi banyak orang memiliki masalah untuk membuatnya bekerja. Jadi, kita akan menggunakan alternatif yang disebut unixodbc , yang akan kami pasang di masa mendatang. Untuk saat ini, kita perlu mengonfigurasi instalasi pyodbc agar berfungsi dengan unixodbc.

Buka PyPi dan unduh tarball pyodbc dan buka kompresnya. Kemudian ubah baris ini di setup.py :

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

ke:

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

dan sekarang jalankan python setup.py install .

Ini membuat instalasi pyodbc kami menggunakan driver unixodbc secara default. Sempurna!

  1. Instal FreeTDS dengan brew install freetds --with-unixodbc (FreeTDS adalah driver yang berada di antara Mac ODBC dan MS SQL Server, ini bagan di sini menunjukkan versi TDS mana yang harus Anda gunakan berdasarkan versi Microsoft Server spesifik Anda; misalnya tds protokol 7.2 untuk Microsoft SQL Server 2008).

  2. Konfigurasikan freetds.conf file (File harus dalam '/usr/local/etc/freetds.conf', yang untuk Homebrew adalah tautan untuk mengatakan '/usr/local/Cellar/freetds/0.91_2/etc', tetapi milik Anda mungkin berbeda tergantung versi). Saya mengedit global dan menambahkan info basis data saya sampai akhir (untuk beberapa alasan 'tds version =7.2' akan menimbulkan kesalahan, tetapi masih berfungsi, sementara 8.0 hanya berfungsi):

    [global]
    # TDS protocol version
    tds version = 8.0
    
    [MYSERVER]
    host = MYSERVER
    port = 1433
    tds version = 8.0
    
  3. Verifikasi FreeTDS terpasang benar dengan:tsql -S myserver -U myuser -P mypassword (Anda akan melihat prompt seperti ini jika berhasil)

    locale is "en_US.UTF-8"
    locale charset is "UTF-8"
    using default charset "UTF-8"
    1>
    
  4. Instal unixODBC dengan brew install unixodbc .

  5. Siapkan file konfigurasi unixODBC . Anda , yang mencakup odbcinst.ini (konfigurasi driver), dan odbc.ini (file konfigurasi DSN). Secara default, file saya berada di:/Library/ODBC (Catatan:BUKAN perpustakaan pengguna saya alias /Users/williamliu/Library). Atau bisa juga di direktori instalasi homebrew Anda /usr/local/Cellar/unixodbc/<version>/etc .

  6. Buka 'odbcinst.ini . Anda ' dan kemudian tambahkan yang berikut (Catatan:Berbeda jika Anda menggunakan MacPorts. Untuk Homebrew, file ini adalah tautan ke versi homebrew mis. milik saya ada di '/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. Buka 'odbc.ini . Anda ' dan kemudian tambahkan yang berikut (ini biasanya bersama dengan 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. Verifikasi unixODBC diinstal dengan benar dengan:isql MYSERVER MYUSER MYPASSWORD . Jika Anda mendapatkan kesalahan bahwa Anda tidak dapat terhubung, tambahkan -v untuk memeriksa apa keluaran verbose dan memperbaikinya. Jika tidak, Anda akan melihat ini:

    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+ 
    
  9. Sekarang verifikasi pyodbc berfungsi dengan program python. Jalankan python di shell atau file .py dengan ini dan Anda akan mendapatkan kembali kueri Anda:

    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)
    

Anda dapat merujuk ke dokumentasi dari pyodbc untuk mendapatkan bantuan lebih lanjut setelah ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. masukkan ke dalam nilai dengan klausa where

  2. Mengapa saya mendapatkan Procedure mengharapkan parameter '@statement' dari tipe 'ntext/nchar/nvarchar'. ketika saya mencoba menggunakan sp_executesql?

  3. XPath untuk mengambil nilai SQL XML

  4. Apakah kolom TimeStamp unik?

  5. Bagaimana cara mendapatkan perbedaan antara dua baris untuk bidang kolom?