我在Python中编写虚拟助手,我希望将每个请求,响应和可能的错误存储在数据库中。 我将一个类用于请求,另一个类用于响应,另一个类用于错误 如何创建为各个类实例共享的ID变量,例如:
首次运行程序(正常运行程序):
request_id = 1
response_id = 1
第二次运行(发生错误并停止程序进入响应类):
request_id = 2
error_id = 2
第三次运行(程序运行正常,响应类跳过了id 2 - 这就是我想要的行为:
request_id = 3
response_id = 3
请注意,在第三次运行中,response_id
收到id 3
且response_id = 2
将永远不存在,导致在第二次运行中,proccess以请求启动并在错误中停止。
ID变量必须始终是唯一的,即使我的程序崩溃并且我必须重新启动它。我知道我可以在我的程序运行时获取数据库中的最后一个id,但是有一种方法可以在不包含数据库的情况下执行它吗?
答案 0 :(得分:1)
由于您使用数据库存储请求和响应,为什么不使用数据库为您生成此ID。
这可以通过使用主键int auto increment创建表来完成。应将每个请求/响应插入到数据库中,数据库将为插入的每个记录生成唯一的ID。
答案 1 :(得分:0)
如果您不需要,可能的解决方案是使用Pyro4而不是数据库。您可以使用以下代码:
import Pyro4
@Pyro4.expose
@Pyro4.behavior(instance_mode="single")
class Tracker(object):
def __init__(self):
self._id = None
def setId(self, value):
print "set well :)", value
self._id = value
print self._id
def getId(self):
print "returning", self._id
return self._id
daemon = Pyro4.Daemon()
uri = daemon.register(Tracker)
print("URI: ", uri)
daemon.requestLoop()
import Pyro4
class Status(object):
def __init__(self, id):
self._id = id
self._pyro = None
def connect(self, target):
self._pyro = Pyro4.Proxy(target)
def updateId(self):
if ( not self._pyro is None ):
self._pyro.setId(self._id)
print "updated"
else:
print "please connect"
def getId(self):
if ( not self._pyro is None ):
return self._pyro.getId()
else:
print "please connect"
from Status import *
class Success(Status):
def __init__(self):
super(Success,self).__init__(1)
from Status import *
class Wait(Status):
def __init__(self):
super(Wait,self).__init__(1)
from Status import *
class Error(Status):
def __init__(self):
super(Error,self).__init__(3)
from Success import *
from Wait import *
from Error import *
#just an example
s = Success()
w = Wait()
e = Error()
s.connect("PYRO:obj_c98931f8b95d486a9b52cf0edc61b9d6@localhost:51464")
s.updateId()
print s.getId()
w.connect("PYRO:obj_c98931f8b95d486a9b52cf0edc61b9d6@localhost:51464")
w.updateId()
print s.getId()
e.connect("PYRO:obj_c98931f8b95d486a9b52cf0edc61b9d6@localhost:51464")
e.updateId()
print s.getId()
当然你需要使用不同的URI,但你现在应该有个好主意。使用Pyro,您还可以根据需要指定静态URI名称。
输出应为:
$ c:\Python27\python.exe run.py
updated
1
updated
2
updated
3
HTH