首頁  >  文章  >  後端開發  >  python中django操作多資料庫的方法(程式碼)

python中django操作多資料庫的方法(程式碼)

不言
不言原創
2018-09-17 16:45:441415瀏覽

這篇文章帶給大家的內容是關於python中django操作多資料庫的方法(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

1、新增資料庫路由指派檔案

在專案資料夾裡建立‘database_router’檔案。將下面的程式碼複製到該檔案裡。

from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
class DatabaseAppsRouter(object):
    """
    A router to control all database operations on models for different

    databases.
    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router

    will fallback to the `default` database.
    Settings example:
    DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
    """
    def db_for_read(self, model, **hints):

        """"Point all read operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):

        """Point all write operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None
    def allow_relation(self, obj1, obj2, **hints):

        """Allow any relation between apps that use the same database."""

        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)

        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)

        if db_obj1 and db_obj2:

            if db_obj1 == db_obj2:

                return True

            else:

                return False

        return None

    def allow_syncdb(self, db, model):

        """Make sure that apps only appear in the related database.""

        if db in DATABASE_MAPPING.values():

            return DATABASE_MAPPING.get(model._meta.app_label) == db

        elif model._meta.app_label in DATABASE_MAPPING:

            return False

        return None
    def allow_migrate(self, db, app_label, model=None, **hints):

        """

        Make sure the auth app only appears in the 'auth_db'

        database.

        """

        if db in DATABASE_MAPPING.values():

            return DATABASE_MAPPING.get(app_label) == db

        elif app_label in DATABASE_MAPPING:

            return False

        return None

2、在settings.py檔案中設定多重資料庫

#
# Database

# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'django_test',

        'HOST': '127.0.0.1',

        'USER': 'root',

        'PASSWORD': '123456',

        'PORT': '3306',

},

#配置第二个数据库

    'test': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'xsanjiaocheng',

        'HOST': '127.0.0.1',

        'USER': 'root',

        'PASSWORD': '123456',

        'PORT': '3306',

    }

}

#設定資料庫路由,將django_test改為你專案的名稱。

DATABASE_ROUTERS = ['django_test.database_router.DatabaseAppsRouter']

#設定資料庫與app的對應關係

#
DATABASE_APPS_MAPPING = {
    # example:
    # 'app_name':'database_name',
    # 'app01': 'test',
    'app01': 'default',
    'app02': 'test',
}

#3、在對應的app裡的models.py檔案裡正常建立資料表即可(在建立表格時盡量不要使用同樣的表名)

app01中的models.py:

class django_test_1(models.Model):

    abc = models.CharField(max_length=20)

    class Meta:

        app_label='app01'

app02中的models.py:

class test_1(models.Model):

    tests= models.CharField(max_length=20)

4、產生遷移檔案

與先前一樣:python manage.py makemigrations

5、遷移資料庫

遷移時需指定資料庫名稱

python manage.py migrate  database=test

# 如果針對已建立好的資料庫建立對應的models.py檔案不用產生遷移文件,直接執行「python manage.py  inspectdb > app02/models.py  --database=test」的指令即可。

6、操作資料庫

1)手動選擇資料庫

django_test_1.objects.using('default').create(abc='hdajh')

2)自動選擇資料庫

和以前一樣不加using()。

7、 設定urls.py

匯入對應app的views.py的檔案。最好命名個別名,或為views.py檔重命名。

其他使用和以前一樣。

以上是python中django操作多資料庫的方法(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn