主頁(yè) > 知識(shí)庫(kù) > django使用多個(gè)數(shù)據(jù)庫(kù)的方法實(shí)例

django使用多個(gè)數(shù)據(jù)庫(kù)的方法實(shí)例

熱門標(biāo)簽:硅谷的囚徒呼叫中心 電話運(yùn)營(yíng)中心 語(yǔ)音系統(tǒng) 企業(yè)做大做強(qiáng) 呼叫中心市場(chǎng)需求 Win7旗艦版 客戶服務(wù) 百度AI接口

通過(guò)官方文檔https://docs.djangoproject.com/zh-hans/3.1/topics/db/multi-db/和csdnhttps://blog.csdn.net/songfreeman/article/details/70229839的這兩篇文章可以進(jìn)行多數(shù)據(jù)庫(kù)的設(shè)置。但是設(shè)置后可能會(huì)出現(xiàn)問(wèn)題,由于我連接的數(shù)據(jù)庫(kù)是通過(guò)inspactdb的方法得到的model。于是在migrate的時(shí)候出現(xiàn)了問(wèn)題,會(huì)提示 1146, “Table xxx doesn't exist” 。后來(lái)發(fā)現(xiàn)問(wèn)題可能出在路由表上,按照DATABASE_APPS_MAPPING映射之后,django默認(rèn)的表如果要寫入可能會(huì)找不到數(shù)據(jù)庫(kù)。而源代碼里的映射關(guān)系并不包含新加入的app,例如grappelli等。

DATABASE_APPS_MAPPING = {
# example:
# 'app_name':'database_name',
# 'admin': 'default',
# 'users': 'default', #django
'basic_estate': 'basic_estate',
'footstone': 'footstone',
'mall': 'hsmall',
'iot_biz': 'iot_biz',
'mall': 'mall',
'hsuser': 'hsuser',
}

如果要解決這個(gè)問(wèn)題可以修改router代碼,在映射關(guān)系內(nèi)找不到對(duì)應(yīng)的數(shù)據(jù)庫(kù)的情況下返回默認(rèn)數(shù)據(jù)庫(kù)連接即可:

# -*- coding: utf-8 -*-
"""
@author: obaby
@license: (C) Copyright 2013-2020, obaby@mars.
@contact: root@obaby.org.cn
@link: http://www.obaby.org.cn
  http://www.h4ck.org.cn
  http://www.findu.co
@file: atabase_router.py.py
@time: 2021/2/26 9:07
@desc:
"""
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 'default'
 
 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 'default'
 
 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

這樣django系統(tǒng)所需的數(shù)據(jù)庫(kù)就能正常創(chuàng)建了:

總結(jié)

到此這篇關(guān)于django使用多個(gè)數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)django多數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Django ForeignKey與數(shù)據(jù)庫(kù)的FOREIGN KEY約束詳解
  • pycharm中django框架連接mysql數(shù)據(jù)庫(kù)的方法
  • django inspectdb 操作已有數(shù)據(jù)庫(kù)數(shù)據(jù)的使用步驟
  • Python web框架(django,flask)實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫分離的示例
  • Django連接本地mysql數(shù)據(jù)庫(kù)(pycharm)的步驟
  • django 解決model中類寫不到數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)無(wú)此字段的問(wèn)題
  • Python的Django框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)查詢(不返回QuerySet的方法)
  • django 數(shù)據(jù)庫(kù)返回queryset實(shí)現(xiàn)封裝為字典
  • Django項(xiàng)目如何給數(shù)據(jù)庫(kù)添加約束

標(biāo)簽:喀什 山西 長(zhǎng)沙 海南 安康 濟(jì)南 山西 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《django使用多個(gè)數(shù)據(jù)庫(kù)的方法實(shí)例》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266