드루팔 모듈의 제작, 업그레이드시 DB 스키마는 신중하게 정하자. Image 모듈의 업그레이드 사태를 타산지석으로.

드루팔 모듈의 제작, 업그레이드시 DB 스키마는 신중하게 정하자.

Image 모듈의 업그레이드 사태를 타산지석으로 삼자는 이 긴 제목의 글은,
드루팔 모듈 개발자를 위한 것이다.

한 드루팔 사이트의 Image 모듈을 5.19로 업그레이드하고 나서, update.php를 돌렸다.
그랬더니 Thumbnail이 표시되는 화면에서 다음과 같은 에러가 나서 고생했다.

user warning: Unknown column 'image.nid' in 'field list' query:
: SELECT node.nid, rand() AS random_sort, node.title AS node_title, node.changed AS node_changed, image.nid AS image_nid FROM node node WHERE (node.status = '1') AND (node.type IN ('image')) ORDER BY random_sort ASC LIMIT 0, 3

쿼리문 자체도 문법 오류가 있어 보이는 이 에러는 드루팔 본향 사이트에서도 유명한 문제였다.
http://drupal.org/search/apachesolr_search/user%20warning:%20Unknown%20column%20'image.nid'%20in%20'field%20list'%20query
관련 글을 갯수도 많지만, 정답으로 보이는 해결책이 별로 없었다.
(각각의 환경 차이에 따른 원인 파악이 안되서이다.)

예를 들어, 어떤 이들은 기존의 image 테이블을 삭제 혹은 백업하고,
update.php를 통해 새로운 업그레이드판 image 테이블로 이관하라는 권했지만,
우리가 해 본 바로는 잘 통하지 않았다.
그 외에 무작정 다운그레이드하라는 제안 등 괴롭고 비현실적인 해결책 투성이었다.

결론부터 말하자면, 드루지기들은 이 문제를 해당 사이트에서 해결했으나,
그 해결책이 만병통치약이 될 수 없음을 고백한다. 역시 각각의 환경에 따라
에러 현상은 비슷해 보이지만 실제로는 다른 원인에 의해서 문제가 생길 수도 있기 때문이다.

우리가 면밀히 본 바, 위 에러 현상은 Image모듈의 업그레이드에 따른 테이블
스키마 변형에 따른 것이었다. 예를 들어 필드명이 없어지거나 바뀌어진 것이다.
이런 이런... 해당 사이트는 Views를 이용해서 썸네일 이미지를 출력하는
화면이 상당수 존재했다. Views의 Image Display 필드를 통해서
이미지 컨텐츠를 다양한 형태로 출력해 왔는데, 그 뷰에서 참고하는 Table 필드가
어느 날 모듈 업그레이드로 인해 사라져 버린 것이다. 위에 나타난 이상한 쿼리문도
그 때문에 나타난 것이었다.

해결책은, 해당 사이트의 Views 항목에서 이미지 필드를 사용하는 모든 뷰를
필드별로 수정해 주고 저장했다. 역시나 이미지 필드가 사라진 뷰가 많았다.

해결은 했지만, 이 이미지 모듈 업그레이드 파동?으로 인해 깨달은 점을 기록코자 한다.

"드루팔 모듈의 제작, 업그레이드시 DB 스키마는 신중하게 정하자.
왠만하면 바꾸지 말자. 사용자들의 확장 활용을 고려한다면 말이다."

[드루팔 모듈 제작시 주의점]
1. 한 번 작성한 DB 테이블 스키마는 왠만하면 수정하지 않는 것이 좋다.
2. 만일 스키마까지 수정해야 한다면 Views 등에 영향을 줄 수 있다는 점을 명심하고,
    사용자들이 불편하지 않도록 만일을 대비한 롤백 환경을 준비하는 것이 좋다.
3. 테이블 변수명에는 반드시 그냥 table명 대신에 {table명}을 사용하기 바란다.
    호스팅 환경에서는 하나의 DB에 여러개의 드루팔 사이트를 Prefix로 구분하는 경우가 있다.
    이 경우에 중괄호 테이블명 변수는 위력을 발휘한다.

* 참고 : 이 문제를 해결한 뒤에도 몇몇 이미지들이 제대로 보이지 않는 경우가 있다면,
이는 드루팔의 files 테이블에 images 상대 폴더의 위치가 잘못 설정된 탓이다.
이를 한꺼번에 수정하는 쿼리를 기록해 둔다.

확인용
select *,concat('files/bulabula/',filepath) from files WHERE substring(filepath,1,7)='images/'

수정용 (그 전에 테이블 백업 요망)
UPDATE files SET filepath=concat('files/bulabula/',filepath) WHERE substring(filepath,1,7)='images/'

Comments

만일 본문에서의

만일 본문에서의 수정용 쿼리를 실행해도 이미지가 일부 보이지 않는다면,
보이지 않는 이미지의 노드번호를 메모해서, 아래 쿼리를 실행하면 해결될 것이다.

INSERT INTO image SELECT DISTINCT f.nid, f.fid, f.filename FROM files f INNER JOIN node n ON f.nid = n.nid WHERE n.type='image' AND f.filename IN ('_original', 'original', 'thumbnail', 'preview', 'small', 'medium', 'large') and n.nid=해당이미지의_노드번호

드루팔 본향

드루팔 본향 사이트에서, 위 이미지 모듈 업그레이드 관련
user warning: Unknown column 'image.nid' in 'field list' query:
에러를 상담한 게시글들이 많은데 그 중 이 2가지가 눈여겨 볼 만 한다. (참고용)

http://drupal.org/node/210509
http://drupal.org/node/209295