如何使用Django的ORM从项目中不存在模型的辅助DB进行读写操作?

yks3o0rb  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(141)

这里是当前的情况下,我有2个数据库的项目

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'DB1',
        'USER': 'DB1_ADMIN',
        'PASSWORD': '1234',
        'HOST': 'localhost',
        'PORT': 5432,
        'ATOMIC_REQUESTS': True,
    },
    'crm': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'DB2',
        'USER': 'DB2_ADMIN',
        'PASSWORD': '1234',
        'HOST': 'localhost',
        'PORT': 5432,
        'ATOMIC_REQUESTS': True,
    },

}

我可以将django的ORM用于DB1,因为它是这个项目的主数据库,但DB2是另一个项目的数据库,因此DB2中的表不会被当前项目中的模型反映出来。
我能够使用原始查询从DB2读取和写入数据,如下所示

rfp_query = f"""SELECT id, currency, estimated_budget, reconciled_budget, savings, total_items
                                FROM accounting_rfpbudget WHERE rfp_id = {rfp_id}  """
                cursor = connections['crm'].cursor()
                cursor.execute(rfp_query)

但是我想使用django的ORM,因为我自己管理所有的东西需要花费大量的精力和时间,请告诉我是否有任何方法可以使用django的ORM forDB2记住,项目中没有与数据库表相关联的模型。

xnifntxz

xnifntxz1#

回答我自己的问题,因为我刚刚得到了解决方案,它可能对其他人有帮助,manage.py提供了一个非常有用的命令,称为inspectdb,它将为您创建所有模型。考虑以下步骤。
1.运行命令python manage.py inspectdb --database name-of-db > secondary_db_models.py,这将创建一个名为secondary_db_models.py的文件,其中包含数据库中的所有模型。以下是一个模型的示例

class TicketingServicerequest(models.Model):
    service_request_num = models.IntegerField()
    account_id = models.IntegerField()
    service_request_formatted_num = models.CharField(max_length=100)
    account_name = models.CharField(max_length=255)
    title = models.CharField(max_length=500)
    description = models.TextField()
    status = models.CharField(max_length=50)
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField()
    rfp = models.ForeignKey(EmpeventsRfp, models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'ticketing_servicerequest'

你不能在class meta中看到managed = False,这意味着此应用/项目将不会维护此模型的迁移。
1.你必须保留上面的文件,在应用程序中拥有模型。
1.现在,从项目中任何位置导入文件中的模型,您将能够使用这些模型。

这里需要注意的一点是,如果辅助数据库的模式发生变化,那么您必须再次运行该命令,否则新表或模型将不会显示。

相关问题