2010-06-27 6 views
8

Was ist Pythons Pendant zu Perls DBI und wie benutze ich es? Genauer gesagt, was ist das Python-Äquivalent des folgenden Perl-Codes?Was ist das Python-Äquivalent von Perls DBI?

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"); 

Antwort

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-Datenbank-API ein gemeinsames convention verwenden, das ist so ziemlich das gleiche in verschiedenen Datenbanken (aber nicht ganz!). Sie können die MySQLdb-Dokumentation here lesen.

Es gibt auch eine funktionsreichere Schnittstelle zu mysql, genannt oursql. Es hat echte Parametrisierung (nicht nur glorifizierte String-Interpolation), serverseitige Cursor, Daten-Streaming und so weiter.

+0

@JanhUdec Ich sehe hier im Code keine Art von String-Interpolation in Abfragen. Um Klarheit zu bitten? – shylent

+0

Entschuldigung, Sie haben Recht. –

+1

Sollte MySQLdb.cursors.DictCursor sein, aber immer noch ein +1 für ein gutes Beispiel. –

16

Shylents Post erfüllt die Anforderung des OP nach gleichwertigem Code. Das Problem, was Python dem Perl-DBI entspricht, wird jedoch nicht angemessen behandelt.

Für diejenigen, die nicht mit Perl's DBI vertraut sind, bietet es eine gemeinsame Schnittstelle für alle Datenbanksysteme. Hinzufügen von Unterstützung für neues Speicher-Back-End, a database driver or DBD needs to be written. Drivers exist for many different database systems und sogar Nicht-Datenbankziele wie CSV-Dateien und Tabellenkalkulationen.

Es sieht so aus, als ob die Python DB-API dem Perl DBI am nächsten kommt. Es ist jedoch eine Spezifikation und keine Implementierung. Inwieweit entspricht ein Datenbanktreiber der Spezifikation bis hin zum Autor?

Natürlich unterscheiden sich Datenbanksysteme darin, welche SQL-Befehle und -Syntax sie unterstützen. Datenbanken unterscheiden sich ziemlich stark darin, welche Funktionen sie bereitstellen. Jedes System, das versucht, die Datenbankinteraktion zu standardisieren, wird Portabilitätsprobleme haben, da alle diese unterschiedlichen Systeme unterschiedliche Merkmalssätze bereitstellen.

Meine Erfahrung mit Perl DBI war sehr positiv. Es ist ziemlich einfach, portablen Code zu schreiben, der mit vielen DBD-Treibern funktioniert. Ich habe erfolgreich 4 verschiedene Datenbanktreiber (Postgres, MySQL, ein CSV-Dateitreiber und SQLite) in einer einzigen Anwendung verwendet, indem ich einfach die Datenbankverbindungszeichenfolge änderte. Für komplexere Anwendungen, die auf mehr "inkompatible" Features der Datenbank zugreifen müssen, gibt es eine Reihe von abstraction libraries, die die DBI-Schnittstelle erweitern und die Portabilität weiter vereinfachen.

Ich habe nicht genug Python Erfahrung in der Lage zu sagen, wie PEP249 spielt in der realen Welt. Meine Hoffnung ist, dass Datenbank-Treiber-Entwickler nah an der Spezifikation, und Portabilität ist leicht zu erreichen. Vielleicht wird jemand mit einem tieferen Python-Wissen in der Lage sein, dieses Thema zu erweitern. Es gibt einige information on Python database access at the Python wiki.

+4

Portable Weg in Python ist SQLAlchemy oder andere ORM zu verwenden. – jfs

Verwandte Themen