通过db_table和db_column自定义数据表名和字段名

假如你的数据库里已经有了一张数据表,且该表包含多个字段,你希望通过Django直接访问该数据表的各个字段而不是重新建立新表,你这时可以通过db_table指定数据表名,还可以通过db_column指定希望访问的字段名。

在我们创建一个模型时,Django的ORM会根据应用名(app name), 模型名(model name)和字段名(field name)自动在数据库中创建数据表。比如我们有一个Blog的应用,里面有Article模型, 其中Article模型有title这个字段,那么Django默认会创建一个名为blog_article的数据表,其中有title这个字段。假如我们希望把表名改为article,标题改为article_title,以便与已经存在的数据表或字段建立映射关系,我们可以按如下代码操作。

classArticle(models.Model):"""文章模型"""#通过db_column自定义数据表中字段名

title = models.CharField('标题', max_length=200, db_column='article_title')

slug= models.SlugField('slug', max_length=60, blank=True)def __str__(self):returnself.titleclassMeta:

db_table= 'article' #通过db_table自定义数据表名

通过db_index和Meta index选项给数据表字段建立索引

使用索引可快速访问数据库表中的特定信息。数据库索引好比是一本书前面的目录,没有索引目录的话,你访问书中某个页面需要从第1页遍历到最后一页,如果有目录,你可以快速地根据目录查找到所需要的页面。Django项目中如果你需要频繁地对数据表中的某些字段(如title)使用filter(), exclude()和order_by()方法进行查询,我们强烈建议你对这些字段建议索引(index), 提升查询效率。

要对模型中的某个字段建立数据库索引,你可以使用db_index选项,也可以使用Meta选项建立索引。使用Meta选项的好处是你可以一次性对多个字段建立索引,还可以对多个字段建立组合索引。

方法一: 使用db_index选项classArticle(models.Model):"""文章模型"""#使用db_index=True对title建立索引

title = models.CharField('标题', max_length=200, db_index=True)

方法二: 使用Meta选项classArticle(models.Model):"""文章模型"""title= models.CharField('标题', max_length=200,)classMeta:

indexes=[

models.Index(fields=['title']),

]

Django主从数据库配置

当你刚刚开始建立一个网站时,可能每天只有数十到上百人访问。这时你只有一个数据库,所有APP的数据表也都放一起的,一台普通的服务器能够应付, 也便于维护。但是当访问量上来后,你会发现一台服务器和一个数据库会根本应付不了这个压力。这时你可能希望实现数据库的主从配置,读写分离,把各个数据库放在不同的服务器上,有的专门负责写入,有的专门负责读取,这时你就要学会使用Django同时连接多个数据库,并自定义读写操作。

第一步 修改项目的 settings 配置

在 settings.py 中配置需要连接的多个数据库名称和登录信息。在下例中我们自定义了3个数据库,1个主数据库(primary), 2个从数据库(replica)。

#project/settings.py

DATABASES={'default': {},'primary': {'NAME': 'primary','ENGINE': 'django.db.backends.mysql','HOST': 'xxxx','PORT': 'xxxx','USER': 'mysql_user','PASSWORD': 'spam',

},'replica1': {'NAME': 'replica1','ENGINE': 'django.db.backends.mysql','HOST': 'xxxx','PORT': 'xxxx','USER': 'mysql_user','PASSWORD': 'eggs',

},'replica2': {'NAME': 'replica2','ENGINE': 'django.db.backends.mysql','HOST': 'xxxx','PORT': 'xxxx','USER': 'mysql_user','PASSWORD': 'bacon',

},

}

我们还需要在 settings.py 添加我们手动编写的数据库路由Router。路由的作用是为数据库的读写制定规则。

DATABASE_ROUTERS = ['Project.database_router.PrimaryReplicaRouter']

注意: 主从数据库的同步是通过MySQL配置实现的,而不是Django实现的。Django只负责多个数据库的访问,不负责各个数据库的同步工作。如果你定义了多个路由,请一定注意路由的执行顺序。

第二步 自定义数据库路由Router

在Django项目的根目录下创建 database_router.py 文件, 添加如下代码,自定义数据库路由。该路由规定了读取数据时将随机从replica1和replica2数据库中读取,而写入数据总是写入主数据库primary。该路由还允许三个数据库中的字段建立联系。

classPrimaryReplicaRouter(object):def db_for_read(self, model, **hints):"""Reads go to a randomly-chosen replica."""return random.choice(['replica1', 'replica2'])def db_for_write(self, model, **hints):"""Writes always go to primary."""return 'primary'def allow_relation(self, obj1, obj2, **hints):"""Relations between objects are allowed if both objects are

in the primary/replica pool."""db_list= ('primary', 'replica1', 'replica2')if obj1._state.db in db_list and obj2._state.db indb_list:returnTruereturnNonedef allow_migrate(self, db, app_label, model_name=None, **hints):"""All models end up in this pool."""return True

一个数据库路由是一个类,这个类最多有四个方法:

db_for_read(model, **hints)

建议 model 对象进行读操作时使用的数据库。如果一个数据库操作可以提供对选择数据库有用的附加信息,那么可以通过 hints 字典提供。如果没有建议则返回 None 。

db_for_write(model, **hints)

建议 model 对象进行写操作时使用的数据库。如果一个数据库操作可以提供对选择数据库有用的附加信息,那么可以通过 hints 字典提供。如果没有建议则返回 None 。

allow_relation(obj1, obj2, **hints)

当 obj1 和 obj2 之间允许有关系时返回 True ,不允许时返回 False ,或者没有意见时返回 None 。这是一个纯粹的验证操作,用于外键和多对多操作中,两个对象的关系是否被允许。

allow_migrate(db, app_label, model_name)

决定 model 是否可以和 db 为别名的数据库同步。如果可以返回True , 如果不可以返回 False ,或者没有意见时返回 None 。

Django项目按APP分库

在大型web项目中,我们常常会创建多个app来处理不同的业务,如果希望实现app之间的数据库分离,比如app01走数据库db1,app02走数据库db2,而不是实现读写分离。我们可以定义如下所示的数据库路由, 然后将其加入settings.py 。

classAppDBRouter:def db_for_read(self, model, **hints):if model._meta.app_label == 'app01':return 'db1'if model._meta.app_label == 'app02':return 'db2'def db_for_write(self, model, **hints):if model._meta.app_label == 'app01':return 'db1'if model._meta.app_label == 'app02':return 'db2'

由于manage.py一次只能创建一个数据库,我们可以使用--database选项来依次创建我们需要的数据库。例如:

将app01下models中的表创建到db01的数据库”db1”中

python manage.py  migrate  --database=db1

将app02下models中的表创建到db02的数据库”db2”中

python manage.py  migrate  --database=db2

在使用多数据库时,我们可以使用using方法来手动选择需要读写的数据库,如下所示:

Aricle.objects.using('db1').all()

article_object.save(using='db2')

Django中使用多数据库注意事项:

django 目前不为跨多个数据库的外键关系(ForeinKey)或多对多关系提供任何支持。模型定义的任何外键和多对多关系字段都必须存在一个数据库内。

django mysql 名称_Django 自定义表名和字段名相关推荐

  1. mysql 库名大小写_MySQL 库名、表名、字段名区分大小写吗???

    上周末写了一篇MySQL where查询字段值不区分大小写的文章(MySQL的where查询不区分字段大小写!!!),有个兄弟留言说经常遇到库名.表名.字段名的大小写问题.我想既然研究了大小写的问题, ...

  2. MySQL修改数据表中的字段名

    MySQL修改数据表中的字段名 在一张数据表中只能设置一个唯一名称的字段名.在同一张数据表中,不能出现两个名称完全相同的字段名. 因此,数据库系统可以通过字段名来区分数据表中的不同字段. 在MySQL ...

  3. % mysql 代表_MySQL中的星号(*)和百分号(%)代表表示什么,MySQL的库名、表名、字段名、字段值是否区分大...

    1.MySQL中的星号(*)和百分号(%)代表表示什么 星号(*):表示全部的意思. select * from table_name;(查询表table_name中所有的数据) 百分号(%):表示通 ...

  4. MYSQL在众多表中查询表名和字段名

    在Mysql 众多表中查找一个表名或者字段名的 SQL 语句: SELECT table_name, column_name from information_schema.columns WHERE ...

  5. MySQL修改表名和字段名大小写

    记录一下,根据工作中项目交付要求,要将MySQL数据库中的表名和字段名中做一个规范,其中就有将表名和字段名统一做小写处理. 废话不多说,直接上MySQL脚本: 批量修改数据库下的表名(大写改小写): ...

  6. 【mysql】表名或字段名与关键字重名解决方法

    如果在一个sql业务中,你见到如下字段: date,for,check,while,end,long等作为了表名或者字段名,那么sql执行肯定会有异常信息! 代码: SELECT for,long F ...

  7. Django 表操作时 字段名为变量

    搜索 searchList=Student.objects.filter(**{searchkey:searchvalue}) searchkey 这个变量必须是表中的一个字段 searchvalue ...

  8. MySQL - 查询数据库里所有表名和字段名

    查询数据库里所有表名和字段名的语句 SQL 查询所有表名 SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' SELECT * FROM INFORMATION_SC ...

  9. 修改字段类型 Alter table 表名 modify 字段名 字段类型mysql数据库概念及入门语句...

    1.数据库的概念 数据库(DataBase,DB)是一个长期存储在计算机内的.有组织的.有共享的.统一管理的数据集合.她是一个按数据结构来存储和管理数据的计算机软件系统.数据库的概念实际包括两层意思: ...

最新文章

  1. 【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )
  2. 【软件工程】技术规格说明书
  3. cas 注销不关闭浏览器异常_上海公司经营异常注销麻烦吗
  4. java如何解决高并发症,一整套Java线上故障排查技巧,爱了!
  5. ssldump编译及使用过程
  6. c语言打印树形图形,数据结构C语言版树形结构.ppt
  7. 猫猫学iOS(四十四)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配...
  8. ubuntu16.04搞出百度的方法
  9. AIDE --Linux高级入侵检测
  10. $python日期和时间的处理
  11. 电商扣减库存_电商系统秒杀架构设计
  12. android 平板端应用商店,安卓平板电脑软件商店--乐商店是目前最安全的Android应用商店...
  13. 【正点原子Linux连载】第六十九章 Linux 网络驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
  14. 『已解决』IIS启动 服务无法在此时接受控制信息
  15. 增强版唐奇安通道策略
  16. Mathematica实现0.618法(黄金分割法)求最大最小值
  17. python取出列表的第一列_python取第一列
  18. oracle10g没有行列转换函数的替代方法(转)
  19. 计算机视觉基础知识:射影变换,仿射变换,相似变换(比例变换),刚性变换
  20. 初识ActiveMQ

热门文章

  1. mysql5.6.4安装_win 7 64 mysql 5.6.4 安装
  2. apache mysql 密码_apache2 – 无法为mysql“root”用户设置密码
  3. OpenCV案例(二):选取圆对象
  4. notepad++ 配置C/C++环境
  5. 数据挖掘:模型选择——逻辑回归
  6. FFmpeg入门测试
  7. c++并发编程之thread::join()和thread::detach()(转)
  8. NSNotFound
  9. [LeetCode] 81. Search in Rotated Sorted Array II
  10. (转)sqoop常用命令http://www.cnblogs.com/cenyuhai/p/3306037.html