Perl DBI без доступа к базе данных - PullRequest
5 голосов
/ 12 июля 2011

Я создаю набор операторов SQL INSERT для базы данных, которая еще не существует, и сохраняю их в файл.

Как я могу использовать мощный модуль DBI Perl для создания этих операторов INSERT без доступа к конкретной базе данных. В частности, похоже, что для использования функции $dbh->quote() необходимо создать экземпляр $dbh с подключением к базе данных.

Ответы [ 6 ]

4 голосов
/ 24 апреля 2013

Обычно вы используете DBI, указав базу данных следующим образом:

my $dbh = DBI->connect("DBI:mysql:database=$db_name;host=127.0.0.1");

Однако ваша база данных еще не существует, поэтому вы не можете подключиться к ней.Вы можете использовать DBI без , указав базу данных следующим образом:

my $dbh = DBI->connect("DBI:mysql:;host=127.0.0.1");
4 голосов
/ 12 июля 2011

К сожалению, фактическое поведение quote() не всегда является переносимой характеристикой, поэтому каждый драйвер будет выполнять их по-своему.Если вы не подключитесь к драйверу, вы не знаете, какой формат цитирования использовать на практике.(Есть один модуль, который может сделать это без подключения, DBIx::Abstract, но это не особенно актуально.).

Метод quote() фактически реализован соответствующим классом драйвера, в DBD::* пространство имен.Вы можете попытаться загрузить нужный драйвер и вызвать функцию напрямую (см. http://search.cpan.org/~timb/DBI-1.616/lib/DBI/DBD.pm#Writing_DBD::Driver::db::quote), но это выглядит грязно.

Я все равно установлю соединение DBI,если только вы получите правильный формат цитирования. Вам не нужно отправлять ему какие-либо заявления, но тогда вы точно знаете, что формат цитирования будет правильным для базы данных, которую вы будете использовать.

3 голосов
/ 12 июля 2011

С DBI::quote:

Для большинства типов баз данных, по крайней мере для тех, которые соответствуют стандартам SQL, кавычка будет возвращать «Не делай» (включая внешние кавычки). Для других это может вернуть что-то вроде «Не надо»

То есть поведение DBI::quote варьируется от базы данных к базе данных, и не имеет смысла называть ее независимым от базы данных способом.

Установите тривиальное соединение с базой данных того же типа, для которого вы пишете, или изучите правила цитирования вашей базы данных и самостоятельно внедрите метод quote. См. источник DBI для справочной реализации.

1 голос
/ 13 июля 2011

Вы можете использовать DBD :: CSV или DBD :: AnyData в качестве фиктивной базы данных.SQLite тоже подходит для этой цели.

Скрытое преимущество использования SQLite в том, что это полуреальная база данных, и она будет стремиться заставить вас писать код таким образом, чтобы отделить его от любой конкретной базы данных.1003 *

0 голосов
/ 02 августа 2013

Согласно perl -MDBI -E 'say join(q{,},DBI->available_drivers);' в чистом chroot Debian с установленным только DBI (пакет «libdbi-perl»), сразу же доступны следующие драйверы:

DBM,ExampleP,File,Gofer,Proxy,Sponge

Минимальный оператор соединения DBI, который работает для меняравно

my $dbh=DBI->connect("DBI:DRIVER:");  # DRIVER is one of [DBM,File,ExampleP,Sponge,mysql,SQLite]

Этого достаточно, чтобы использовать $dbh->quote() без базы данных вообще.

DBM и Файл escape q {'} как q { \' } (стиль " mysql ");
ExampleP и Sponge escape:q { '} как q {' '} (стиль " SQLite ").

0 голосов
/ 05 мая 2012

Вы также можете использовать:

DBD::_::db->quote()

Для доступа к функции цитаты без настройки дескриптора базы данных. Я не верю, что это специфично для MySQL.

...