Christian: $dbh->quote() ohne Verbindung

Hallo,

es geht um das Modul DBI. Kann man $dbh->quote() benutzen ohne eine Verbindung zur Datenbank zu haben?

Das Problem ist folgendes: Ich bekomme zu beliebiger Zeit Anfragen, die ich bearbeiten muss und deren Ergebnis ich in einer MySQL-DB speichern will. Die MySQL-DB ist aber täglich ein paar Minuten down wegen Backup.
Wenn nun genau während des Backups eine Anfrage kommt, kann ich die natürlich nicht in die DB eintragen. Ich brauche so etwas wie einen "Query-Puffer", der die Sachen einträgt, sobald die DB wieder da ist.

Meine Überlegung war, dass ich die INSERT-Statements auf jeden Fall aufbaue und falls die DB weg ist, wird das Statement einfach in eine Datei geschrieben. Wenn die DB wieder da ist, lese ich die Datei und führe einfach jedes Statement aus.

Nun benötige ich aber $dbh->quote() um das Statement aufzubauen, und wenn die DB weg ist, gibts auch kein $dbh. Mit DBI::quote() gibts leider auch nur einen Fehler: "Can't locate auto/DBI/quote.al in @INC"

Gibt es noch eine andere Möglichkeit das quote() zu benutzen oder muss ich mir was anderes einfallen lassen?

Grüßle
Christian

  1. 你好 Christian,

    Nun benötige ich aber $dbh->quote() um das Statement aufzubauen, und wenn die DB weg ist, gibts auch kein $dbh. Mit DBI::quote() gibts leider auch nur einen Fehler: "Can't locate auto/DBI/quote.al in @INC"

    Gibt es noch eine andere Möglichkeit das quote() zu benutzen oder muss ich mir was anderes einfallen lassen?

    Die Quote-Methode wurde in einem anderen Package versteckt:

      
    use DBI;  
      
    print DBD::_::db::quote(undef,"test"),"\n";  
    
    

    再见,
     克里斯蒂安

    1. Danke für die schnelle Antwort! Sieht kommentierungswürdig aus, aber funktioniert :-)

  2. Moin Moin!

    es geht um das Modul DBI. Kann man $dbh->quote() benutzen ohne eine Verbindung zur Datenbank zu haben?

    Im Normalfall solltest Du $dbh->quote() überhaupt nicht brauchen. Benutze Platzhalter:

      
    my $sth=$dbh->prepare('select foo,bar from baz where foo=? or baz=?');  
    $sth->execute($fooSoll,$barSoll);  
    while ($sth->fetch...) {  
      # ...  
    }  
    $sth->finish()  
    
    

    Das Problem ist folgendes: Ich bekomme zu beliebiger Zeit Anfragen, die ich bearbeiten muss und deren Ergebnis ich in einer MySQL-DB speichern will. Die MySQL-DB ist aber täglich ein paar Minuten down wegen Backup.

    Kann MySQL kein Backup im laufenden Betrieb? (Nein, ich benutze kein MySQL.)

    Meine Überlegung war, dass ich die INSERT-Statements auf jeden Fall aufbaue und falls die DB weg ist, wird das Statement einfach in eine Datei geschrieben. Wenn die DB wieder da ist, lese ich die Datei und führe einfach jedes Statement aus.

    Können mehrere Anfragen parallel kommen und in die Datei schreiben wollen (z.B. CGI-Umgebung)? Dann brauchst Du definitiv noch ein Locking für die Datei, sonst hast Du Datenverluste.

    Nun benötige ich aber $dbh->quote() um das Statement aufzubauen,

    Nein, siehe oben. Geht auch für Insert, ist außerdem performanter:

      
    $sth=$dbh->prepare('insert into foo (bar,baz) values(?,?)');  
    foreach my $set (qw( a:b c:d e:f g:h )) {  
      my ($bar,$baz)=split /:/,$set;  
      $sth->execute($bar,$baz);  
    }  
    $sth->finish();  
    
    

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".