2011-07-12 26 views
5

Estoy creando un conjunto de sentencias SQL INSERT para una base de datos que aún no existe, y las estoy guardando en un archivo.Perl DBI sin acceder a la base de datos

¿Cómo puedo utilizar el potente módulo DBI de Perl para crear esas instrucciones INSERT sin acceder a una base de datos específica. En particular, parece que usar la función $dbh->quote() requiere que haga una instancia de $dbh con una conexión a una base de datos.

+1

SQL es solo texto ... crea las cadenas de consulta y guárdalas. No es necesario involucrar a DBI. La cotización de DBI() suele ser solo un acceso directo a la función de presupuesto de la base de datos, por lo que no se puede realizar sin una conexión de base de datos, de lo contrario, DBI no sabrá a qué función de presupuesto de la unidad llamar. –

Respuesta

4

Desafortunadamente, el comportamiento real de quote() no siempre es una característica portátil, por lo que cada controlador lo hará de manera diferente. A menos que se conecte a un controlador, no sabe qué formato de cita usar en la práctica. (Hay un módulo que puede hacer esto sin una conexión, DBIx::Abstract, pero no es especialmente actual).

El método quote() es realmente implementado por la clase de controlador correspondiente, en el espacio de nombres DBD::*. Usted podría intentar cargar el controlador que necesita y llamar a la función directamente (consulte http://search.cpan.org/~timb/DBI-1.616/lib/DBI/DBD.pm#Writing_DBD::Driver::db::quote) pero esto se siente sucio.

Todavía haría una conexión DBI, solo para que pueda obtener el formato correcto de cotización. No necesita enviar ninguna declaración, pero sí sabe que el formato de cotización será correcto para la base de datos que usará.

3

De DBI::quote:

Para la mayoría de los tipos de bases de datos, por lo menos aquellos que se ajusten a las normas SQL, cita volvería 'Don''t' (incluyendo las comillas externas). Para otros, puede volver algo así como 'Don \' t'

es decir, el comportamiento de DBI::quote varía de base de datos para la base de datos, y que no tiene sentido llamarlo de una manera independiente de la base de datos.

Realice una conexión trivial a una base de datos del mismo tipo para la que está escribiendo, o conozca las convenciones de cotización de su base de datos e implemente usted mismo un método quote. Vea el DBI source para una implementación de referencia.

1

Puede usar DBD :: CSV o DBD :: AnyData como una base de datos ficticia. SQLite también es bueno para este propósito.

Una ventaja oculta de usar SQLite aquí es que es una base de datos semi-real, y tenderá a hacerte escribir código de una manera que está desacoplada de cualquier base de datos específica.

-1

También puede utilizar:

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

Para acceder a la función presupuesto sin la creación de un mango de base de datos. Aunque no creo que sea específico de MySQL.

4

lo general, se usaría DBI mediante la especificación de una base de datos de este modo:

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

Sin embargo, la base de datos aún no existe por lo que no puede conectarse a él.Puede utilizar DBI sin especificar una base de datos de este modo:

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

Según perl -MDBI -E 'say join(q{,},DBI->available_drivers);' en jaula Debian limpia sólo con DBI (paquete "libdbi-perl") instalados los siguientes controladores están disponibles de inmediato:

DBM,ExampleP,File,Gofer,Proxy,Sponge 

La sentencia de conexión DBI mínimo que funciona para mí es

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

Eso es suficiente para usar $dbh->quote() sin base de datos alguna.

DBM y Archivo de escape q {'} {q como \'} ("mysql " estilo);
ExampleP y Esponja de escape: {q '} {q como ''} ("SQLite" estilo).

Cuestiones relacionadas