python - 实现 python db 监听器的问题
问题描述
我正在为一个程序编写一个模块,该程序需要监听数据库中的新条目,并在新行发布到该表的事件上执行一个函数......也就是一个触发器。
我写了一些代码,但它不起作用。这是我的逻辑:连接到数据库,查询最新行,将该行与变量进行比较,如果不相等,则运行函数,将最新行存储到变量,否则关闭。每 2 秒运行一次以将最新行与存储在变量/对象中的任何内容进行比较。
一切运行正常并从数据库中提取预期结果,但是我在分配之前得到了一个引用的“局部变量”last_sent。这让我感到困惑有两个原因。
我以为我在调用函数之前将 last_sent 设置为“无”作为全局变量/对象。
为了让我的比较逻辑起作用,我不能在 if/else 之前的 sendListener() 函数中设置 last_sent
这是代码。
from Logger import Logger
from sendSMS import sendSMS
from Needles import dbUser, dbHost, dbPassword, pull_stmt
import pyodbc
import time
#set last_sent to something
last_sent = ''
def sendListener():
#connect to db
cnxn = pyodbc.connect('UID='+dbUser+';PWD='+dbPassword+';DSN='+dbHost)
cursor = cnxn.cursor()
#run query to pull newest row
cursor.execute(pull_stmt)
results = cursor.fetchone()
#if query results different from results stored in last_sent, run function.
#then set last_sent object to the query results for next comparison.
if results != last_sent:
sendSMS()
last_sent = results
else:
cnxn.close()
# a loop to run the check every 2 seconds- as to lessen cpu usage
def sleepLoop():
while 0 == 0:
sendListener()
time.sleep(2.0)
sleepLoop()
我确信有更好的方法来实现这一点。
解决方案
这里:
if results != last_sent:
sendSMS()
last_sent = results
else:
cnxn.close()
Python 看到您分配给last_sent
,但在此函数中未将其标记为全局,因此它必须是本地的。然而你在results != last_sent
它的定义之前阅读它,所以你得到了错误。
要解决此问题,请在函数开头将其标记为全局:
def sendListener():
global last_sent
...
推荐阅读
- python - 用多个单个值替换多个值列表的优雅方法
- python - 如何将生成的值放入组合框中?
- python - 在两个不同的数据框中添加两列
- sylius - Sylius:自定义命令中未找到频道
- css - 网格项目中的材质 UI 按钮 - 尝试向右浮动
- python - pymqi correlId 长度
- google-cloud-platform - Google Cloud IAM 添加大量用户
- reactjs - 部署反应应用
- css - 如何在 bootstrap 4 中使用 flexbox 的自动宽度列?
- php - laravel-websockets 无法与客户端连接(WebSocket 连接到 wss://***:6001 失败)