【问题标题】:Django how to use connection_created signalDjango如何使用connection_created信号
【发布时间】:2017-12-23 13:53:52
【问题描述】:
我想知道何时连接到我的 Django 数据库,或者我的 Django 服务器何时重新启动。我找到了connection_created Django 信号。说明是:
当数据库包装器与数据库建立初始连接时发送。如果您想将任何连接后命令发送到 SQL 后端,这将特别有用。
所以我认为使用此信号将是我的情况的一个很好的解决方案。建立连接后,我想运行一个函数。我找不到有关此信号用例的任何文档。 connection_created.connect 可能是要使用的功能。这个函数接受一堆参数,但相关的是self、receiver、sender 和weak。有谁知道我如何使用这些参数和这个函数在新的连接实例上运行我的函数?
另外,如果有人有除此信号之外的其他解决方案,我很乐意听到。
【问题讨论】:
标签:
python
django
django-signals
【解决方案1】:
...因为 django 不支持 postgres 模式
Django 支持 postgres 模式:
class MyModel(models.Model):
id = models.IntegerField(primary_key=True)
title = models.TextField()
class Meta:
db_table = '"schema_name"."table_name"'
我在我们所有的项目中都使用这种表示法。
【解决方案2】:
我的所有表都分布在动态 postgres 表模式中,并使用连接信号来设置连接的搜索路径,因为 django 不支持 postgres 模式。
在myapp/apps.py
from django.db.backends.signals import connection_created
class MyappConfig(AppConfig):
name = 'myapp'
def ready(self):
from myapp.schema_manager import new_connection
connection_created.connect(new_connection)
在myapp/schema_manager.py
def new_connection(sender, connection, **kwargs):
search_path = ['public'] + get_current_schemas() # fetch the active schemas
connection.cursor().execute("SET search_path TO %s;" % ', '.join(search_path)
根据the docs,这个信号接收两个参数:
发件人
数据库包装类 - 即 django.db.backends.postgresql.DatabaseWrapper 或 django.db.backends.mysql.DatabaseWrapper 等。
连接
打开的数据库连接。这可以在多数据库配置中使用,以区分来自不同数据库的连接信号。