웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
[모듈 개발] 테이블 스키마 파일 이름은 테이블명과 동일하게
2014.05.12 15:56
1. 상황
모듈 개발 중 테이블 스키마와 쿼리를 아래처럼 만들고 excecuteQuery를 때렸습니다.
[schemas/items.xml]
<table name="test_items"> <column name="item_srl" type="number" size="11" notnull="notnull" auto_increment="auto_increment" primary_key="primary_key " /> <column name="display_name" type="varchar" size="50" /> </table>
[queries/insertItem.xml]
<query id="insertItem" action="insert"> <tables> <table name="test_items" /> </tables> <columns> <column name="display_name" var="display_name" maxlength="50"/> </columns> </query>
당연히 insert가 되었을 줄 알았지만 에러가 났습니다.
error: Unknown column 'xxx' in 'field-list'
헐... 'xxx'는 값인데 컬럼이라니.
쿼리문을 찍어 봤습니다.
INSERT INTO `xe_test_items` (`display_name`) VALUES (`xxx`)
값에 `(어퍼스트로피)가 씌워져 있는 것이 문제의 원인이었습니다.
2. 추적
끊질긴 추적 끝에 쿼리 캐쉬 파일(files/cache/queries/)이 다른 것들과 차이가 있음을 발견했습니다.
* 쿼리 캐쉬 파일은 DB.class.php의 checkQueryCacheFile 함수를 통해 만들어 집니다.
정상)
${'document_srl206_argument'} = new Argument('document_srl', $args->{'document_srl'}); ${'document_srl206_argument'}->checkFilter('number'); ${'document_srl206_argument'}->checkNotNull(); if(!${'document_srl206_argument'}->isValid()) return ${'document_srl206_argument'}->getErrorMessage(); if(${'document_srl206_argument'} !== null) ${'document_srl206_argument'}->setColumnType('number');
비정상)
if(isset($args->display_name)) {${'display_name14_argument'} = new Argument('display_name', $args->{'display_name'});if(!${'display_name14_argument'}->isValid()) return ${'display_name14_argument'}->getErrorMessage();} else
정상과 달리 setColumnType이 누락되어 있었습니다.
다시 쿼리 캐쉬 파일을 만들어 내는 부분을 추적해봤습니다.
QueryTag.class.php 클래스의 setTableColumnTypes 함수에서 QueryParser::getTableInfo 함수를 통해 가져온 테이블 정보가 비어 있었습니다.
QueryParser::getTableInfo는 다음 과정을 통해 테이블 스키마 파일을 찾아 냅니다.
1) 인자로 넘어 온 $query_id 문자열을 .(도트) 문자로 분리.
2개로 분리되면
target : 'modules'
module : $id_args[0]
query id : $id_args[1]
3개로 분리되면
target : $id_args[0] ( modules or addons or widgets )
module : $id_args[1]
query id : $id_args[2]
2) 위 정보를 토대로 modules 디렉토리 아래에 있는 module 디렉토리로부터 인자로 들어온 테이블 이름에 해당하는 스키마 파일을 가져 옵니다.
3) 없으면, modules 디렉토리의 하위 디렉토리들의 shemeas 폴더를 순회하면서 일치하는 것이 있는지 검사합니다.
3. 원인
테이블 이름은 test_items이지만 스키마 파일 이름은 items.xml이다보니,
modules 하위 디렉토리 순회 과정에서 스키마 파일을 찾지 못해 결과적으로 setColumnType 코드를 쿼리 캐쉬 파일에 기록하지 못한 것이었습니다.
스키마 파일을 못 찾았을 때 에러를 출력해주면 좋았을텐데 TT
시간을 좀 낭비했지만 덕분에 매뉴얼에도 없는 소중한 정보들을 몇가지 알게 되어 공유합니다. ^^
댓글 3
-
sejin7940
2014.05.12 22:26
-
산하2
2014.05.13 12:03
꼼꼼하시네요 ^^ 제목을 수정했습니다.
-
joowonx
2015.03.05 15:42
:_) 감사합니다 덕분에 해결했어요 .. 모듈에서 다른 모듈이 만든 테이블을 손대려고할때... 같은 스키마가 필요하더군요 ㅠㅠ
제목 | 글쓴이 | 날짜 |
---|---|---|
1원팁) 톱메뉴를 제거하고 왼쪽 서브메뉴만 출력하는 방법 [2] | Gnee | 2008.08.02 |
1.0.3 버전 이상부터 본문 내 이미지 자동 리사이징이 안되는 경우 [1] | kirrie | 2008.08.01 |
제로보드XE 설치 완료버튼 누르니까 My sql 관련 내용 나오던데요 [3] | Naver™ | 2008.07.30 |
코멘트를 달아야만 첨부파일 다운로드 할 수 있게 하기 [8] | 지오426 | 2008.07.29 |
제로보드XE에서 표 쉽게 만드는 방법.. [23] | 청개구리00 | 2008.07.27 |
초간단! 게시물주소 클릭시 복사하기 ! [4] | gnee | 2008.07.26 |
본문의 서명과 프로필이미지를 끌어올려보자 [11] | CL님 | 2008.07.22 |
로컬 설치 후 몇가지 문제점에 대해서 - 인덱싱. DB선택 등 | 서정일643 | 2008.07.22 |
로그인이 안되는 문제 [1] | 젝망치 | 2008.07.21 |
관리자만 ip 보이게 하기 [10] | 老姜君 | 2008.07.20 |
게시판(블로그)상단에 글쓰기버턴이나 링크넣기 [8] | 팔공산 | 2008.07.20 |
게시글 본문 좌, 우측에 div 내용 넣기(수정) [5] | 라르게덴 | 2008.07.18 |
winxp IE7 rwapm에서 한글이름파일 업로드 [7] | 공수래 | 2008.07.15 |
초보 헤메다가 팁//댓글기능 보이기 감추기 [5] | 리히토 | 2008.07.15 |
자료 첨부 문제 | 단풍534 | 2008.07.15 |
초보 헤메다가 팁//검색기능 보이기 감추기 [3] | 리히토 | 2008.07.15 |
초보 헤메다가 팁//인쇄영역 확장변수 포함 [8] | 리히토 | 2008.07.14 |
에디터입력창 배경색상(이미지) 변경해보기 [5] [1] | 팔공산 | 2008.07.13 |
업그레이드 쉽고,안전하게 하기(예제 포함해서 다시 올림) [2] | wannabewize | 2008.07.13 |
게시판 가로조절(width) 및 가운데로 이동 태그 [4] | 박상욱860 | 2008.07.12 |
스키마 이름은 모듈과 무관합니다. 모듈_테이블명.xml 로 할 필요가 없습니다.
그냥, 스키마 이름을 테이블명과 동일하게만 하면 됩니다.
스키마 이름은 items 이고, 테이블명은 test_items 여서 안 되었던거기에
test_items 로 통일하거나, 아니면 items 로 통일하면 됩니다. ( test 가 모듈명이었나보네요 ^^;)