在Django中,多資料操作,你可以編寫測試來查詢另一個資料庫伺服器中的資料,並將結果匯入當前Django專案的資料庫表中

侬侬发發表於2024-04-24

在Django中,你可以編寫測試來查詢另一個資料庫伺服器中的資料,並將結果匯入當前Django專案的資料庫表中。下面是一個簡單的示例:

假設你有一個Django應用程式,名為myapp,並且你希望從另一個資料庫伺服器中的某個表中獲取資料,並將其匯入myapp應用程式的某個模型中。

首先,確保你的settings.py中配置了要連線的資料庫。你可以在DATABASES設定中定義多個資料庫連線。

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'other_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'other_db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'other_db_host',
        'PORT': 'other_db_port',
    },
}

接下來,在你的tests.py中編寫測試程式碼:

# tests.py

from django.test import TestCase
from myapp.models import MyModel  # 匯入你的模型
from other_app.models import OtherModel  # 匯入另一個應用程式的模型
from django.db import connections

class MyTest(TestCase):
    def test_import_data(self):
        # 獲取其他資料庫連線
        other_db_conn = connections['other_db']
        
        # 在其他資料庫中查詢資料
        other_data = OtherModel.objects.using('other_db').all()
        
        # 將查詢到的資料匯入當前資料庫
        for item in other_data:
            my_model_instance = MyModel(
                field1=item.field1,  # 適當地修改這些欄位名以匹配你的模型
                field2=item.field2,
                # 依此類推
            )
            my_model_instance.save()

        # 檢查資料是否成功匯入
        self.assertEqual(MyModel.objects.count(), len(other_data))

在這個例子中,我們假設OtherModel是另一個應用程式中的模型,它與你的MyModel不同。你可以根據需要調整欄位名和模型結構。在測試方法中,我們使用了using('other_db')來指定使用其他資料庫連線執行查詢。

確保在執行測試之前,你已經在其他資料庫中填充了資料,並且在當前資料庫中MyModel表為空。你可以使用python manage.py test來執行測試。

mysql案例
# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'your_database_name',
        'USER': 'your_database_user',
        'PASSWORD': 'your_database_password',
        'HOST': 'localhost',  # 當前資料庫伺服器地址
        'PORT': '3306',  # MySQL 預設埠
    },
    'other_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'other_database_name',
        'USER': 'other_database_user',
        'PASSWORD': 'other_database_password',
        'HOST': 'other_server_host',  # 其他資料庫伺服器地址
        'PORT': '3306',  # MySQL 預設埠
    },
}

sql server案例

如果其他資料庫是 SQL Server 2019,你需要在 Django 中使用適當的資料庫引擎以及正確的連線資訊來配置資料庫連線。首先,確保你的 Django 專案已經安裝了 django-pyodbc-azure 庫,這是用於連線 Microsoft SQL Server 資料庫的 Django 後端。然後,按照以下步驟操作:

  1. settings.py 中配置資料庫連線,確保你指定了正確的 SQL Server 連線資訊
# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'your_database_name',
        'USER': 'your_database_user',
        'PASSWORD': 'your_database_password',
        'HOST': 'your_server_host',  # SQL Server 伺服器地址
        'PORT': '',  # 通常為空
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',  # 或者根據你的驅動版本指定
        },
    },
    'other_db': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'other_database_name',
        'USER': 'other_database_user',
        'PASSWORD': 'other_database_password',
        'HOST': 'other_server_host',  # 其他 SQL Server 伺服器地址
        'PORT': '',  # 通常為空
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',  # 或者根據你的驅動版本指定
        },
    },
}

確保 sql_server.pyodbc 是正確的引擎,並且使用了正確的 ODBC 驅動程式。OPTIONS 中的 'driver' 值應該是你在本地安裝的 ODBC 驅動程式的名稱。

在測試程式碼中,使用 using() 方法來指定要使用的資料庫連線,就像之前一樣

# tests.py

from django.test import TestCase
from myapp.models import MyModel  # 匯入你的模型
from other_app.models import OtherModel  # 匯入另一個應用程式的模型

class MyTest(TestCase):
    def test_import_data(self):
        # 在其他 SQL Server 資料庫伺服器上查詢資料
        other_data = OtherModel.objects.using('other_db').all()  # 使用名為 'other_db' 的資料庫連線
        
        # 將查詢到的資料匯入當前資料庫
        for item in other_data:
            my_model_instance = MyModel.objects.create(
                field1=item.field1,  # 適當地修改這些欄位名以匹配你的模型
                field2=item.field2,
                # 依此類推
            )

        # 檢查資料是否成功匯入
        self.assertEqual(MyModel.objects.count(), len(other_data))

你想要從 SQL Server 2019 資料庫中獲取資料並將其匯入到當前 Django 專案使用的 MySQL 資料庫中。這種情況下,你需要使用兩個不同的資料庫連線。你可以使用 Django 的資料庫路由來分別連線兩個資料庫並處理資料的匯入。

首先,確保你的 Django 專案已經配置了兩個資料庫連線,一個是 MySQL,另一個是 SQL Server 2019。配置時,分別提供正確的連線資訊。

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'your_mysql_database_name',
        'USER': 'your_mysql_database_user',
        'PASSWORD': 'your_mysql_database_password',
        'HOST': 'localhost',  # MySQL 伺服器地址
        'PORT': '3306',  # MySQL 預設埠
    },
    'sql_server': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'your_sql_server_database_name',
        'USER': 'your_sql_server_database_user',
        'PASSWORD': 'your_sql_server_database_password',
        'HOST': 'sql_server_host',  # SQL Server 伺服器地址
        'PORT': '',  # SQL Server 預設埠
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',  # SQL Server 驅動程式
        },
    },
}

然後,在 Django 中建立一個資料庫路由以告訴 Django 如何路由對不同模型的資料庫操作。在 routers.py 檔案中新增以下內容:

# routers.py

class MyRouter:
    def db_for_read(self, model, **hints):
        """
        Reads from 'sql_server' database.
        """
        if model._meta.app_label == 'other_app':
            return 'sql_server'
        return 'default'

    def db_for_write(self, model, **hints):
        """
        Writes always go to the 'default' database.
        """
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if both objects are in the 'default' database.
        """
        db_list = ('default', 'sql_server')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the 'other_app' app only appears in the 'sql_server'
        database.
        """
        if app_label == 'other_app':
            return db == 'sql_server'
        return db == 'default'

settings.py 中註冊這個路由:

# settings.py

DATABASE_ROUTERS = ['your_project_name.routers.MyRouter']

最後,在你的測試程式碼中,使用 using() 方法來指定要從 SQL Server 資料庫中獲取資料。假設 OtherModel 是 SQL Server 資料庫中的模型,MyModel 是 MySQL 資料庫中的模型。

# tests.py

from django.test import TestCase
from myapp.models import MyModel  # 匯入你的模型
from other_app.models import OtherModel  # 匯入另一個應用程式的模型

class MyTest(TestCase):
    def test_import_data(self):
        # 在 SQL Server 資料庫中查詢資料
        other_data = OtherModel.objects.using('sql_server').all()  # 使用名為 'sql_server' 的資料庫連線
        
        # 將查詢到的資料匯入當前 MySQL 資料庫
        for item in other_data:
            my_model_instance = MyModel.objects.create(
                field1=item.field1,  # 適當地修改這些欄位名以匹配你的模型
                field2=item.field2,
                # 依此類推
            )

        # 檢查資料是否成功匯入
        self.assertEqual(MyModel.objects.count(), len(other_data))

這樣,你的測試就能夠從 SQL Server 資料庫中獲取資料並將其匯入到當前 Django 專案使用的 MySQL 資料庫中。

相關文章