2012-08-11 41 views
1

我想创建一个与Python的小型IRC连接,现在我希望它能够连接到多个服务器,所以我创建了一个将连接到服务器的服务器类,我想保存服务器到一个数据库,所以我用sqlalchemy来做到这一点。这是在服务器类SQLAlchemy和线程

def __init__(self, server_name, server_address, server_port=6667): 
     threading.Thread.__init__(self) 
     self.server_name = server_name 
     self.server_address = server_address 
     self.server_port = server_port 

初始化现在奇怪的是,它的实际工作,如果我把创建一个类“手动”像这样

bla = IRCLib.connect("local","127.0.0.1") 

这种方式连接,并有是一点问题都没有,但是当我通过SQLAlchemy的加载类这样

bla = db.BaseService.session.query(IRCLib.server) 
res = bla.all() 
res[0].connect() 

我得到这个错误

raise RuntimeError("thread.__init__() not called") 

现在在类的连接和运行功能,此

def connect(self): 
     self.irc = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
     self.irc.connect ((self.server_address, self.server_port)) 
     self.irc_file = self.irc.makefile("rb") 
     self.start() 

    def run(self): 
     print "in run" 
     self.irc.send ('NICK Test\r\n') 
     self.irc.send ('USER lsb lsb lsb :lsb\r\n') 
     while True: 
      data = self.irc_file.readline() 
      print data 

我真的不知道我可以做的就是它与SQLAlchemy的工作,因为就像我说的,它的工作原理,如果我手动做。

由于

回答

4

__init__()方法时的SQLAlchemy从数据库(:http://docs.sqlalchemy.org/en/rel_0_7/orm/mapper_config.html#constructors-and-object-initialization文档)加载的对象不被调用。要在每次加载对象时执行一项任务,请使用该部分中描述的@orm.reconstructor挂钩:

from sqlalchemy import orm 

class MyMappedClass(object): 
    def __init__(self, data): 
     self.data = data 
     # we need stuff on all instances, but not in the database. 
     self.stuff = [] 

    @orm.reconstructor 
    def init_on_load(self): 
     self.stuff = [] 
+0

感谢像魅力一样工作 – merlin371 2012-08-11 21:39:14