ORM初探(一)
Object Relational Mapping(ORM):
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM的优势:
- ORM解决的主要问题是对象和关系的映射。它通常将一个类和一张表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
- ORM提供了对数据库的映射,不用直接编写SQL代码,只需操作对象就能对数据库操作数据。
- 让软件开发人员专注于业务逻辑的处理,提高了开发效率。
ORM的劣势:
- ORM的缺点是会在一定程度上牺牲程序的执行效率。
- ORM的操作是有限的,也就是ORM定义好的操作是可以完成的,一些复杂的查询操作是完成不了。
- ORM用多了SQL语句便会淡忘了,关于数据库相关技能也就淡淡退化了。
Django项目中使用mysql数据库:
1、创建Django项目:

创建好项目后生成如下目录结构:先简单认识几个文件。

2、ORM只能操作数据库中的表,不能操作数据库,所以我们需要到mysql数据库中手动创建数据库orm_practice。

3、创建好数据库后到Django项目中的设置文件中设置连接数据库,默认配置如下:

我们重新修改配置文件,修改后的配置看起来像下面这个样子:

4、在orm_practice项目下的同名文件夹下找到__init__.py文件引用pymysql模块,告诉Django使用该模块操作数据库。
import pymysql pymysql.install_as_MySQLdb()

5、到app目录下的models.py中创建出版社Publishing,书籍Books,作者Author三张表,models.py中的每个类就是一张表,类中的属性对应表的字段。
表的结构:一个出版社可以出版多本书,一本书可以由多个作者共同编写,同时一个作者也可以写多本书。最终表的关系如下所示:
from django.db import models # Create your models here.
class Publishing(models.Model):
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30) class Books(models.Model):
bid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
pid = models.ForeignKey("Publishing",on_delete=models.CASCADE) class Author(models.Model):
aid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
books = models.ManyToManyField("Books")
models.py

6、创建表后(也就是在models.py中的类),需要到终端中执行两条命令。
python37 manage.py makemigrations # 生成迁移文件
python37 manage.py migrate # 执行数据迁移


7、使用pycharm带的mysql插件查看数据库结构,首先添加数据库管理器:

选择mysql后会弹出如下配置对话框:

配置成功后,使用mysql管理器对数据库进行操作。

如果觉得图形界面不习惯,也可以使用mysql命令行进行操作,这里主要对app_author、app_author_books、app_books、app_publishing这几张表进行操作。
8、向表app_author、app_author_books、app_books、app_publishing添加数据
8.1出版社表app_publishing中添加字段信息。

8.2书籍表app_books添加字段信息。

8.3作者表app_author添加字段:

8.4在书籍和作者关系表中app_author_books添加字段

到此建表完成。
我们在models.py中其实只创建了三个类Publishing、Books、Author,正常来说也就是创建三张表,但是这里生成了四张表多一个app_author_books,这张表是由作者表中多对多关系Django为我们自动创建的。

#############################################################################################
好了这里先停一下,下节来看一下ORM中的常用字段
#############################################################################################
ORM初探(一)的更多相关文章
- Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作
ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper ...
- Asp.net Core 系列之--3.领域、仓储、服务简单实现
ChuanGoing 2019-11-11 距离上篇近两个月时间,一方面时因为其他事情耽搁,另一方面也是之前准备不足,关于领域驱动有几个地方没有想通透,也就没有继续码字.目前网络包括园子里大多领域驱 ...
- 轻量级ORM框架初探-Dapper与PetaPoco的基本使用
一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...
- php里ezpdo orm框架初探
http://jackyrong.iteye.com/blog/238930 http://www.oschina.net/project/tag/126/orm?sort=view&lang ...
- 【hibernate 初探】之 关系映射,ORM
从整理上讲,一个ORM框架(以hibernate为例)所涉及内容无非就是,如何映射,如何检索,还有事务处理.所以从这三方面入手,基本上可以保证将hibernate可以用到自己的项目之中.所以我先说一下 ...
- C# 通过反射初探ORM框架的实现原理
背景: 以前学的Java进行开发,多用到Mybatis,Hiberante等ORM框架,最近需要上手一个C#的项目,由于不是特别难,也不想再去学习C#的ORM框架,所以就想着用反射简单的实现一下ORM ...
- hibernate课程 初探单表映射1-2 ORM定义
1 什么是ORM? ORM(Object / RelationShip Mapping) 对象/关系映射 面向对象编程(OOP)最终要把对象信息保存在关系性数据库中,要写好多sql语句.这与面向对象编 ...
- Daject初探 - 一个开源关系型数据库对象关系映射(ORM)模型
Daject简介 Daject是用php写的一个关系型数据库抽象模型,通过该模型,可以在不写任何SQL或写很少的SQL就能执行大多数数据库查询操作.Daject具有面向对象,跨数据库的优点,通过数据库 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
随机推荐
- SAP MM 标准采购组织的分配对于寄售采购订单收货的影响
SAP MM 标准采购组织的分配对于寄售采购订单收货的影响 PO 4100004022 是一个寄售的采购订单, 采购组织是CSAS, 工厂代码SZSP.采购信息记录也是有的, MIGO试图对该采购订单 ...
- ionic3 生命周期
ionic3 总共有8个钩子函数,分别是:onPageLoaded,onPageWillEnter,onPageDidEnter,onPageWillLeave,onPageDidLeave,onPa ...
- Windows下安装lxml库方法
如果直接用pip install lxml安装成功,那么恭喜!!! 一般在windows安装都十分蛋疼,pip无法直接安装(提示错误一大片,此处省略……) 因此选择wheel安装方式,步骤如下: 1. ...
- Python3 中 爬网页 \uxxx 问题
今天上午在没事儿爬一下我自己的博客主页文章练习下.在写入的时候遇到的编码问题,折腾了半天 ,记录一下 import urllib.request import time str1 = urllib.r ...
- Vs 中关于项目中的某 NuGet 程序包还原失败:找不到“xxx”版本的程序包“xxx”
问题: 首先出现这个bug的是在我的vs2017社区版的ide上,这两天使用了出现了一个非常神奇的问题,就是我程序中的nuget包总提示找不到源文件,并且我点击Nuget还原的话还一直提示着一 ...
- for in 使用
// JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写. var json = { "id": 1, "n ...
- 移动设备分辨率(终于弄懂了为什么移动端设计稿总是640px和750px)
在我开始写移动端页面至今,一直有2个疑问困扰着我,我只知道结果但不知道为什么 问题1:为什么设计师给的设计稿总是640px或750px(现在一般以Phone6为基准,给的750px) 问题2:为什么我 ...
- 安装window下的redis,redis可视化管理工具(Redis Desktop Manager)安装,基础使用,实例化项目
以下包括内容: 一.redis下载安装,启动 二.Redis可视化管理工具(Redis Desktop Manager)安装 三.实例化项目 一.redis下载安装,启动 1,redis官方下载地址: ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...
- eclipse升级Android SDK Tool版本到25.2.5后运行项目报错Unable to build: the file dx.jar was not loaded from the SDK folder
概述 由于最近通过SDK-Manager更新了build-tools,当要用到dx.jar这个包时,自动调用最新版本Android SDK build-tools中dx.jar,但是运行android ...