Egoist: A person of low taste, more interested in themselves than in me
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.
Egoist: A person of low taste, more interested in themselves than in me
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 ]
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
Egoist: A person of low taste, more interested in themselves than in me
Anyway, als je het niet als trigger nodig hebt zal het idd wel te doen zijn
ik heb dus een functie gemaakt:
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:
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
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
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:
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
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:
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
je gebruikt $dbh->prepare, en de melding die je krijgt betekent meestal dat $dbh undefined is, en dus de $dbh->connect() niet goed gaat.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 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 ]
For the record (mocht iemand het ooit nodig hebben) dit werkt dus:
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