在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))
# 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 後端。然後,按照以下步驟操作:
- 在
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))