Django如何使用connection_created信号

问题描述 投票:1回答:2

我想找出什么时候连接到我的Django数据库,或重新启动我的Django服务器。我找到了connection_created Django信号。描述是:

数据库包装器与数据库建立初始连接时发送。如果您要将任何后连接命令发送到SQL后端,这将特别有用。

所以我认为使用这个信号对我的情况来说是一个很好的解决方案。我想在建立连接后运行一个函数。我找不到关于此信号用例的任何文档。 connection_created.connect可能是使用的功能。这个函数有很多参数,但相关的是selfreceiversenderweak。有谁知道如何使用这些参数和这个函数在新的连接实例上运行我的函数?

此外,如果除了这个信号之外还有任何其他解决方案,我很乐意听到它们。

python django django-signals
2个回答
5
投票

我将所有表分布在动态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等。

连接

已打开的数据库连接。这可以在多数据库配置中使用,以区分来自不同数据库的连接信号。


0
投票

...因为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"'

我在所有项目中使用这种表示法。

© www.soinside.com 2019 - 2024. All rights reserved.