Python与Perl的DBI是什么等价物?

2024-09-27 20:18:22 发布

您现在位置:Python中文网/ 问答频道 /正文

Python与Perl的DBI是什么等价物?我如何使用它?更具体地说,以下Perl代码的Python等价物是什么?

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

Tags: to代码nameidexecutemyconnecttable
2条回答

Shylent的帖子满足了运营商对等效代码的要求。但是,它没有充分解决Python与Perl DBI等价的问题。

对于那些不熟悉Perl's DBI的人,它为所有数据库系统提供了一个公共接口。要添加对新存储后端的支持,a database driver or DBD needs to be writtenDrivers 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

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。它有真正的参数化(不仅仅是美化的字符串插值)、服务器端游标、数据流等等。

相关问题 更多 >

    热门问题