Domanda

Ho mssql 2005 in esecuzione sul mio personal computer con un database su cui vorrei eseguire alcuni script Python. Sto cercando un modo per fare un accesso davvero semplice ai dati. Vorrei eseguire alcune istruzioni selezionate, elaborare i dati e magari avere Python per salvare un file di testo con i risultati.

Sfortunatamente, anche se so un po 'di Python e un po' di database, per me è molto difficile dire, solo leggendo, se una libreria fa quello che voglio. Idealmente, vorrei qualcosa che funzioni con altre versioni di mssql, è gratuito e concesso in licenza per consentire l'uso commerciale, è semplice da usare e forse funziona con ironpython.

È stato utile?

Soluzione

Uso SQL Alchemy con cPython (non so se funzionerà con IronPython) . Ti sarà abbastanza familiare se hai usato Hibernate / nHibernate. Se è un po 'troppo prolisso per te, puoi usare Elisir , che è un sottile strato in cima di SQL Alchemy. Per utilizzare uno di questi, è necessario pyodbc , ma è un'installazione piuttosto semplice.

Ovviamente, se vuoi scrivere direttamente SQL e non usare un ORM, devi solo pyodbc.

Altri suggerimenti

Tutti gli altri sembrano avere il cPython - > Lato server SQL coperto. Se si desidera utilizzare IronPython, è possibile utilizzare l'API ADO.NET standard per parlare con il database:

import clr
clr.AddReference('System.Data')
from System.Data.SqlClient import SqlConnection, SqlParameter

conn_string = 'data source=<machine>; initial catalog=<database>; trusted_connection=True'
connection = SqlConnection(conn_string)
connection.Open()
command = connection.CreateCommand()
command.CommandText = 'select id, name from people where group_id = @group_id'
command.Parameters.Add(SqlParameter('group_id', 23))

reader = command.ExecuteReader()
while reader.Read():
    print reader['id'], reader['name']

connection.Close()

Se hai già IronPython, non devi installare nient'altro.

Molti documenti disponibili qui e qui .

pyodbc viene fornito con Activestate Python, che può essere scaricato da qui . Uno script odbc minimo per connettersi a un database SQL Server 2005 è simile al seguente:

import odbc

CONNECTION_STRING="""
Driver={SQL Native Client};
Server=[Insert Server Name Here];
Database=[Insert DB Here];
Trusted_Connection=yes;
"""

db = odbc.odbc(CONNECTION_STRING)
c = db.cursor()
c.execute ('select foo from bar')
rs = c.fetchall()
for r in rs:
    print r[0]

Uso anche pymssql con successo con CPython. (Con e senza SQLAlchemy).

http://adodbapi.sourceforge.net/ può essere utilizzato con CPython o IronPython. Ne sono rimasto molto soddisfatto.

PyPyODBC ( http://code.google.com/p/pypyodbc ) funziona con PyPy, Ironpython e CPython.

Questo articolo mostra un esempio Hello World di accesso a mssql in Python.

PyPyODBC ha quasi lo stesso utilizzo di pyodbc, poiché può essere visto come una re-implementazione del pyodbc moudle. Poiché è scritto in puro Python, può anche essere eseguito su IronPython e PyPy.

In realtà, quando passi a pypyodbc nello script esistente, puoi farlo:

#import pyodbc               <-- Comment out the original pyodbc importing line

import pypyodbc as pyodbc    # Let pypyodbc "pretend" the pyodbc

pyodbc.connect(...)          # pypyodbc has 99% same APIs as pyodbc

...

Ho usato pymssql con Python standard e mi è piaciuto. Probabilmente più facile delle alternative menzionate se stai solo alla ricerca di un accesso di base al database.

Esempio code .

Se vuoi il modo più veloce e sporco con CPython (funziona anche con 3.X python):

Installa PYWIN32 dopo aver installato python http://sourceforge.net/projects/pywin32/files / pywin32 /

Importa la seguente libreria: import odbc

Ho creato il seguente metodo per ottenere il driver odbc di SQL Server (è leggermente diverso nella denominazione a seconda della versione di Windows, quindi questo lo otterrà indipendentemente):

def getSQLServerDriver():
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\ODBC\ODBCINST.INI")
    sqlServerRegExp =  re.compile('sql.*server', re.I | re.S)

    try:
        for i in range(0, 2048):
            folder = winreg.EnumKey(key, i)
            if sqlServerRegExp.match(folder):
                return folder.strip()
    except WindowsError:
        pass

Nota: se si utilizza la funzione sopra, è necessario importare anche queste due librerie: winreg e re

Quindi usi le informazioni API 1 di odbc come definite qui: http: // www .python.org / dev / PEP / pep-0248 /

La stringa dell'interfaccia di connessione dovrebbe assomigliare a questa (supponendo che tu stia utilizzando il mio metodo sopra per ottenere il nome del driver ODBC, ed è una connessione affidabile):

dbString = "Driver={SQLDriver};Server=[SQL Server];Database=[Database Name];Trusted_Connection=yes;".replace('{SQLDriver}', '{' + getSQLServerDriver() + '}')

Questo metodo ha molti lati negativi. È goffo perché supporta solo l'API ODBC 1 e ci sono un paio di bug minori nell'API o nel driver ODBC che ho incontrato, ma fa il lavoro in tutte le versioni di CPython in Windows.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top