文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Django项目怎么配置连接多个数据库

2023-06-30 14:42

关注

今天小编给大家分享一下Django项目怎么配置连接多个数据库的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一个APP对应一个默认数据库,若连接其他数据库用".using()"

Author.objects.using('db02').all()

1、在项目settings中增加数据库配置

# settings.py DATABASES = {  'default': {   'ENGINE': 'django.db.backends.oracle',     'NAME': 'orcl19c',      'USER': "username01",     'PASSWORD': "password01",     'HOST': "110.10.1.11",     'PORT': 1511, },  'db_2': {   'ENGINE': 'django.db.backends.oracle',     'NAME': 'orcl19c',      'USER': "username02",     'PASSWORD': "password02",     'HOST': "120.20.2.22",     'PORT': 1512, }}# 以下MyProject改成项目名,默认default不用修改DATABASE_ROUTERS = ['MyProject.database_router.DatabaseAppsRouter']DATABASE_APPS_MAPPING = {    'app01': 'default',    'app02': 'db_2',}

2、在项目根目录下Myproject/Myproject 新建数据库路由文件database_router.py

直接复制以下代码,无需修改

from django.conf import settings DATABASE_MAPPING = settings.DATABASE_APPS_MAPPINGclass 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

3、使用inspectdb反向生成各app的model类之后,配置model类对应要链接的数据库

反向生成models.py 命令:

python manage.py inspectdb --database db1 TableName1 > app01/models.py python manage.py inspectdb --database db2 TableName2 > app02/models.py
# 编辑app01下的models.py:class Names(models.Model): #该model使用default数据库    id=models.CharField(primary_key=True,max_length=100, blank=True, null=True)    name=models.CharField(max_length=32,primary_key=True,unique=True)        class Meta:        #app_label = 'app01' #由于该model连接default数据库,所以在此无需指定        db_table = 'names'        # 编辑app02下的models.py:class Classnum(models.Model): #该model使用default数据库    id=models.CharField(primary_key=True,max_length=100, blank=True, null=True)    classnum=models.CharField(max_length=32,primary_key=True,unique=True)        class Meta:        app_label = 'app02'        db_table = 'classnum'

 4、同步数据库

# 同步default节点数据库,只运行不带 --database参数的命令,不对其他数据库进行同步 python manage.py makemigrations python manage.py migrate # 同步db02节点数据库: python manage.py makemigrations python manage.py migrate --database=db02

5、若要连接配置外的数据库

Author.objects.using('other').all()my_object.save(using='legacy_users')my_object.delete(using='legacy_users')

移动对象到另一个数据库时会发生主键冲突,可以使用obj.pk方法清除主键再保存对象 

>>> p = Person(name='Fred')>>> p.save(using='first')>>> p.pk = None # Clear the primary key.>>> p.save(using='second') # Write a

以上就是“Django项目怎么配置连接多个数据库”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯