2012-07-13 6 views
1

로컬로 (테스트에서 데이터베이스의 보석으로 sqlite3을 사용하여) 잘 실행되는 Heroku에 응용 프로그램을 설치하고 Heroku를 밀고 실행할 때 계속 실행합니다. 오류 :이 라인에 특히Heroku + Rails + PostgreSQL 호

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' 

:

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

참고 : 순서는 데이터베이스 필드가 아닌 SQL 호출 또는 참조입니다. 그러니 내가 두 가지 명령을 내리고 있다고 말하지 마라. 그건 바보 같을거야. 아무 래도 그런 식으로 구문 분석되지 않는 한. 어느 쪽도 어리 석다.

프로덕션 환경의 로컬 테스트 및 PostgreSQL (pg)에서 SQLite를 사용하면 문제가 발생한다는 것을 알고 있습니다. 내 질문은이 문제를 해결하기 위해 무엇을해야합니까? PostgreSQL이 아닌 SQLite에서만 지원되는 find에서 호출하는 플래그 때문입니까?

+0

여기에 PG에 대한 제한된 지식이 있지만 '주문'대신 [주문]을 시도 했습니까? –

+0

수정 된 유일한 것은 "["그래서 나는 그것이 실패한 시도라고 추측합니다 :/ – user1470511

+0

@DominicGoulet : SQL-Server-ism, 큰 따옴표는 표준 구문. –

답변

7

식별자를 인용하기위한 백틱은 SQLite가 지원하는 MySQL-ism입니다.

:order => '"order" ASC' 

당신이 가능한 한 빨리이 일을하는 것이 좋습니다 것 :

  1. 변경하여 "order"의 이름 식별자를 인용에 대한 표준 구문 (PostgreSQL을 사용하는) 큰 따옴표를 사용하는 것입니다 열이 예약되지 않은 항목으로 이동합니다.
  2. PostgreSQL을 설치하고 PostgreSQL을 사용하여 개발하면 Heroku에 배치 할 계획입니다. 개발 스택은 항상 배포 스택과 정확히 일치해야합니다.

두 번째 요점은 매우 중요합니다. 데이터베이스 이식성은 신화입니다. 여러 데이터베이스에서 동일하게 작동하는 코드를 작성하는 것이 어렵다는 점은 데이터베이스간에 많은 차이가 있으므로 자신의 이식성 계층을 작성하는 것을 의미합니다 (아니요, ActiveRecord는 이식성 계층이 아닙니다). 이 작은 인용문 문제는 아마도 많은 작은 문제 중 첫 번째 문제 일 것입니다.

+2

SQLite와 Postgres를 연결하는 것은 특히 어렵습니다. SQLite는 컬럼 타입 지정과 관련하여 이상한 작은 단점을 가지고 있으며, Postgres는 타입에 대해 매우 엄격합니다. – Emily

+1

@Emily : 그렇습니다. 아마도 SQLite는 매우 느슨하고 PostgreSQL은 매우 엄격합니다. –