2013-04-13 4 views
0

Je dois faire un script Perl pour remplir une base de données dans PostgreSQL sans utiliser DBI ni aucune sorte de modèle d'interface de base de données. Je suis un débutant à l'écriture de scripts si naturellement, je suis resté bloqué dessus pendant un bon moment. Je n'ai que ça jusqu'à maintenant.script perl sans utiliser DBI

open my $pipe, '|-', "psql -d postgres -U postgres", @options or die; 
    # NOT SURE WHAT TO DO AFTER THIS 

    close $pipe; 

edit 1: Maintenant j'essaie de faire ça.

for ($count = $iters; $count >= 1; $count--) { 
    $randdecimal = rand(); 
    $pipe "INSERT INTO random_table (runid, random_number) VALUES ($runid, $randdecimal)"; 
} 

mais il me donne une erreur de syntaxe

+0

Il serait peut-être préférable de générer un gros fichier sql, et de le renvoyer à postgres pour le lire. Interagir déclaration par déclaration via 'open' pourrait devenir terriblement compliqué. –

+2

'print $ pipe" SELECT * FROM TheTable; \ n "', mais vous feriez mieux d'utiliser DBI avec une grande marge. Ce que vous essayez n'est pas raisonnable. –

+0

Pourriez-vous en élaborer un s'il vous plaît ou peut-être fournir un exemple? – user1943079

Répondre

1

Comme les autres disent, DBI est beaucoup mieux que l'impression à un tuyau.

Cependant, il y a une maison de transition. Il suffit d'imprimer tous vos SQL pour STDOUT et faire quelque chose comme:

myscript.pl | psql -v ON_ERROR_STOP=1 --single-transaction -f - 

Cela vous permet de vérifier facilement votre sortie de script/l'envoyer à un fichier. Les options psql s'arrêtent lors de la première erreur, enveloppent tout dans une transaction et lisent depuis STDIN. Vous pouvez également utiliser les options habituelles -h/-U. Personnellement, j'ai tendance à avoir deux terminaux ouverts et à écrire simplement dans un fichier .sql puis \ i à partir d'une invite psql. J'aime avoir un enregistrement de la commande que j'ai courue.