2010-06-27 4 views
8

Что такое эквивалент Python для DBI Perl и как его использовать? В частности, что такое эквивалент Python следующего кода Perl?Что такое эквивалент Python для DBI 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"); 

ответ

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

+0

Извините, вы правы. –

+1

Должен быть MySQLdb.cursors.DictCursor, но все еще +1 для хорошего примера. –

16

Сообщение Шейлента удовлетворяет запросам OP для эквивалентного кода. Однако он не позволяет адекватно решить вопрос о том, что эквивалентно Python для Perl DBI.

Для тех, кто не знаком с 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 и еще больше упрощают переносимость.

У меня недостаточно опыта работы с Python, чтобы иметь возможность сказать, как PEP249 играет в реальном мире. Я надеюсь, что разработчики драйверов баз данных подходят к спецификации, а переносимость легко получить. Возможно, кто-то с более глубоким знанием Python сможет расширить эту тему. Есть information on Python database access at the Python wiki.

+4

Переносной способ в Python - использовать SQLAlchemy или другую ORM. – jfs

Смежные вопросы