[postgresql] dblink naar mysql

Pagina: 1
Acties:

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22-08 23:20
Ik weet uberhaupt niet of het mogelijk is, maar ik wil eigenlijk een dblink van postgresql naar mysql opzetten. Ik heb namelijk een centrale mysql database die ik gebruik voor logging en ben nu aan het experimenteren met postgresql (en wil toch kunnen loggen).

Nu weet ik dat postgresql een dblink snapt, kan daar alleen niet zo veel documentatie over vinden (helaas).

is het mogelijk mogelijk om een dblink naar een ander type database vanuit postgresql, of moet dit weer zo'n vieze constructie met bestandje schrijven, cron-entry met directory scanner en scriptje dat insert doet in mysql worden?

Egoist: A person of low taste, more interested in themselves than in me


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik denk dat dat niet mogelijk is, vooral ook omdat mysql's sql-dialect op veel punten van de standaard verschilt en postgresql's dialect ook nog eens niet 100% conform de standaard is.

Veel datatypen worden (iets) anders behandelt, controles zijn vaak (een stuk) strenger en zo zijn er meer significante verschillen tussen postgresql en mysql.

Maar afhankelijk van wat je precies wilt synchroniseren wordt je heus niet verplicht om een "vieze" oplossing te maken.

Perl of PHP-scripts kunnen bijvoorbeeld prima naar beide databases tegelijk verbinden en de data, als een middle-man, doorsluizen en eventueel omvormen waar nodig.

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22-08 23:20
perl.. je zegt perl... zou dat met plperl ook kunnen? (of is het niet mogelijk om bestanden van het filesystem te includen?)

Egoist: A person of low taste, more interested in themselves than in me


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Bij mijn weten kan je in plperl gewoon alles wat gewoon in perl kan.

dus dat zou inclusief dbi moeten zijn, zou natuurlijk wel een erg handige oplossing, zij het wat bewerkelijk, zijn :)

't Is alleen helaas nog wel redelijk beperkt zo te zien:
http://www.postgresql.org...3&idoc=1&file=plperl.html

[ Voor 27% gewijzigd door ACM op 23-05-2003 21:57 ]


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22-08 23:20
de postgresql manual, chapter 21.4 (heb m lokaal staan, dus link is lastig dan ;) ) heeft het over untrusted perl en trusted perl. Met untrusted perl moet het mogelijk zijn, want die kan idd dbi requiren en de benodigde acties uitvoeren (trusted perl kan wel eens moeilijk gaan doen, omdat bepaalde functionaliteit beperkt is).

Op zich is het niet zo onwijs bewerkelijk, aangezien het om 1 functie gaat die niets meer doet dan een insert in een mysql tabel en controleerd of dat goed gaat. De connectdata kan ik eventueel als parameter zelfs meegeven aan de functie (om het geheel toch maar in postgresql te houden).

Heb echt een beetje eureka gevoel 8) , terwijl de oplossing me al de hele dag zit aan te staren :X

Egoist: A person of low taste, more interested in themselves than in me


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

De link hierboven is chapter 21 ;)

Anyway, als je het niet als trigger nodig hebt zal het idd wel te doen zijn :)

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22-08 23:20
bagger bagger bagger.. nu loop ik dus tegen een zwaar gebrek in mijn perl kennis aan...

ik heb dus een functie gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE FUNCTION log_message ( integer
                            , integer
                            , varchar)
  RETURNS boolean
  AS '

use DBI;

my $dbh = DBI -> connect (''DBI:mysql:cdp_head'');
my $sth = $dbh -> prepare (''insert into log_table '' .
                  '' (logtime, ident, priority, message) values ( '' .
                  '' now(), '' . $_[0] . '', '' . $_[1] .
                  '', '' . $_[2] . '');'');
                  
$sth->execute();  

  ' LANGUAGE plperlu;


als ik die aanroep, dan krijg ik een error:
code:
1
2
3
cdp_head=# select log_message (1,1,'test');
ERROR:  plperl: error from function:    (in cleanup) Can't call method "prepare"
on an undefined value at (eval 1) line 6.


maar ik gebruikt de hele prepare method toch niet :? Bovendien heb ik het gevoel
dat ik de varchar value ($_[2] dus) moet escapen met \' eromheen, maar dat gaat dus niet werken in een plperlu functie.

Kan iemand me wat pointers geven...?

Egoist: A person of low taste, more interested in themselves than in me


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Probeer het eerst es in gewoon perl?
Dan weet je iig zeker dat het niet aan beperkingen van plperl ligt, mijn perl kennis is verder ook nogal stoffig, dus veel kan ik je daar niet bij helpen :)

Misschien is het handig om de doublequotes te gebruiken om je strings in je perl, dan wordt het iig al iets duidelijker :)

Dan krijg je dus zoiets:
code:
1
2
3
4
my $sth = $dbh -> prepare ("insert into log_table " .
                  " (logtime, ident, priority, message) values ( " .
                  " now(), ''" . $_[0] . "'', ''" . $_[1] .
                  "'', ''" . $_[2] . "'')");

(waar er dus ' ' " en " ' ' kan staan, is niet echt duidelijk zo :o

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22-08 23:20
als ik de functie verander en eerst maar eens wat vaste waarden laat uitvoeren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE FUNCTION log_message ()
  RETURNS boolean
  AS '

use DBI;

my $dbh = DBI -> connect ("DBI:mysql:cdp_head");
my $sth = $dbh -> prepare ("insert into log_table " .  
                  " (logtime, ident, priority, message) values ( " .  
                  " now(), 1 , 1, ''bla'');");
                  
$sth->execute();  

  ' LANGUAGE plperlu;


krijg ik dezelfde foutmelding. Dit alles nav dit perl scriptje, dat wel werkt vanaf het fs:
code:
1
2
3
4
5
6
7
8
use DBI;

my $dbh = DBI -> connect("DBI:mysql:cdp_head");
my $sth = $dbh -> prepare("insert into log_table " .
                  " (logtime, ident, priority, message) values ( " .
                  " now(), 1, 1, 'bla');");
                  
$sth->execute();


Voor de zekerheid de variabelen dus nog maar even achterwege gelaten (makkelijk beginnen denk ik altijd maar). ' voor " veranderen in de perl string is idd wel een stuk duidelijker (en makkelijk vanwege dat escape gelazer in postgresql functies).

Misschien handiger om hier een appart topic voor te openen (ik denk dat de gemiddelde perl crack namelijk niet in dit topic kijkt...)

Egoist: A person of low taste, more interested in themselves than in me


  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-08 19:02
DrFrankenstoner schreef op 24 May 2003 @ 14:47:
code:
1
2
3
4
cdp_head=# select log_message (1,1,'test');
ERROR:  plperl: error from function:    (in cleanup) 
Can't call method "prepare"
on an undefined value at (eval 1) line 6.


maar ik gebruikt de hele prepare method toch niet :?
je gebruikt $dbh->prepare, en de melding die je krijgt betekent meestal dat $dbh undefined is, en dus de $dbh->connect() niet goed gaat.

je connect-string ziet er aardig uit, maar ik mis een username en password ?

perl en mysql is lang geleden voor me, maar alleen DBI is niet genoeg : je hebt de lowlevel driver voor mysql nodig (meestal DBD::Mysql, of anders de msql-mysql modules).

probeer in een reglulier perl-script even te connecten, en kijk of dat werkt. of lees anders 'perldoc DBI' en (als je die hebt) 'perldoc Mysql'

[ Voor 5% gewijzigd door tech-no-logical op 24-05-2003 15:47 ]


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22-08 23:20
het lag idd aan m'n connectstring. Op os-niveau gebruikte ik mijn normale os-user (en die heeft toegang zonder user/pass). Als ik dus mijn os-username meegeef in de connectstring werkt het.

For the record (mocht iemand het ooit nodig hebben) dit werkt dus:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE FUNCTION log_message ( users.id%type
                            , integer
                            , messages.message%type)
  RETURNS boolean
  AS '
 
use DBI;

my $dbh = DBI -> connect ("DBI:mysql:cdp_head", "jacco");
my $sth = $dbh -> prepare ("insert into log_table " .  
                  " (logtime, ident, priority, message) values ( " .
                  " now(), " . $_[0] . " , " . $_[1] . ", ''" . $_[2] . "'');");
                  
$sth->execute();
$dbh->disconnect;

use DBI;

  ' LANGUAGE plperlu;

Egoist: A person of low taste, more interested in themselves than in me

Pagina: 1