Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy-将一个类映射到两个表_Python_Mysql_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy-将一个类映射到两个表

Python SQLAlchemy-将一个类映射到两个表,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我有两个数据库队列的实现(它们使用不同的表),并希望它们使用相同类的对象。因此,它们看起来非常相似: class AbstractDBQueue(object): def __init__(self, tablename): self.tablename = tablename self.metadata = MetaData() self.engine = create_engine('mysql+mysqldb://%s:%s@%s:%

我有两个数据库队列的实现(它们使用不同的表),并希望它们使用相同类的对象。因此,它们看起来非常相似:

class AbstractDBQueue(object):
    def __init__(self, tablename):
        self.tablename = tablename
        self.metadata = MetaData()
        self.engine = create_engine('mysql+mysqldb://%s:%s@%s:%d/%s' % (
            settings.DATABASE.get('USER'),
            settings.DATABASE.get('PASSWORD'),
            settings.DATABASE.get('HOST') or '127.0.0.1',
            settings.DATABASE.get('PORT') or 3306,
            settings.DATABASE.get('NAME')
        ), encoding='cp1251', echo=True, pool_recycle=7200)
        self.metadata.bind = self.engine
        self.session = sessionmaker(bind=self.engine)()

    def setup_table(self, table, entity_name):
        self.table = table
        newcls = type(entity_name, (SMSMessage, ), {})
        mapper(newcls, table)
        return newcls

    def put(self, message=None, many_messages=[]):
        if message:
            self.session.add(message)
        else:
            for m in many_messages:
                self.session.add(m)
        self.session.commit()

    def get(self, limit=None):
        if limit:
            q = self.session.query(self.SMSClass).limit(limit)
        else:
            q = self.session.query(self.SMSClass)
        smslist = []
        for sms in q:
            smslist.append(sms)
        self.session.expunge_all()
        return smslist

class DBQueue(AbstractDBQueue):
    """
    MySQL database driver with queue interface
    """
    def __init__(self):
        self.tablename = settings.DATABASE.get('QUEUE_TABLE')
        super(DBQueue, self).__init__(self.tablename)
        self.logger = logging.getLogger('DBQueue')
        self.SMSClass = self.setup_table(Table(self.tablename, self.metadata, autoload=True), "SMSQueue")

class DBWorkerQueue(AbstractDBQueue):
    """
    MySQL database driver with queue interface for separate workers queue
    """

    def __init__(self):
        self.tablename = settings.DATABASE.get('WORKER_TABLE')
        super(DBWorkerQueue, self).__init__(self.tablename)
        self.logger = logging.getLogger('DBQueue')
        self.SMSClass = self.setup_table(Table(self.tablename, self.metadata, autoload=True), "SMSWorkerQueue")

    def _install(self):
        self.metadata.create_all(self.engine)
SMSMessage是我要使用的类的名称。将类映射到表()

但这似乎没有什么帮助-当第一个队列实例将SMSMessage映射到它的表时,我传递给第二个队列的put()的所有对象都隐式地强制转换到第一个队列的映射类,第二个数据库在会话后仍然为空。commit()


我需要同时使用这两个队列,甚至可能使用线程(我认为,池连接会很有用),但我就是无法做到这一点。您能帮忙吗?

我想您的问题与
tablename
变量有关。它是一个在创建类时定义的类,然后不会更改。因此,当您的两个实例使用
self.tablename
访问它时,它们的情况将是相同的。要解决此问题,请将其移动到
init
函数中,并使其成为
self.tablename
。这将在每次创建新对象时初始化它。

我更新了主题-重写中的代码,以便在将tablename作为构造函数参数传递时对这两个队列类使用继承。但是它也不起作用。嗯,如果你先使用第二个队列,它会颠倒顺序吗?我刚刚用继承重写了代码,现在它只会引发一个错误“Class'sms.message.SMSMessage'is not mapped”。我应该将输入对象强制转换为映射类吗?这似乎很奇怪。