Python中相当于Perl DBI的是什么?

9 投票
2 回答
10155 浏览
提问于 2025-04-16 00:30

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

2 个回答

20

Shylent的帖子满足了提问者对等效代码的要求。不过,它没有很好地解决Python与Perl的DBI之间的对应关系。

对于不熟悉Perl的DBI的人来说,它提供了一个通用的接口,可以与所有数据库系统进行交互。如果想要支持新的存储后端,就需要编写一个数据库驱动程序或DBD很多不同数据库系统都有驱动程序,甚至还有针对CSV文件和电子表格等非数据库目标的驱动。

看起来Python的DB-API是最接近Perl DBI的东西。不过,它只是一个规范,而不是具体的实现。任何数据库驱动程序是否符合这个规范,完全取决于开发者。

当然,不同的数据库系统支持的SQL命令和语法各不相同。数据库在提供的功能上也有很大差异。任何试图标准化数据库交互的系统都需要解决可移植性的问题,因为这些不同的系统提供了独特的功能集。

我对Perl DBI的使用体验非常好。编写可以与多个DBD驱动程序兼容的代码相对简单。我在一个应用程序中成功使用了4种不同的数据库驱动(Postgres、MySQL、CSV文件驱动和SQLite),只需更改数据库连接字符串即可。对于需要访问更多“兼容性差”功能的复杂应用,还有一些抽象库可以扩展DBI接口,进一步简化可移植性。

我对Python的经验不够,无法判断PEP249在实际应用中的表现。我希望数据库驱动开发者能紧密遵循这个规范,这样可移植性就会变得简单。也许有更深入了解Python的人能对此进行更详细的讨论。关于Python数据库访问的信息可以在Python维基上找到。

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的数据库接口遵循一个通用的规范,这个规范在不同的数据库之间基本相同(但也有一些细微的差别)。你可以在这里查看MySQLdb的文档这里

还有一个功能更强大的MySQL接口,叫做oursql。它提供了真正的参数化(不仅仅是简单的字符串替换)、服务器端游标、数据流等功能。

撰写回答