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

kno*_*orv 9 python

什么是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");
Run Code Online (Sandbox Code Playgroud)

dao*_*oad 19

Shylent的帖子符合OP对等效代码的要求.但是,它没有充分解决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数据库访问的信息.

  • Python中的可移植方式是使用SQLAlchemy或其他ORM. (4认同)
  • 请注意,Python DB-API fetchone (row) 或 fetchmany (rows) 只能返回一个数组(呃,Python 行话中的“序列”)。没有(标准)选项可以返回关联数组(呃,Perl 术语中的“哈希”)。对我来说,不能说 row['column'] 之类的东西就像回到 1980 年代的 Basic。不过简单易学。 (2认同)

shy*_*ent 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
Run Code Online (Sandbox Code Playgroud)

Python数据库API使用一种通用约定,在不同的数据库中几乎相同(但不完全相同!).您可以在此处阅读MySQLdb文档.

还有一个功能更丰富的mysql接口,名为oursql.它具有真正的参数化(不仅仅是美化字符串插值),服务器端游标,数据流等.