2013-11-27 3 views
1

영구적으로 연결을 유지하는 Python 스크립트를 실행하고 스크립트 외부에서 변경 한 내용에 응답합니다. 그래서 예를 들면pymysql은 새 연결을 인스턴스화 한 후 외부에서 변경된 내용 만 감지합니다.

는 :

  1. 데이터 스크립트 : 양식 게시물을 적용하고 데이터베이스에
  2. 작업자 스크립트를 양식 데이터를 커밋 : 새로운 형태의 게시물에 대한 데이터베이스를 모니터하고 그에 따라

조치를 취 작업자 스크립트의 관련 코드는 다음과 같습니다.

import pymysql 

conn = pymysql.connect(host='127.0.0.1', port=3306, user='dbuser', passwd='dbpass', db='my_db') 

def processForms(Formdat): 
    c = conn.cursor(pymysql.cursors.DictCursor) 
    myform.sendEmail(c) 
    conn.commit() 
    c.close() 

def doForms(): 
    while True: 
     ... get data and store in 'myforms' ... 
     futures = [executor.submit(processForms, myform) for myform in myforms] 
     time.sleep(30) 

doForms() 

아니요 w 왜 이것이 새로운 폼을 선택하지 않는지 이해할 수 없습니다 ... doForms()의 각 반복에서 새로운 연결을 생성하면 새로운 폼이 선택되지만 연결을 생성하고 파괴하고 싶지는 않습니다 항상.

예를 들어,이 수정 작업 : 나를 열려있는 연결을 사용하고 최신 데이터를 폴링 한 수있는 방법은

conn = None 

def doForms(): 
    while True: 
     global conn 
     conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='mw_py') 
     ... get data and store in 'myforms' ... 
     futures = [executor.submit(processForms, myform) for myform in myforms] 
     conn.close() 
     time.sleep(30) 

있습니까?

+0

공식 MySQL 파이썬 인터페이스 인 mysql.connector 대신 pymysql을 사용할 특별한 이유가 있습니까? – peroksid

+0

@peroksid 파이썬 3에서 작동하는 mysql.connector를 얻을 수 없었다. –

+1

mysql-connector-python == 1.0.12로 작업 중입니다. – peroksid

답변

0

스크립트 시작 부분에 1 개의 연결을 엽니 다. 연결하는 것은 값싼 작업이 아닙니다.

마지막으로 가져온 행의 ID를 기억하십시오.

모든 반복에서 ID가 마지막으로 표시된 행보다 큰 행을 선택하십시오.

+1

원래 코드 샘플에서 하나의 연결을 여는 중이 었습니다. "SELECT * FROM myforms WHERE email_sent = False"의 간단한 SELECT 쿼리 만 스크립트를 인스턴스화 한 후 결과를 반환하지 않지만 스크립트를 중단하고 다시 시작하면 처리되지 않은 양식이 올바르게 식별됩니다. –

+0

게시 된 스 니펫에서 문제가있는 코드를 격리했는지 의심 스럽습니다. – peroksid

+1

트랜잭션 격리 또는 다른 문제가있을 수 있습니다. – peroksid