Python 如何在芹菜任务中更改数据库模式?

Python 如何在芹菜任务中更改数据库模式?,python,django,celery,Python,Django,Celery,我有一个根据子域更改数据库架构的中间件: def tenant_schema_from_request(request): hostname = hostname_from_request(request) tenants_map = get_tenants_map() return tenants_map.get(hostname) def set_tenant_schema_for_request(request): schema = tenant_sche

我有一个根据子域更改数据库架构的中间件:

def tenant_schema_from_request(request):
    hostname = hostname_from_request(request)
    tenants_map = get_tenants_map()
    return tenants_map.get(hostname)

def set_tenant_schema_for_request(request):
    schema = tenant_schema_from_request(request)
    with connection.cursor() as cursor:
        cursor.execute("SET search_path to {}".format(schema))

class TenantMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        set_tenant_schema_for_request(request)
        response = self.get_response(request)
        return response
但如何在芹菜任务中更改数据库模式

任务。py

@shared_task
def send_notification_task(user_id):
    user = User.objects.get(pk=user_id)
    ...

我想你在找我


希望这有帮助

老问题,但我遇到了完全相同的问题并找到了解决方案。分享它,以防其他人需要它

在任务运行之前,应该使用芹菜
task\u prerun
信号切换活动模式

from celery.signals import task_prerun
from django.db import connection

# ensure the task always runs on the public schema
@task_prerun.connect(sender=send_notification_task)
def activate_public_schema(sender, **kwargs):
    connection.schema_name = 'public'

@shared_task
def send_notification_task(user_id):
    user = User.objects.get(pk=user_id)
    ...
下面是一个在任务运行之前将当前模式切换为公共模式的示例

from celery.signals import task_prerun
from django.db import connection

# ensure the task always runs on the public schema
@task_prerun.connect(sender=send_notification_task)
def activate_public_schema(sender, **kwargs):
    connection.schema_name = 'public'

@shared_task
def send_notification_task(user_id):
    user = User.objects.get(pk=user_id)
    ...

谢谢,但这是为了选择数据库,而不是模式,否则我错了?您需要在设置中定义多个指向同一数据库的数据库。在配置中,您可以添加该数据库在查询时使用的选项。这是您将“搜索路径”添加到的位置。我会在一分钟内编辑我的答案。