我正在尝试使用Python创建一个小的IRC连接,现在我希望它能够连接到多个服务器,所以我创建了一个将连接到服务器的服务器类,我想将服务器保存到数据库中所以我用sqlalchemy来做那件事。这是服务器类
上的 initdef __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一起使用,因为就像我说的那样,如果我手动操作它会有效。
由于
答案 0 :(得分:4)
当SQLAlchemy从数据库加载对象时,不会调用__init__()
方法(docs: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 = []