2010-06-27 24 views
8

¿Cuál es el equivalente de Python al DBI de Perl y cómo lo uso? Más específicamente, ¿cuál es el equivalente Python del siguiente código Perl?¿Cuál es el equivalente 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"); 

Respuesta

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 API de base de datos común utilizar un convention, que es más o menos la misma a través de diferentes bases de datos (pero no del todo!). Puede leer la documentación de MySQLdb here.

También hay una interfaz más rica en características para mysql, llamada oursql. Tiene una parametrización real (no solo la interpolación de cadenas glorificada), cursores del lado del servidor, transmisión de datos, etc.

+0

@JanHudec No veo ningún tipo de interpolación de cadena en las consultas aquí, en el código. Cuidado para aclarar? – shylent

+0

Lo sentimos, tienes razón. –

+1

Debe ser MySQLdb.cursors.DictCursor, pero sigue siendo un +1 para un buen ejemplo. –

16

La publicación de Shylent cumple con la solicitud del OP para obtener un código equivalente. Sin embargo, no aborda adecuadamente el problema de cuál es el equivalente de Python al DBI de Perl.

Para quienes no estén familiarizados con Perl's DBI, proporciona una interfaz común para todos los sistemas de bases de datos. Para agregar soporte para el nuevo back-end de almacenamiento, a database driver or DBD needs to be written. Drivers exist for many different database systems, e incluso objetivos que no son de base de datos, como archivos CSV y hojas de cálculo.

Parece que el Python DB-API es lo más parecido a Perl DBI. Sin embargo, es una especificación, y no una implementación. Hasta qué punto cualquier controlador de base de datos cumple con la especificación hasta el autor.

Por supuesto, los sistemas de bases de datos varían en qué comandos SQL y la sintaxis soportan. Las bases de datos varían bastante en las características que proporcionan. Cualquier sistema que intente estandarizar la interacción de la base de datos tendrá problemas de portabilidad para abordar ya que todos estos sistemas diferentes proporcionan conjuntos de características distintas.

Mi experiencia con Perl DBI ha sido muy positiva. Es bastante fácil escribir código portátil que funcione con muchos controladores DBD. He utilizado con éxito 4 diferentes controladores de base de datos (Postgres, MySQL, un controlador de archivo CSV y SQLite) en una sola aplicación simplemente cambiando la cadena de conexión de la base de datos. Para aplicaciones más complejas que necesitan acceder a más características "incompatibles" de la base de datos, hay una serie de abstraction libraries que extienden la interfaz DBI y simplifican aún más la portabilidad.

No tengo suficiente experiencia en Python para poder decir cómo PEP249 se juega en el mundo real. Mi esperanza es que los desarrolladores de controladores de bases de datos estén cerca de las especificaciones, y la portabilidad es fácil de obtener. Quizás alguien con un conocimiento más profundo de Python podrá ampliar este tema. Hay algunos information on Python database access at the Python wiki.

+4

La forma portátil en Python es usar SQLAlchemy u otro ORM. – jfs

Cuestiones relacionadas