2013-11-27 35 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

是否有具體原因使用pymysql而不是mysql.connector,這是官方的MySQL Python接口? – peroksid

+0

@peroksid我無法使用Python3與mysql3連接。 –

+1

我正在使用mysql-connector-python == 1.0.12 – peroksid

回答

0

在腳本開始處打開1個連接。連接並不便宜。

記住取得的最後一行的ID。

在每次迭代中選擇ID大於上次看到的行。

+1

我只是在我的原始代碼示例中打開一個連接。即使只是一個簡單的SELECT查詢「SELECT * FROM myforms WHERE email_sent = False」,在腳本實例化後也不會返回任何結果,但是如果我中止腳本並重新啓動腳本,它會正確識別未處理的表單。 –

+0

我懷疑你已經在發佈的代碼片段中分離出有問題的代碼。 – peroksid

+1

也許事務隔離或其他事情有問題。 – peroksid