为 Django.db 连接对象指定只读访问

ala*_*rs2 11 python django django-testing django-database django-postgresql

我有一系列集成级别的测试,它们在我的 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)
Run Code Online (Sandbox Code Playgroud)

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

def CollecWeatherData(self):
    cur = connection.cursor()
    cur.execute(<Raw SQL Query>)
    wm.WeatherData = cur.fetchall()
    cur.close()
Run Code Online (Sandbox Code Playgroud)

我想以某种方式对此进行白痴证明,以便其他人(或我)以后不能出现并意外编写会修改生产数据库的测试。

ala*_*rs2 1

伙计,再一次,在我在这里发布问题之前,我应该更仔细地阅读文档。我可以在设置文件中定义与生产数据库的只读连接,然后直接从文档定义:

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

from django.db import connections
cursor = connections['my_db_alias'].cursor()
# Your code here...
Run Code Online (Sandbox Code Playgroud)