2017-08-02 45 views
0

我在Python中编写虚拟助手,并且我想将每个请求,响应和可能的错误存储在数据库中。 我正在使用一个类的请求,另一个类的响应和另一个类的错误。
如何可以创建用于respectives类的实例共享的ID的变量,例如:类之间共享的增量ID

首先该程序(该程序的正常和正确运行)的运行:

request_id = 1 
response_id = 1 

第二次运行(发生了错误,并停止该程序继续到响应类):

request_id = 2 
error_id = 2 

第三次运行(该程序运行正常,响应类跳过ID 2 - 那就是我想要的行为):

request_id = 3 
response_id = 3 

注意的是,在第三次运行,即response_id收到id 3response_id = 2将永远不会存在,导致在第二次运行过程中开始请求并停在错误中。

ID变量必须始终唯一,即使我的程序崩溃了,我也必须重新启动它。我知道当我的程序运行时,我可以获取数据库中的最后一个id,但是有一种方法可以在不使用数据库的情况下执行它?

回答

1

由于您正在使用数据库来存储请求和响应,为什么不使用数据库为您生成此ID。

这可以通过使用主键int自动增量创建表来完成。每个请求/响应都应该插入到数据库中,并且数据库将为插入的每条记录生成一个唯一的ID。

+0

但它使用三个不同的表右侧的可能吗?我将使用一个请求,一个用于响应,另一个用于错误。 –

+0

是的。只要确保每个表都有一个带有自动增量的整数主键。 – shanmuga

0

如果你不需要,一个可能的解决方案是使用Pyro4而不是数据库。您可以使用下面的代码:

Tracker.py

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()     

Status.py

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" 

Success.py

from Status import * 
class Success(Status): 
    def __init__(self): 
     super(Success,self).__init__(1) 

Wait.py

from Status import * 
class Wait(Status): 
    def __init__(self): 
     super(Wait,self).__init__(1) 

Error.py

from Status import * 
class Error(Status): 
    def __init__(self): 
     super(Error,self).__init__(3) 

run.py

from Success import * 
from Wait import * 
from Error import * 

#just an example 
s = Success() 
w = Wait() 
e = Error() 

s.connect("PYRO:[email protected]:51464") 
s.updateId() 
print s.getId() 
w.connect("PYRO:[email protected]:51464") 
w.updateId() 
print s.getId() 
e.connect("PYRO:[email protected]:51464") 
e.updateId() 
print s.getId() 

当然,你需要使用不同的URI,但你应该有一个好主意,现在。使用Pyro,你也可以根据需要指定一个静态URI名称。

输出应该是:

$ c:\Python27\python.exe run.py 
updated       
1        
updated       
2        
updated       
3 

HTH

+0

感谢您的回答,但对于简单的ID实现来说太长了。 –

+0

嗨,没问题。我明白你不想使用数据库。谢谢 – Alberto