Джанго, как использовать сигнал connection_created
Я ищу, чтобы выяснить, когда установлено соединение с моей базой данных Django, или когда мой сервер Django перезапускается. Я нашел сигнал Django для connection_created. Описание:
Отправляется, когда оболочка базы данных устанавливает первоначальное соединение с базой данных. Это особенно полезно, если вы хотите отправить какие-либо команды после соединения в бэкэнд SQL.
Поэтому я думаю, что использование этого сигнала будет хорошим решением для моего случая. Я хочу запустить функцию после установления соединения. Я не могу найти документацию по случаям использования этого сигнала. connection_created.connect
это, вероятно, функция для использования. Эта функция принимает кучу аргументов, но те, которые имеют отношение self
, receiver
, sender
а также weak
, Кто-нибудь знает, как я могу использовать эти аргументы и эту функцию для запуска моей функции в новом экземпляре соединения?
Также, если у кого-нибудь есть альтернативные решения, кроме этого сигнала, я бы хотел их услышать.
1 ответ
Все мои таблицы распределены по динамическим схемам таблиц 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)
Согласно документам, этот сигнал получает два аргумента:
отправитель
Класс оболочки базы данных - т.е. django.db.backends.postgresql.DatabaseWrapper или django.db.backends.mysql.DatabaseWrapper и т. Д.
соединение
Соединение с базой данных, которое было открыто. Это можно использовать в конфигурации с несколькими базами данных, чтобы отличать сигналы подключения от разных баз данных.
... так как 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"'
Я использую эту запись во всех наших проектах.