【问题标题】:SQLAlchemy and ThreadingSQLAlchemy 和线程
【发布时间】:2012-08-12 04:08:17
【问题描述】:

我正在尝试使用 Python 创建一个小型 IRC 连接,现在我希望它能够连接到多个服务器,所以我创建了一个将连接到服务器的服务器类,我想将服务器保存到数据库中同样,我使用 sqlalchemy 来做到这一点。这是服务器类上的 init

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 一起工作,因为就像我说的,如果我手动执行它就可以工作。

谢谢

【问题讨论】:

    标签: python multithreading sqlalchemy


    【解决方案1】:

    当 SQLAlchemy 从数据库加载对象时,不会调用 __init__() 方法(文档: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 = []
    

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 2011-09-11
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多