2010-06-27 8 views
8

Qual è l'equivalente Python del DBI di Perl e come si usa? Più specificamente, qual è l'equivalente Python del seguente codice Perl? utilizzareQual è l'equivalente Python del DBI di Perl?

use DBI; 

# connect to a MySQL database 
my $dbh = DBI->connect("dbi:mysql:database=$database; host=localhost; port=3306", $user, $pass); 

# select and read a few rows 
my $sth = $dbh->prepare("SELECT id, name FROM table WHERE id <= ?;"); 
$sth->execute(321); 
while (my @row = $sth->fetchrow_array) { 
    my $id = $row[0]; 
    my $name = $row[1]; 
    print "$id. $name\n"; 
} 

# write to the database 
$sth = $dbh->prepare("INSERT INTO table (id, name) VALUES (?, ?);"); 
$sth->execute(123, "foo"); 

risposta

8
import MySQLdb.cursors 

db = MySQLdb.connect(db=database, host=localhost, 
        port=3306, user=user, passwd=pass, 
        cursorclass=MySQLdb.cursors.DictCursor) 
cur = db.cursor() 

#this is not string interpolation, everything is quoted for you automatically 
cur.execute("select id, name from table where id = %s", (321,)) 

for row in cur.fetchall(): 
    print "%s. %s" % (row['id'], row['name']) 

cur.execute("insert into table (id, name) values (%s, %s)", (123, 'foo')) 
db.commit() # required, because autocommit is off by default 

Python banca dati API un comune convention, che è più o meno lo stesso in diversi database (ma non del tutto!). È possibile leggere la documentazione di MySQLdb here.

C'è anche un'interfaccia più ricca di funzionalità per mysql, chiamata oursql. Ha una vera parametrizzazione (non solo un'interpolazione di stringa glorificata), cursori sul lato server, streaming di dati e così via.

+0

@JanHudec Non riesco a vedere alcun tipo di interpolazione di stringa nelle query qui, nel codice. Cura di chiarire? – shylent

+0

Siamo spiacenti, hai ragione. –

+1

Dovrebbe essere MySQLdb.cursors.DictCursor, ma ancora un +1 per un buon esempio. –

16

Il post di Shylent soddisfa la richiesta dell'OP di codice equivalente. Tuttavia non affronta adeguatamente il problema di ciò che è l'equivalente di Python al DBI Perl.

Per chi non ha familiarità con Perl's DBI, fornisce un'interfaccia comune per tutti i sistemi di database. Per aggiungere supporto per il nuovo back-end di archiviazione, a database driver or DBD needs to be written. Drivers exist for many different database systems e anche target non di database come file CSV e fogli di calcolo.

Sembra che lo Python DB-API sia la cosa più vicina al DBI Perl. Tuttavia è una specifica e non un'implementazione. In che misura qualsiasi driver di database è conforme alle specifiche fino all'autore.

Naturalmente, i sistemi di database variano in quali comandi SQL e sintassi supportano. I database variano un po 'in che caratteristiche forniscono. Qualsiasi sistema che tenti di standardizzare l'interazione con il database avrà problemi di portabilità da affrontare in quanto tutti questi diversi sistemi forniscono serie di funzioni distinte.

La mia esperienza con Perl DBI è stata molto positiva. È abbastanza facile scrivere codice portatile che funzioni con molti driver DBD. Ho usato con successo 4 diversi driver di database (Postgres, MySQL, un driver di file CSV e SQLite) in una singola applicazione semplicemente cambiando la stringa di connessione del database. Per le app più complesse che devono accedere a più funzioni "incompatibili" del database, esiste un numero di abstraction libraries che estende l'interfaccia DBI e semplifica ulteriormente la portabilità.

Non ho abbastanza esperienza di Python per poter dire come PEP249 si svolge nel mondo reale. La mia speranza è che gli sviluppatori di driver di database si avvicinino alle specifiche e la portabilità è facile da ottenere. Forse qualcuno con una conoscenza più approfondita di Python sarà in grado di approfondire questo argomento. C'è un po 'di information on Python database access at the Python wiki.

+4

Un modo portatile in Python è usare SQLAlchemy o altri ORM. – jfs

Problemi correlati