1

Pythonで小さなIRC接続を作成しようとしていますが、複数のサーバーに接続できるようにしたいので、サーバーに接続するサーバークラスを作成しました。サーバーをデータベースにも保存したかったので私はそれを行うために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

1 に答える 1

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 = []
于 2012-08-11T20:08:17.033 に答える