指定的只读访问Django.db公司连接对象

2024-10-03 13:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的Django项目中,我有一系列集成级测试作为管理命令运行。这些测试正在验证从外部来源摄取到我的数据库中的大量天气数据的完整性。因为我有这么多的数据,所以我真的需要对我的生产数据库进行测试,以使测试有意义。我想知道的是如何定义一个只读的数据库连接,它是特定于该命令或连接对象的。我还应该补充说,这些测试不能通过ORM,所以我需要执行原始SQL。在

我的测试结构是这样的

class Command(BaseCommand):
    help = 'Runs Integration Tests and Query Tests against Prod Database'

    def handle(self,*args, **options):
        suite = unittest.TestLoader().loadTestsFromTestCase(TestWeatherModel)
        ret = unittest.TextTestRunner().run(suite)
        if(len(ret.failures) != 0):
            sys.exit(1)
        else:
            sys.exit(0)

class TestWeatherModel(unittest.TestCase):
    def testCollectWeatherDataHist(self):
        wm = WeatherManager()
        wm.CollectWeatherData()
        self.assertTrue(wm.weatherData is not None)

以及WeatherManager.CollectWeatherData()方法如下所示:

^{pr2}$

我想用某种方式证明这一点,这样其他人(或我)以后就不能偶然地编写一个修改生产数据库的测试。在


Tags: 数据命令self数据库defsysexittests
3条回答

如果为模型添加序列化程序,则可以专门处理在只读模式下工作的序列化程序

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ('id', 'account_name', 'users', 'created')
        read_only_fields = ('account_name',)

来自http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

伙计,再说一次,在我发帖之前,我应该更仔细地阅读文档。我可以在设置文件中定义到生产数据库的只读连接,然后直接从docs

如果您使用多个数据库,则可以使用django.db.连接获取特定数据库的连接(和光标)。django.db.连接是一个类似字典的对象,允许您使用其别名检索特定连接:

from django.db import connections
cursor = connections['my_db_alias'].cursor()
# Your code here...

您可以通过钩住Django的connection_created信号来实现这一点,并且 然后将事务设为只读。在

以下内容适用于PostgreSQL:

from django.db.backends.signals import connection_created


class MyappConfig(AppConfig):
    def ready(self):
        def connection_created_handler(connection, **kwargs):
            with connection.cursor() as cursor:
                cursor.execute('SET default_transaction_read_only = true;')
        connection_created.connect(connection_created_handler, weak=False)

这对于某些特定的Django设置很有用(例如运行开发 使用runserver对生产数据库进行编码),您不希望这样做 创建一个真正的只读数据库用户。在

相关问题 更多 >