질문/조언팁/리소스 공유
#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import pymysql
from time import localtime, strftime 
 
 
# MySQL 설정
db_addr = 'localhost'
db_user = 'test'
db_password = 'password'
db_name = 'test'
 
 
# MySQL Connection 연결
conn = pymysql.connect(host=db_addr, user=db_user, password=db_password, db=db_name, charset='utf8')
 
# Connection 으로부터 Cursor 생성
curs = conn.cursor()
 
 
# SQL문 실행 - rx_sequence 현재값
def get_last_rx_sequence():
    rx_sequence_sql = "SELECT `seq` FROM `rx_sequence` ORDER BY `seq` DESC limit 1"
    curs.execute(rx_sequence_sql)
    # 데이타 Fetch
    rx_sequence_sql_rows = curs.fetchall()
    rx_sequence = rx_sequence_sql_rows[0][0] 
    return rx_sequence
 
# 현재 rx_sequence_sql의 값
print(get_last_rx_sequence())
 
 
 
# rx_sequence_sql_rows의 값을 증가시킴
# 증가된 rx_sequence = 새로 생길 document_srl가 될 것임
# rx_sequence_sql_rows 현재값에 1을 추가
new_rx_sequence_rows = int(get_last_rx_sequence() + 1)
print(new_rx_sequence_rows)
 
 
# SQL문 실행 - DB rx_sequence 현재값에 1을 추가
rx_sequence_inser_sql = """INSERT INTO `rx_sequence` (seq) 
            VALUES (%s);"""
curs.execute(rx_sequence_inser_sql, (new_rx_sequence_rows))
conn.commit()
 
 
# 게시물 입력정보
document_srl = get_last_rx_sequence()
module_srl = "68"
member_srl = "4"
user_name = "admin"
nick_name = "운영자"
cTime = strftime("%Y%m%d%H%M%S", localtime()) 
title = "제목"
content = "내용"
tags = "tt,tdf,tdfd,wrf,dfsf"
rx_document_inser_sql = """INSERT INTO `rx_documents` 
            (`document_srl`, `module_srl`,  `title`, `content`, `member_srl`, `regdate`, `last_update`,
            `category_srl`, `lang_code`, `is_notice`, `title_bold`, `title_color`, 
            `readed_count`, `voted_count`, `blamed_count`, `comment_count`, `trackback_count`, `uploaded_count`, 
            `password`, `user_id`, `user_name`, `nick_name`, `email_address`, `homepage`, 
            `tags`, `extra_vars`, `last_updater`, `ipaddress`, `list_order`, `update_order`, 
            `allow_trackback`, `notify_message`, `status`, `comment_status`) 
            VALUES (%s, %s, %s, %s, %s, %s, %s,
            '0', 'ko', 'N',  'N', 'N', 
            '0', '0', '0', '0', '0', '0', 
            NULL, NULL, %s, %s, '', '', 
            %s, NULL, NULL, '', %s, %s,
            'N', 'N', 'PUBLIC', 'ALLOW');"""
curs.execute(rx_document_inser_sql, (document_srl, module_srl, title, content, member_srl, cTime, cTime, user_name, nick_name, tags, -document_srl, -document_srl))
conn.commit()
 
 
# `list_order` 와 `update_order`는 document_srl의 역순으로 입력하면 됨.

 

출처 : https://godpeople.or.kr/3417038

 

팁 소개도 하면서 질문도 하려고 합니다.

 

해당 소스는 파이썬으로 라이믹스 게시물을 직접 입력하는 방법입니다.

제가 인터넷에 떠도는 소스를 수정해서 document_srl 문제를 해결하였습니다.

라이믹스의 구조를 이해하는데 많은 도움이 되었는데요. 아직 해결하지 못한 게 있습니다.

 

문제는 이미지나 파일을 첨부하려고 할 때 입니다.

 

파일 업로드와 디비 입력에서 기존 라이믹스의 파일처리 방식을 몰라서 첨부파일 부분은 손을 못데고 있습니다.

경험이 있으신 분의 손길을 기다려 봅니다.

 

혹시, 힌트라도 주시면 계속 도전해 보겠습니다.

감사합니다.

 

  • profile

    파이썬 공부용이라면 말리지 않겠지만... XE나 라이믹스의 구조를 이해하는 것이 목표라면 파이썬보다는 PHP로 공부하시는 것이 훨씬 편할 것 같네요. common/autoload.php 파일만 인클루드하면 DocumentController, FileController 등 작업에 필요한 모든 클래스를 자유롭게 끌어다 쓸 수 있으니까요. 라이믹스는 코어에서 제공하는 클래스와 함수를 통하지 않고 글, 댓글, 파일 등을 직접 조작하는 것을 절대 권장하지 않습니다.

     

    예:

    #!/usr/bin/php

    <?php

    include 'common/autoload.php';

    $obj = new stdClass;

    $obj->속성 = 값;  // 필요에 따라 반복

    getController('document')->insertDocument($obj, true);

    이렇게 하면 시퀀스 같은 것은 모두 알아서 들어가고, 새 글이 등록되었을 때 특정인에게 알림이 날아가야 한다거나, 글쓴이에게 포인트를 준다거나, 그 밖에 해당사이트에 설치된 서드파티 자료들이 수행하는 각종 기능들도 모두 정상적으로 수행됩니다. DB에 직접 입력하면 이런 건 어림도 없죠.


    힌트를 드리자면 파일도 마찬가지로 시퀀스 값을 뽑아서 file_srl에 넣고, 소속된 문서의 document_srl을 참조합니다. 저장하는 경로도 임의로 생성해서 uploaded_filename 필드에 넣고요. 실제로 파일 몇 개 첨부해 놓고 rx_files 테이블과 files/attach 폴더 내의 서브폴더 구조를 살펴보면 무척 직관적일 거예요.

     

    P.S. 글 내용에 '따옴표'가 들어가면 어떻게 될까요? ㅎㅎ 기왕 공부하시는 거, prepared statement 사용법을 함께 공부해서 처음부터 제대로 배워두세요^^

  • profile profile

    정확하게 짚어주셔서 감사합니다.
    파이썬으로 만들게 된 이유가 백엔드에서 처리할 대용량 입력 상황 때문이였습니다.
    말씀하신대로 PHP에서 처리하면 연동된 다양한 기능을 쓸 수 있어서 좋을 거 같네요.
    이 부분도 따로 공부해보도록 하겠습니다.

    힌트로 알려주신,
    file_srl 시퀀스 부분과, 소속된 문서의 document_srl을 참조하는 것은 이해를 했는데요.
    저장하는 경로를 임의로 생성해서 uploaded_filename 필드에 넣는 부분에서 이건 라이믹스에서 어떤 규칙이 있는 건지, 아니면 정말 제 맘대로 생성해도 되는건지 궁금합니다.

  • profile profile

    실제로 파일 몇 개 업로드해 보면 폴더명에 규칙이 보이실 겁니다. 파일명은 그냥 난수 생성한 거고요. XE에서 쓰는 폴더명 규칙과 라이믹스에서 쓰는 규칙이 다른데, 라이믹스 쪽이 훨씬 직관적입니다. 무슨 패턴인지 도저히 놓칠 수가 없어요. ㅎㅎ (단, XE에서 라이믹스로 업그레이드한 경우에는 난해한 XE 규칙을 따라갑니다.)

     

    업로드 파일명 규칙을 정확히 따르지 않더라도 종류에 맞게 files/attach/images, files/attach/binaries 아래에 집어넣고 uploaded_filename 필드에 정확하게 기록만 해두면 실제로 사용하는 데 문제는 없습니다.

    PHP도 백엔드에서 얼마든지 사용할 수 있습니다. php-cli가 나온 지 20년은 다 되어갈 텐데 아직도 PHP는 웹 전용이라고 오해하는 분이 많더군요. 초창기에는 메모리 누수 때문에 오래 돌리기 곤란했지만, 이제는 몇 시간을 돌려도 끄떡없습니다. 위에 써드린 예제코드도 #!/usr/bin/php로 시작하는 거 보이시죠? 크론탭은 물론이고, 테라 단위의 데이터를 일괄 변환하는 데도 php-cli를 사용해본 적이 있습니다. 파이썬보다 모자란 것 하나도 없어요.

    팁: php-cli에서 대량으로 인서트할 경우 Rhymix\Framework\Debug::disable()을 먼저 해두시는 것이 좋습니다. 디버그 정보가 너무 많이 쌓여서 메모리 사용량을 초과하는 경우가 종종 있더군요. 또한 평소에 웹 요청을 처리하는 시스템 계정과 동일한 계정으로 실행해야 라이믹스 작동 과정에서 필연적으로 생성되는 캐시파일들의 소유권이 꼬이지 않습니다. 루트 권한으로 돌려버리면 웹에서 갱신할 수 없는 캐시파일이 생겨버려요. (common/scripts/common.php를 일단 한 번 인클루드하시면 명백한 권한 문제는 거의 피할 수 있습니다.)

  • profile profile
    php-cli 라는 것도 있었군요. 웹전용으로만 생각하고 있었네요.

    저의 경우 XE에서 업데이트를 했기 때문에 후자의 방식이 적용되어야 하겠군요.
    답변을 읽으면서 어느 정도 감이 잡히네요.
    과거 서버 셋팅에 대한 글들에서 도움을 많이 받았고, 전반적인 프로그램 지식에서 많이 받고 배우고 있습니다.
    늦은 시간까지 세심한 답변 감사드립니다. ^^
  • profile profile
    알려주신 팁으로 첨부파일까지 처리하는데 성공했습니다.
    감사합니다. ^^

서버에 요청 중입니다. 잠시만 기다려 주십시오...