我正在写一个"多租户"应用。它将托管在不同的子域上,并且根据它托管的子域,它应该使用不同的数据库。
是否有可能在执行时间内定义哪个数据库应该使用peewee?如果我使用django,我只是写一个处理它的路由器,但我还没有在peewee上找到类似的东西。
我错过了什么吗?
谢谢!
PS:像How to query several similar databases using Peewee?这样的黑客,你需要事先知道要调用哪个类在我的场景中不能正常工作
答案 0 :(得分:3)
您还可以查看ReadSlave module以获取在运行时更改数据库的示例。
代码:
class ReadSlaveModel(Model):
@classmethod
def _get_read_database(cls):
if not getattr(cls._meta, 'read_slaves', None):
return cls._meta.database
current_idx = getattr(cls, '_read_slave_idx', -1)
cls._read_slave_idx = (current_idx + 1) % len(cls._meta.read_slaves)
return cls._meta.read_slaves[cls._read_slave_idx]
@classmethod
def select(cls, *args, **kwargs):
query = super(ReadSlaveModel, cls).select(*args, **kwargs)
query.database = cls._get_read_database()
return query
@classmethod
def raw(cls, *args, **kwargs):
query = super(ReadSlaveModel, cls).raw(*args, **kwargs)
if query._sql.lower().startswith('select'):
query.database = cls._get_read_database()
return query
答案 1 :(得分:1)
答案 2 :(得分:0)
Peewee还提供了使用数据库代理的可能性,您可以在其中轻松切换数据库。 Peewee Documentation
database_proxy = Proxy() # Create a proxy for our db.
class BaseModel(Model):
class Meta:
database = database_proxy # Use proxy for our DB.
class User(BaseModel):
username = CharField()
# Based on configuration, use a different database.
if app.config['DEBUG']:
database = SqliteDatabase('local.db')
elif app.config['TESTING']:
database = SqliteDatabase(':memory:')
else:
database = PostgresqlDatabase('mega_production_db')
# Configure our proxy to use the db we specified in config.
database_proxy.initialize(database)