2010-06-27 6 views
8

Quel est l'équivalent Python de DBI de Perl et comment l'utiliser? Plus précisément, quel est l'équivalent Python du code Perl suivant?Quel est l'équivalent Python de DBI de 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"); 

Répondre

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 

API de base de données Python utilisent une convention commune, qui est à peu près les mêmes dans différentes bases de données (mais pas tout à fait!). Vous pouvez lire la documentation MySQLdb here.

Il existe également une interface plus riche en fonctionnalités pour mysql, appelée oursql. Il a une paramétrisation réelle (pas seulement une interpolation de chaîne glorifiée), des curseurs côté serveur, le streaming de données et ainsi de suite.

+0

@JanHudec Je ne vois aucun type d'interpolation de chaîne dans les requêtes ici, dans le code. Vous voulez clarifier? – shylent

+0

Désolé, vous avez raison. –

+1

Devrait être MySQLdb.cursors.DictCursor, mais toujours un +1 pour un bon exemple. –

16

Le poteau de Shylent répond à la demande de l'OP pour un code équivalent. Cependant, cela ne résout pas adéquatement le problème de l'équivalent de Python en Perl DBI.

Pour ceux qui ne connaissent pas Perl's DBI, il fournit une interface commune pour tous les systèmes de base de données. Pour ajouter la prise en charge du nouveau backend de stockage, a database driver or DBD needs to be written. Drivers exist for many different database systems, et même des cibles non-base de données comme les fichiers CSV et les feuilles de calcul.

Il semble que le Python DB-API soit le plus proche de Perl DBI. Cependant, il s'agit d'une spécification et non d'une implémentation. Dans quelle mesure tout pilote de base de données est conforme à la spécification jusqu'à l'auteur.

Bien sûr, les systèmes de bases de données varient en ce qui concerne les commandes SQL et la syntaxe qu'ils prennent en charge. Les bases de données varient un peu dans les fonctionnalités qu'ils fournissent. Tout système qui tente de standardiser l'interaction avec la base de données aura des problèmes de portabilité à résoudre car tous ces systèmes différents fournissent des ensembles de fonctionnalités distincts. Mon expérience avec Perl DBI a été très positive. Il est assez facile d'écrire du code portable qui fonctionne avec de nombreux pilotes DBD. J'ai utilisé avec succès 4 pilotes de base de données différents (Postgres, MySQL, un pilote de fichier CSV et SQLite) dans une seule application en changeant simplement la chaîne de connexion à la base de données. Pour les applications plus complexes qui ont besoin d'accéder à des fonctionnalités plus "incompatibles" de la base de données, un certain nombre de abstraction libraries étendent l'interface DBI et simplifient davantage la portabilité.

Je n'ai pas assez d'expérience Python pour pouvoir dire comment PEP249 joue dans le vrai monde. Mon espoir est que les développeurs de pilotes de bases de données sont proches de la spécification, et la portabilité est facile à obtenir. Peut-être que quelqu'un avec une connaissance plus approfondie de Python sera en mesure de développer sur ce sujet. Il y a quelques information on Python database access at the Python wiki.

+4

Portable en Python est d'utiliser SQLAlchemy ou autre ORM. – jfs

Questions connexes