我在python 3.7中的代码遇到了一个小问题:我想将我从第一个函数(getResult(self,result))的查询中获得的结果与我的'insertMetersCount( )'功能。我该怎么用?
我知道继承不同类别的工作原理,但对于功能而言却不是
from twisted.enterprise import adbapi
from twisted.internet import task
import logging
from datetime import datetime
from twisted.internet import reactor
class MetersCount():
def getTotalMeters(self):
log.info("Select operation in Database.")
getMetersQuery = """ SELECT count(met_id) as totalMeters FROM meters WHERE DATE(met_last_heard) = DATE(NOW()) """
return dbpool.runQuery(getMetersQuery).addCallback(self.getResult).addErrback(self.errorGetQuery)
def getResult(self, result):
print ("Receive Result : ")
print (result)
# general purpose method to receive result from defer.
return result
def errorGetQuery(self,result):
print ("error received", result)
return result
def insertMetersCount(self):
log.info("Insert operation in Database.")
insertMetersQuery = """ INSERT INTO meter_count (mec_datetime, mec_count) VALUES (NOW(), %s)""" % (self.getResult(result))
return dbpool.runQuery(insertMetersQuery).addCallback(self.getResult)
def checkDB(self):
self.getTotalMeters()
self.insertMetersCount()
a= MetersCount()
a.checkDB()
reactor.run()
这就是我得到的错误:“ NameError:未定义全局名称'result'。
答案 0 :(得分:1)
欢迎来到stackoverflow。将来,请尝试发布完整的代码示例。有人可以运行并重现您遇到的问题。另外,张贴您收到的完整错误并解释您期望发生的情况。
您需要将result
传递给insertMetersCount
。您还可以在使用时给它起一个更好的名称,然后停止使用getResult
,它实际上只是身份功能和一些日志记录。另外,请勿将值插值到SQL中。这就是创建SQL注入漏洞的方法。您必须为正在使用的数据库库找到正确的参数样式。我已经离开了“%s”,但可能是“?”或“ \ 1”或其他名称。
def insertMetersCount(self, meters_count):
log.info("Insert operation in Database.")
insertMetersQuery = """ INSERT INTO meter_count (mec_datetime, mec_count) VALUES (NOW(), %s)"""
return dbpool.runQuery(
insertMetersQuery, [meters_count]
)
然后使用必要的参数调用该方法。您可以使用常规的Deferred
API来做到这一点:
def checkDB(self):
d = self.getTotalMeters()
d.addCallback(self.insertMetersCount)
return d
或使用inlineCallbacks
:
from twisted.internet.defer import inlineCallbacks
@inlineCallbacks
def checkDB(self):
meters_count = yield self.getTotalMeters()
yield self.insertMetersCount(meters_count)
这两个都安排完全相同的事情发生。它们只是两个不同的API。