Bizarre Import-Probleme – MySQL-Abfrage gibt PG::Result zurück?

Das bringt mich auf den Holzweg. Hier ist mysql_query:

  def mysql_query(sql)
    begin
      #puts "Query: \n#{sql}"
      @client.query(sql, cache_rows: true)
    rescue Exception => ex
      begin
        ActiveRecord::Base.connection.reconnect!
      rescue
        puts "Datenbankverbindung fehlgeschlagen, neuer Versuch in 10 Sekunden"
        sleep 10
        puts "Zeit für einen neuen Versuch. . . "
        @client.query(sql, cache_rows: true)
      end
    end
  end

Die ersten ca. 5 Millionen Beiträge wurden erfolgreich importiert, aber jetzt liefert

        posts = mysql_query(query).to_a

nicht das MySQL-Ergebnis zurück, sondern stattdessen:

 [#<PG::Result:0x0000563f3ee6d8d0 status=PGRES_COMMAND_OK ntuples=0 nfields=0 cmd_tuples=0>]

Ich bin jetzt zu folgendem Trick gegriffen:

      while !posts[-1].is_a?(Hash)
        puts "Posts: #{posts}"
        ActiveRecord::Base.connection.reconnect!
        @mysql_client = Mysql2::Client.new(
          host: DB_HOST,
          username: DB_USER,
          password: DB_PW,
          database: DB_NAME
        )
        posts = mysql_query(query).to_a
      end

Das fängt das Problem ab und löst es, aber es schlägt immer noch bei fast jeder Abfrage fehl (manchmal schaffen es sogar 3 Abfragen mit je 5000 Datensätzen). Ich habe es als Schleife geschrieben, aber ich vermute, dass sie nie mehr als einmal durchläuft. Kurzzeitig dachte ich, vielleicht würde etwas anderes @client verwenden und eine PG-Abfrage dort hineinstecken, also bin ich zu @mysql_client gewechselt, aber das hat das Problem nicht behoben.

Ich habe ein wenig im Internet gesucht, aber nichts gefunden.

Mein Hack funktioniert, also ist es wohl „behoben“, aber ich bin immer noch neugierig, was genau das verursacht.

Warum?! Dieser Aufruf stellt die Verbindung zu Postgres wieder her und gibt das PG::Result-Objekt zurück, das du siehst. Dein Hack verdeckt nur die Tatsache, dass du etwas tust, das du dumm nicht tun solltest. :wink:

Ich vermute, was du wirklich suchst, ist die reconnect-Verbindungsoption Verbindungsoption des mysql2-Clients.

Aha! Vielleicht liegt es also an meinem Code, der eigentlich MySQL-Fehler abfangen und einen Wiederholungsversuch starten soll. Ich dachte, dieser Code habe bereits früher funktioniert. Und ich scheine immer noch zu vergessen, dass eine Funktion den Wert der letzten ausgeführten Zeile zurückgibt.

Vielen Dank, @gerhard. Es wird mindestens 15 Minuten dauern, bis ich sehe, was als Nächstes passiert, aber zumindest verstehe ich jetzt, woher die PG-Rückgabe kam!