Django使用多数据库multiple databases笔记
2017-07-01 00:00
232 查看
假如在一个django项目中使用到了不只一个数据库, 其实这在大一点的工程中很常见,比如主从库
如果不设置或者没有设置的app就会自动使用默认的数据库。
同步数据库时,最好指定databse,否则的话是使用默认的数据库
如果不是defalut(默认数据库)要在命令后边加 --database=数据库对应的settings.py中的名称 如: --database=db1 或 --database=db2
数据库同步(创建表)
1.定义数据源
在settings中的DATABASE中定义会使用到的数据,比如除default外我们还定义了一个 searchDATABASE = { 'default':{ 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'path/to/database.sqllite3', 'USER':'', 'PASSWORD':'', 'HOST': '', 'PORT':'', }, 'search':{ 'ENGINE': 'django.db.backends.mysql', 'NAME': 'search_db', 'USER':'db_user', 'PASSWORD':'p@55word', 'HOST': '192.168.12.186', 'PORT':'', } }
2.不用app使用不同数据库
settings设置
假设我们现在有两个app,分别是books和articles在settings.py文件添加路由#设置app和数据库对应 DATABASE_APPS_MAPPING={ 'books': 'default', 'articles': 'search' } #使用自定义的数据库路由 DATABASE_ROUTERS = ['config.database_app_router.MyAppRouter']
如果不设置或者没有设置的app就会自动使用默认的数据库。
编写自定义数据库路由
在config文件夹里创建database_app_router.py文件#database_app_router.py class MyAppRouter(object): def db_for_read(self, model, **hints): app_label = model._meta.app_label if app_label in settings.DATABASES_APPS_MAPPING: return settings.DATABASES_APPS_MAPPING[app_label] return None def db_for_write(self, model, **hints): app_label = model._meta.app_label if app_label in settings.DATABASES_APPS_MAPPING: return settings.DATABASES_APPS_MAPPING[app_label] return None def allow_relation(self, obj1, obj2, **hints): #取出数据库映射的名字 db_obj1 = settings.DATABASES_APPS_MAPPING.get(obj1._meta.app_label) db_obj2 = settings.DATABASES_APPS_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_migrate(self, db,app_label,model_name=None, **hints): if db in settings.DATABASES_APPS_MAPPING.values(): return settings.DATABASES_APPS_MAPPING.get(app_label) == db elif app_label in settings.DATABASES_APPS_MAPPING: return False return None
3.同一app里使用不同的数据库
在model中指定app_labelclass Book(models.Model): ... class Meta: app_label = 'search'
同步数据库时,最好指定databse,否则的话是使用默认的数据库
$ ./manage.py migrate --database=search
4.使用指定的数据库来执行操作
在查询的语句后面用 using(dbname) 来指定要操作的数据库即可# 查询 YourModel.objects.using('db1').all() 或者 YourModel.objects.using('db2').all() # 保存 或 删除 user_obj.save(using='new_users') user_obj.delete(using='legacy_users')
5.多个数据库联用时数据导入导出
使用的时候和一个数据库的区别是:如果不是defalut(默认数据库)要在命令后边加 --database=数据库对应的settings.py中的名称 如: --database=db1 或 --database=db2
数据库同步(创建表)
# Django 1.7 及以上版本 python manage.py migrate --database=db1
相关文章推荐
- Django学习笔记(7)---多数据库中跨数据库使用多对多
- Django学习笔记(二)——django数据库的使用
- Django使用Python操作数据库 --Django 1.8.2 文档(中文)部分笔记
- Django笔记---模板的使用
- Python的Django框架中使用SQLAlchemy操作数据库的教程
- asp.net ajax程序设计之笔记4--使用DragOverlayExtender拖动元素,结合ProfileService将位置信息保存至数据库
- MySQL学习笔记之一:数据库基础理论及客户端工具的使用
- 在Django中使用数据库遇到的问题
- Crusher Django 学习笔记3 学习使用模板系统
- django 命令行方式使用model建数据库
- DB2新手使用的一些小笔记:新建实例、数据库路径不存在、客户端连接
- django使用model创建数据库表使用的字段
- iOS学习笔记(十六)——数据库操作(使用FMDB) (转)
- django arya插件对数据库操作使用,reverse发娘解析url的使用
- Django 使用数据库
- iOS学习笔记—2—数据库操作(使用FMDB)
- 微软企业库4.1学习笔记(十五)缓存模块3 使用数据库作为后端存储
- Python学习笔记 使用数据库SQlite Mysql
- 微软企业库4.1学习笔记(十五)缓存模块3 使用数据库作为后端存储
- Django 使用 MySQL 存储时间中遇到的问题(在数据库中记录插入时间、更新时间、删除时间)