/ / Heroku + Rails + PostgreSQL Ausgabe - Ruby-on-Rails-3, Postgresql, Heroku

Heroku + Rails + PostgreSQL-Ausgabe - ruby-on-rails-3, postgresql, heroku

Ich habe eine App für Heroku installiert, die lokal gut läuft (mit sqlite3 als Edelstein für die Datenbank beim Testen). Wenn ich zu Heroku wechsle und versuche, es auszuführen, erhalte ich diese Fehlermeldung:

 ActiveRecord::StatementInvalid (PG::Error: ERROR:  syntax error at or near "order"
LINE 1: ...lery_url_id = "k19fv2mytjEb_3gCezLeRA") ORDER BY `order` ASC                                                              ^
: SELECT "pictures".* FROM "pictures"  WHERE (gallery_url_id = "k19fv2mytjEb_3gCezLeRA") ORDER BY `order` ASC):
app/controllers/galleries_controller.rb:38:in `show"

Speziell in dieser Zeile:

@pictures = Picture.find(:all, :conditions => [ "gallery_url_id = ?", @gallery.url_id ], :order => "`order` ASC")

HINWEIS: order ist ein Datenbankfeld, kein SQL-Aufruf oder eine Referenz. Also sag mir nicht, dass ich zwei Befehle mache.

Ich verstehe, dass es einige Probleme bei der Verwendung gibtSQLite beim lokalen Testen und PostgreSQL (pg) in der Produktionsumgebung. Meine Frage ist, was muss ich tun, um das Problem zu beheben? Liegt es an einem Flag, das ich im find aufrufe, das nur von SQLite und nicht von PostgreSQL unterstützt wird?

Antworten:

7 für die Antwort № 1

Backticks für Anführungszeichen sind ein MySQL-Ism, der auch von SQLite unterstützt wird. Die Standardsyntax (die PostgreSQL verwendet) für die Angabe von Bezeichnern ist die Verwendung von Anführungszeichen:

:order => ""order" ASC"

Ich empfehle Ihnen, so schnell wie möglich zwei Dinge zu tun:

  1. Ändern Sie den Namen Ihres "order" Spalte zu etwas, das nicht reserviert ist.
  2. Installieren Sie PostgreSQL und entwickeln Sie es mithilfe von PostgreSQL, wenn Sie die Bereitstellung auf Heroku planen. Ihr Entwicklungsstack sollte immer genau zu Ihrem Bereitstellungsstapel passen.

Der zweite Punkt ist sehr wichtig. Datenbankportabilität ist ein Mythos, es gibt so viele kleine Unterschiede zwischen den Datenbanken, dass das Schreiben von Code, der in mehreren Datenbanken gleich funktioniert, schwierig ist und das Schreiben Ihrer eigenen Portabilitätsebene bedeutet (und nein, ActiveRecord ist nicht diese Portabilitätsebene). Dieses geringfügige Zitatproblem wird wahrscheinlich das erste von vielen kleinen Problemen sein.