类之间共享的增量ID

时间:2017-08-02 12:26:03

标签: python

我在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 3response_id = 2将永远不存在,导致在第二次运行中,proccess以请求启动并在错误中停止。

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

2 个答案:

答案 0 :(得分:1)

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

这可以通过使用主键int auto increment创建表来完成。应将每个请求/响应插入到数据库中,数据库将为插入的每个记录生成唯一的ID。

答案 1 :(得分: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: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