gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:27:08 26 4
gpt4 key购买 nike

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

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 是我要使用的类的名称。 ma​​p_class_to_table() 函数是我在 SQLAlchemy 文档中发现的一个技巧:http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName

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

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

最佳答案

我认为您的问题与 tablename 变量有关。这是一个class variable它在您创建类时被定义,然后就不会改变。因此,当您的两个实例使用 self.tablename 访问它时,它将是相同的。要解决此问题,请将其移入 init 函数,并将其设为 self.tablename。这将在您每次创建新对象时对其进行初始化。

关于python - SQLAlchemy - 将一个类映射到两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7727478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com