Django多数据库配置及逆向生成model教程


Posted in Python onMarch 28, 2020

在项目中我们每个app对应不同的数据库,其中有一个是从数据库逆向生成model,做个笔记。

1、修改项目的setting.py配置 :

DATABASES = {
 'default': {
  'ENGINE': 'django.db.backends.mysql', # 默认用mysql
  'NAME': 'bk',      # 数据库名 (默认与APP_ID相同)
  'USER': 'root',      # 你的数据库user
  'PASSWORD': 'root',      # 你的数据库password
  'HOST': 'xxx.xxx.xxx.xxx',     # 开发的时候,使用localhost
  'PORT': '3306',      # 默认3306
 },
 'cloudsino_test': {
   'ENGINE': 'django.db.backends.mysql', # 默认用mysql
   'NAME': 'cloudsino_test',      # 数据库名 (默认与APP_ID相同)
   'USER': 'root',      # 你的数据库user
   'PASSWORD': 'root',      # 你的数据库password
   'HOST': 'xxx.xxx.xxx.xxx',     # 开发的时候,使用localhost
   'PORT': '3306',      # 默认3306
  },
}

# 设置数据库的路由规则方法
DATABASE_ROUTERS = ['conf.database_router.DatabaseAppsRouter']

# 设置APP对应的数据库路由表,哪个app要连接哪个数据库,没有指定会用default那个。
DATABASE_APPS_MAPPING = {
 # example:
 #'app_name':'database_name',
 'home_application': 'cloudsino_test',
 'cmdb': 'default',
}

2、新建database_router.py:

在与setting.py文件同级的目录下新建database_router.py文件:

# -*- coding: utf-8 -*-
from settings_development import DATABASE_APPS_MAPPING

DATABASE_MAPPING = DATABASE_APPS_MAPPING


class DatabaseAppsRouter(object):
 def db_for_read(self, model, **hints):
  """"建议model类型对象从哪一个数据库读取."""
  if model._meta.app_label in DATABASE_MAPPING:
   return DATABASE_MAPPING[model._meta.app_label]
  return None

 def db_for_write(self, model, **hints):
  """建议model类型对象的写入操作应该使用哪个数据库"""
  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.
  	如果obj1 和obj2 之间应该允许关联则返回True,如果应该防止关联则返回False,如果路由无法判断则返回None
  """
  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.
  定义迁移操作是否允许在别名为db的数据库上运行。如果操作应该运行则返回True ,如果不应该运行则返回False,如果路由无法判断则返回None。
  """
  if db in DATABASE_MAPPING.values():
   return DATABASE_MAPPING.get(app_label) == db
  elif app_label in DATABASE_MAPPING:
   return False
  return None

3.逆向生成model:

在terminal中输入以下命令,使用名为cloudsino_test的DATABASE来逆向生成model到home_application这个app的models.py:

python manage.py inspectdb --database=cloudsino_test > home_application/models.py

Django多数据库配置及逆向生成model教程

逆向生成的model:

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
# * Rearrange models' order
# * Make sure each model has one field with primary_key=True
# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
#
# Also note: You'll have to insert the output of 'django-admin sqlcustom [app_label]'
# into your database.
from __future__ import unicode_literals

from django.db import models


class CloudsinoCpuinfo(models.Model):
 corenumber = models.CharField(max_length=128)
 frequency = models.CharField(max_length=128)
 index = models.CharField(max_length=128)
 manufacturer = models.CharField(max_length=128)
 name = models.CharField(max_length=128)
 partnumber = models.CharField(max_length=128)
 serialnumber = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 device = models.ForeignKey('CloudsinoDevice', blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_cpuinfo'


class CloudsinoDevice(models.Model):
 sn = models.CharField(max_length=128)
 app = models.CharField(max_length=128)
 business_chargeby1 = models.CharField(max_length=128)
 business_chargeby2 = models.CharField(max_length=128)
 chargeby1 = models.CharField(max_length=128)
 chargeby2 = models.CharField(max_length=128)
 description = models.CharField(max_length=128)
 device_status = models.CharField(max_length=128)
 devicename = models.CharField(max_length=128)
 field1 = models.CharField(max_length=128)
 field2 = models.CharField(max_length=128)
 field3 = models.CharField(max_length=128)
 field4 = models.CharField(max_length=128)
 field5 = models.CharField(max_length=128)
 frame_posiniton = models.CharField(max_length=128)
 framename = models.CharField(max_length=128)
 ip = models.CharField(max_length=128)
 manufacturer = models.CharField(max_length=128)
 model = models.CharField(max_length=128)
 os = models.CharField(max_length=128)
 position_desc = models.CharField(max_length=128)
 roomarea = models.CharField(max_length=128)
 roomname = models.CharField(max_length=128)
 servicetag = models.CharField(max_length=128)
 shape = models.CharField(max_length=128)
 specification = models.CharField(max_length=128)
 subtype = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 ucount = models.CharField(max_length=128)

 class Meta:
  managed = False
  db_table = 'cloudsino_device'


class CloudsinoDevicetype(models.Model):
 name = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 status = models.CharField(max_length=128)

 class Meta:
  managed = False
  db_table = 'cloudsino_devicetype'


class CloudsinoDiskinfo(models.Model):
 bus = models.CharField(max_length=128)
 formfactor = models.CharField(max_length=128)
 index = models.CharField(max_length=128)
 manufacturer = models.CharField(max_length=128)
 media = models.CharField(max_length=128)
 name = models.CharField(max_length=128)
 partnumber = models.CharField(max_length=128)
 serialnumber = models.CharField(max_length=128)
 size = models.CharField(max_length=128)
 speed = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_diskinfo'


class CloudsinoFaninfo(models.Model):
 index = models.CharField(max_length=128)
 name = models.CharField(max_length=128)
 partnumber = models.CharField(max_length=128)
 serialnumber = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_faninfo'


class CloudsinoHbacardinfo(models.Model):
 name = models.CharField(max_length=128)
 wwnn = models.CharField(max_length=128)
 wwpn = models.CharField(max_length=128)
 fc_switch = models.CharField(max_length=128)
 switch_port = models.CharField(max_length=128)
 switch_mac = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_hbacardinfo'


class CloudsinoManageinfo(models.Model):
 assetcode = models.CharField(max_length=128)
 department = models.CharField(max_length=128)
 express_code = models.CharField(max_length=128)
 service_level = models.CharField(max_length=128)
 shutdown_level = models.CharField(max_length=128)
 usage = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_manageinfo'


class CloudsinoManufacturertype(models.Model):
 name = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 status = models.CharField(max_length=128)

 class Meta:
  managed = False
  db_table = 'cloudsino_manufacturertype'


class CloudsinoMemory(models.Model):
 name = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 frequency = models.CharField(max_length=128)
 size = models.CharField(max_length=128)
 manufacturer = models.CharField(max_length=128)
 partnumber = models.CharField(max_length=128)
 serialnumber = models.CharField(max_length=128)
 index = models.CharField(max_length=128)
 memoryinfo = models.ForeignKey('CloudsinoMemoryinfo', blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_memory'


class CloudsinoMemoryinfo(models.Model):
 max_dimmslots = models.CharField(max_length=128)
 mem_totalsize = models.CharField(max_length=128)
 memmax_capacitysize = models.CharField(max_length=128)
 populated_dimmslots = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_memoryinfo'


class CloudsinoNetworkinfo(models.Model):
 name = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 mac = models.CharField(max_length=128)
 speed = models.CharField(max_length=128)
 manufacturer = models.CharField(max_length=128)
 partnumber = models.CharField(max_length=128)
 serialnumber = models.CharField(max_length=128)
 index = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_networkinfo'


class CloudsinoOobnetwork(models.Model):
 ip = models.CharField(max_length=128)
 netmask = models.CharField(max_length=128)
 gateway = models.CharField(max_length=128)
 mac = models.CharField(max_length=128)
 ethernet_switch = models.CharField(max_length=128)
 swith_port = models.CharField(max_length=128)
 swith_mac = models.CharField(max_length=128)
 distribution_frame = models.CharField(max_length=128)
 distribution = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_oobnetwork'


class CloudsinoPciecard(models.Model):
 name = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 loc = models.CharField(max_length=128)
 online_state = models.CharField(max_length=128)
 conntype = models.CharField(max_length=128)
 bandwidth = models.CharField(max_length=128)
 speed = models.CharField(max_length=128)
 manufacturer = models.CharField(max_length=128)
 partnumber = models.CharField(max_length=128)
 serialnumber = models.CharField(max_length=128)
 index = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_pciecard'


class CloudsinoPowerinfo(models.Model):
 name = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 model = models.CharField(max_length=128)
 outputpower = models.CharField(max_length=128)
 manufacturer = models.CharField(max_length=128)
 partnumber = models.CharField(max_length=128)
 serialnumber = models.CharField(max_length=128)
 index = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_powerinfo'


class CloudsinoProductnetwork(models.Model):
 ip = models.CharField(max_length=128)
 netmask = models.CharField(max_length=128)
 gateway = models.CharField(max_length=128)
 mac = models.CharField(max_length=128)
 os = models.CharField(max_length=128)
 remote_type = models.CharField(max_length=128)
 remote_port = models.CharField(max_length=128)
 ethernet_switch = models.CharField(max_length=128)
 swith_port = models.CharField(max_length=128)
 swith_mac = models.CharField(max_length=128)
 distribution_frame = models.CharField(max_length=128)
 distribution = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_productnetwork'


class CloudsinoPurchasewarrantyinfo(models.Model):
 date_manuf = models.CharField(max_length=128)
 expiredate = models.CharField(max_length=128)
 price = models.CharField(max_length=128)
 purchase_order = models.CharField(max_length=128)
 purchase_order_name = models.CharField(max_length=128)
 purchase_supply = models.CharField(max_length=128)
 serviceagent = models.CharField(max_length=128)
 warrantyitem = models.CharField(db_column='warrantyItem', max_length=128) # Field name made lowercase.
 warrantyperiod = models.CharField(db_column='warrantyPeriod', max_length=128) # Field name made lowercase.
 warrantystartdate = models.CharField(db_column='warrantyStartDate', max_length=128) # Field name made lowercase.
 warrantytype = models.CharField(db_column='warrantyType', max_length=128) # Field name made lowercase.
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_purchasewarrantyinfo'


class CloudsinoRaidinfo(models.Model):
 name = models.CharField(max_length=128)
 type = models.CharField(max_length=128)
 cachesize = models.CharField(max_length=128)
 speed = models.CharField(max_length=128)
 manufacturer = models.CharField(max_length=128)
 partnumber = models.CharField(max_length=128)
 serialnumber = models.CharField(max_length=128)
 index = models.CharField(max_length=128)
 device = models.ForeignKey(CloudsinoDevice, blank=True, null=True)

 class Meta:
  managed = False
  db_table = 'cloudsino_raidinfo'


class DjangoMigrations(models.Model):
 app = models.CharField(max_length=255)
 name = models.CharField(max_length=255)
 applied = models.DateTimeField()

 class Meta:
  managed = False
  db_table = 'django_migrations'

补充知识:Django使用数据库生成模型类

正常的开发流程

在models.py中定义模型类,要求继承自models.Model

把应用加入settings.py文件的installed_app项

生成迁移文件

执行迁移生成表

使用模型类进行crud操作

使用数据库生成模型类

python manage.py inspectdb > app_name/models.py

例如:

python manage.py inspectdb > booktest/models.py

以上这篇Django多数据库配置及逆向生成model教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python threading多线程编程实例
Sep 18 Python
编写Python脚本来实现最简单的FTP下载的教程
May 04 Python
详解Python Socket网络编程
Jan 05 Python
Python实现计算最小编辑距离
Mar 17 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
python pygame实现方向键控制小球
May 17 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
python装饰器代码深入讲解
Mar 01 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 #Python
如何基于python3和Vue实现AES数据加密
Mar 27 #Python
python小程序基于Jupyter实现天气查询的方法
Mar 27 #Python
Python实现的北京积分落户数据分析示例
Mar 27 #Python
Pyspark获取并处理RDD数据代码实例
Mar 27 #Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 #Python
Python爬虫爬取、解析数据操作示例
Mar 27 #Python
You might like
多重?l件?合查?(一)
2006/10/09 PHP
PHP date函数参数详解
2006/11/27 PHP
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
php编程每天必学之表单验证
2016/03/01 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
python3调用R的示例代码
2018/02/23 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
教师自荐书
2013/10/08 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
关于车尾的标语大全
2015/08/11 职场文书
解析Redis Cluster原理
2021/06/21 Redis
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python