2012-08-11 47 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