>source

숙련 된 Wordpress 개발자의 조언이 필요합니다. 우리 조직에는 수많은 테이블, 보고서 및 입력 양식이 포함 된 내부 MS Access 데이터베이스가 있습니다. DB의 구조는 너무 복잡하지 않습니다 (사람 정보, 이벤트, 제 3 자 정보 및 서로 다른 관계). 현재 뉴스 섹션 만있는 Wordpress 사이트에서이 정보의 일부를 보여주고 싶었습니다.

DB의 정보가 매일 업데이트되기 때문에 MS Access DB와 Wordpress (MySQL DB)를 간단하게 동기화하고 싶습니다. 이제 MS Access와 Wordpress를 연결하는 가장 좋은 방법을 찾으려고 노력합니다.

현재이 작업을 수행하는 방법은 다음과 같습니다.

  1. 내보내기 요청을하고 XML 파일로 저장합니다.
  2. Wordpress의 MySQL DB로 가져 오기.
  3. 맞춤 필드 기능을 사용하여 Wordpress 사이트에 콘텐츠 표시 (또는 자체 플러그인 개발)

-또는-

  1. 워드 프레스 사이트와 동일한 도메인에 매우 가벼운 PHP 엔진 (예 : CodeIgniter)에 자체 정보 시스템을 구축하면 실제로 가져온 컨텐츠가 표시됩니다.
이 변형은 매일 DB 간 수동 전송 정보가 필요합니다. 그리고 DB의 사용자 정의 데이터를 표시하는 Wordpress의 가능성을 모릅니다. 제 경우에 어떤 방법을 선호하십니까?

P.S. 사용 된 MS Access는 2007+ 버전 (.accdb 파일)입니다. 필드 이름, db 및 내용은 러시아어로되어 있습니다. 앞으로 2 개의 새로운 언어 (영어, 우크라이나어)를 추가 할 계획입니다. MS 액세스 DB에는 인물 사진도 포함되어 있습니다.


  • 답변 # 1

    질문이 너무 광범위합니다. 1. Access에서 내보내기 및 2. Wordpress로 가져 오기. 나는 Wordpress에 익숙하지 않기 때문에 1 부분에 대한 조언 만 줄 수 있습니다. 적어도 구글은 다음과 같이 CSV에서 가져올 수있는 플러그인이 있음을 보여줍니다. https://ru.wordpress.org/plugins/wp-ultimate-csv-importer/

    여기에 설명 된대로 VBA 기능을 실행하는 매크로를 실행하는 Access를 실행하는 예약 된 작업을 만들 수 있습니다. 예약 된 작업으로 Microsoft Access 실행

    이 VBA 기능에서 ADODB.Stream 객체를 사용하여 데이터가 포함 된 UTF-8 CSV 파일을 만들고 사이트의 FTP에 업로드 할 수 있습니다.

    또는

    개인적으로 나는 파이썬 스크립트를 사용하여 비슷한 것을합니다. 나는이 방법이 더 간결하고 신뢰할 수 있기 때문에 선호합니다. 내 코드가 있습니다. 두 개의 FTP 서버가 있습니다. 그 중 하나는 테스트 전용입니다.

    # -*- coding: utf-8 -*-
    # 2018-10-31
    # 2018-11-28
    import os
    import csv
    from time import sleep
    from ftplib import FTP_TLS
    from datetime import datetime as dt
    import msaccess
    FTP_REAL = {'FTP_SERVER':r'your.site.com',
                'FTP_USER':r'username',
                'FTP_PW':r'Pa$$word'
                }
    FTP_WIP = {'FTP_SERVER':r'192.168.0.1',
                'FTP_USER':r'just_test',
                'FTP_PW':r'just_test'
                }
    def ftp_upload(fullpath:str, ftp_folder:str, real:bool):
        ''' Upload file to FTP '''
        try:
            if real:
                ftp_set = FTP_REAL
            else:
                ftp_set = FTP_WIP
            with FTP_TLS(ftp_set['FTP_SERVER']) as ftp:
                ftp.login(user=ftp_set['FTP_USER'], passwd=ftp_set['FTP_PW'])
                ftp.prot_p()
                # Passive mode off otherwise there will be problem
                # with another upload attempt
                # my site doesn't allow active mode :(
                ftp.set_pasv(ftp_set['FTP_SERVER'].find('selcdn') > 0)
                ftp.cwd(ftp_folder)
                i = 0
                while i < 3:
                    sleep(i * 5)
                    i += 1
                    try:
                        with open(fullpath, 'br') as f:
                            ftp.storbinary(cmd='STOR ' + os.path.basename(fullpath),
                                            fp=f)
                    except OSError as e:
                        if e.errno != 0:
                            print(f'ftp.storbinary error:\n\t{repr(e)}')
                    except Exception as e:
                        print(f'ftp.storbinary exception:\n\t{repr(e)}')
                    filename = os.path.basename(fullpath)
                    # Check if uploaded file size matches local file:
                    # IDK why but single ftp.size command sometimes returns None,
                    # run this first:
                    ftp.size(filename)
                    #input(f'overwrite it: {filename}')
                    ftp_size = ftp.size(os.path.basename(fullpath))
                    # import pdb; pdb.set_trace()
                    if ftp_size != None:
                        if ftp_size == os.stat(fullpath).st_size:
                            print(f'File \'{filename}\' successfully uploaded')
                            break
                        else:
                            print('Transfer failed')
                            # input('Press enter for another try...')
        except OSError as e:
            if e.errno != 0:
                return False, repr(e)
        except Exception as e:
            return False, repr(e)
        return True, None
    def make_file(content:str):
        ''' Make CSV file in temp directory and return True and fullpath '''
        fullpath = os.environ['tmp'] + f'\\{dt.now():%Y%m%d%H%M}.csv'
        try:
            with open(fullpath, 'wt', newline='', encoding='utf-8') as f:
                try:
                    w = csv.writer(f, delimiter=';')
                    w.writerows(content)
                except Exception as e:
                    return False, f'csv.writer fail:\n{repr(e)}' 
        except Exception as e:
            return False, repr(e)
        return True, fullpath
    def query_upload(sql:str, real:bool, ftp_folder:str, no_del:bool=False):
        ''' Run query and upload to FTP '''
        print(f'Real DB: {real}')
        status, data = msaccess.run_query(sql, real=real, headers=False)
        rec_num = len(data)
        if not status:
            print(f'run_query error:\n\t{data}')
            return False, data
        status, data = make_file(data)
        if not status:
            print(f'make_file error:\n\t{data}')
            return False, data
        fi = data
        status, data = ftp_upload(fi, ftp_folder, real)
        if not status:
            print(f'ftp_upload error:\n\t{data}')
            return False, data
        print(f'Done: {rec_num} records')
        if no_del: input('\n\nPress Enter to exit and delete file')
        os.remove(fi)
        return True, rec_num
    
    
    

관련 자료

  • 이전 encryption - 인쇄 가능한 ASCII 문자 집합 (32-126) 만있는 Caesar 암호의 무차별 단계에서 Python 지원
  • 다음 angular - 웹 API에서 데이터를 가져올 때 결과 개체를 정의되지 않은 것으로 가져옵니다 첫 번째 전화에서만