Джанго, как использовать сигнал 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"'

Я использую эту запись во всех наших проектах.

Другие вопросы по тегам