2010-06-27 4 views
8

파이썬이 펄의 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 

파이썬 데이터베이스 API 공통 convention를 사용하는 거의 다른 데이터베이스에서 동일 (그러나 아주!). MySQLdb 설명서 here을 읽을 수 있습니다.

oursql이라는 mysql에 더 풍부한 기능의 인터페이스가 있습니다. 실제 매개 변수화 (문자열 보간이 아닌), 서버 측 커서, 데이터 스트리밍 등이 있습니다.

+0

@JanHudec 코드의 여기에있는 쿼리에서 문자열 보간을 볼 수 없습니다. 주의를 기울여야겠습니까? – shylent

+0

죄송합니다, 당신 말이 맞습니다. –

+1

MySQLdb.cursors.DictCursor가되어야하지만, 좋은 예제로는 여전히 +1입니다. –

16

Shylent의 게시물은 해당 코드에 대한 OP의 요청에 부합합니다. 그러나 Perl DBI와 동일한 Python이 무엇인지에 대한 문제는 적절하게 다루지 않습니다.

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 인터페이스를 확장하고 이식성을 더욱 단순화합니다.

PEP249이 어떻게 현실 세계에서 활약하는지 말할 수있는 충분한 파이썬 경험이 없습니다. 데이터베이스 드라이버 개발자가 스펙에 가깝고 이식성이 확보되기를 바랍니다. 아마도 파이썬에 대해 더 잘 알고있는 누군가가이 주제를 확장 할 수있을 것입니다. information on Python database access at the Python wiki이 있습니다.

+4

Python에서 이식 할 수있는 방법은 SQLAlchemy 또는 다른 ORM을 사용하는 것입니다. – jfs

관련 문제