什么是Python相当于Perl的DBI,我该如何使用它?更具体地说,Python等效于以下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");
答案 0 :(得分:19)
Shylent的帖子符合OP对等效代码的要求。但是它没有充分解决Python等同于Perl DBI的问题。
对于那些不熟悉Perl's DBI的人,它为所有数据库系统提供了一个通用接口。要添加对新存储后端的支持,a database driver or DBD needs to be written。 Drivers exist for many different database systems,甚至包括CSV文件和电子表格等非数据库目标。
看起来Python DB-API是最接近Perl DBI的东西。但它是一个规范,而不是一个实现。任何数据库驱动程序在多大程度上符合作者的规范。
当然,数据库系统在它们支持的SQL命令和语法方面各不相同。数据库在它们提供的功能方面有很大差异。任何试图标准化数据库交互的系统都会有可移植性问题需要解决,因为所有这些不同的系统都提供了不同的功能集。
我对Perl DBI的经验非常积极。编写可与许多DBD驱动程序一起使用的可移植代码相当容易。我通过简单地更改数据库连接字符串,在单个应用程序中成功使用了4个不同的数据库驱动程序(Postgres,MySQL,CSV文件驱动程序和SQLite)。对于需要访问数据库的更多“不兼容”功能的更复杂的应用程序,有许多abstraction libraries扩展了DBI接口并进一步简化了可移植性。
我没有足够的Python经验能够说明 PEP249 在现实世界中如何发挥作用。我希望数据库驱动程序开发人员能够接近规范,并且易于获取可移植性。也许对Python有更深入了解的人将能够扩展这个主题。有一些information on Python database access at the Python wiki。
答案 1 :(得分:9)
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使用通用的convention,这在不同的数据库中几乎相同(但不完全!)。您可以阅读MySQLdb文档here。
还有一个功能更丰富的mysql接口,名为oursql。它具有真正的参数化(不仅仅是美化字符串插值),服务器端游标,数据流等。