2010-06-27 70 views
8

什麼是Python的Perl的DBI的等價物,我該如何使用它?更具體地說,以下Perl代碼的Python等價物是什麼?什麼是Perl的DBI的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"); 

回答

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使用通用convention,這是相當多在不同的數據庫中相同(但不完全!)。您可以閱讀MySQLdb文檔here

還有一個功能豐富的mysql接口,稱爲oursql。它具有真正的參數化(不僅僅是優化的字符串插值),服務器端遊標,數據流等。

+0

@JanHudec我在代碼中看不到任何類型的查詢中的字符串插值。謹慎澄清? – shylent 2012-11-04 22:08:25

+0

對不起,你是對的。 – 2012-11-05 09:28:50

+1

應該是MySQLdb.cursors.DictCursor,但仍然是一個很好的示例+1。 – 2012-11-11 16:41:52

16

Shylent的帖子符合OP對等效代碼的要求。但是,它並沒有充分解決Python與Perl DBI等價的問題。

對於那些不熟悉Perl's DBI的人,它爲所有數據庫系統提供了一個通用接口。添加對新存儲後端的支持,a database driver or DBD needs to be writtenDrivers exist for many different database systems,甚至非CSV數據庫目標,如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

+4

Python中的可移植方式是使用SQLAlchemy或其他ORM。 – jfs 2010-06-28 04:48:10

相關問題