一、ORM概念

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

ORM在业务逻辑层和数据库层之间充当了桥梁的作用。

二、Django中的ORM

django中使用Mysql数据库

DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "你的数据库名称", # 需要自己手动创建数据库
"USER": "数据库用户名",
"PASSWORD": "数据库密码",
"HOST": "数据库IP",
"POST": 3306
}
}

2. 在与Django项目同名的目录下的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:

import pymysql

pymysql.install_as_MySQLdb()

注:数据库迁移的时候出现一个警告

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion,
by escalating warnings into errors. It is strongly recommended you activate it.

在配置中多加一个OPTIONS参数:Django官网解释

'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},

Model

在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表。

基本情况:

  • 每个模型都是一个Python类,它是django.db.models.Model的子类。
  • 模型的每个属性都代表一个数据库字段。
  • 综上所述,Django为您提供了一个自动生成的数据库访问API,详询官方文档链接

ORM操作

    • 增:

      • models.Tb1.objects.create(c1='xx', c2='oo')   # 增加一条数据,可以接受字典类型数据 **kwargs
      • orm批量创建数据
        • bulk_create(objs)
        • objs=[models.Book(title="图书{}".format(i+15)) for i in range(100)]
        • models.Book.objects.bulk_create(objs)
    • 删:
      • models.Tb1.objects.filter(name='seven').delete()  # 删除指定条件的数据
    • 改:
      • models.Tb1.objects.filter(name='seven').update(gender='0')   # 将指定条件的数据更新,均支持 **kwargs

必知必会13条

  • 1、all() 查询所有数据
  • 2、get(**kwargs) 获取一个对象 如果查询没有或者多个 就报错
  • 3、filter(**kwargs) 查询所有满足条件的对象
  • 4、exclude(**kwargs): 查询所有不满足条件的对象
  • 5、values(*field): 不写参数 取对象的所有字段数据 指定参数 取对象指定字段的数据
  • 6、values_list(*field): 不写参数 取对象的所有字段数据,元组形式 ,指定参数 取对象指定字段的参数
  • 7、order_by(*field): 按照指定字段排序 默认升序 ,加负号降序,可以多字段排序
  • 8、reverse(): 对已经排序的QuerySet进行反向排序。
  • 9、distinct() 去重,从返回结果中剔除重复纪录
  • 10、count(): 计数 对QuerySet的对象进行计数
  • 11、first(): 取QuerySet中的第一元素
  • 12、last(): 返回最后一条记录
  • 13、exists(): 如果QuerySet包含数据,就返回True,否则返回False

单表查询双下划线模糊查询

    • 1、gte 大于等于;lte小于等于
    • 2、in 在xx之中
      ret = models.Person.objects.filter(id__in=[1,3,5,7,9,]) 获取id等于1,3,5,7,9的对象,id没有7,9不会报错
    • 3、contains 包含,对大小写敏感;icontains 包含,对大小写不敏感
      models.Person.objects.filter(name__contains='du') 获取name字段包含“du”的,对大小写敏感
    • 4、range 范围
      models.Person.objects.filter(id__range=[1,5]) 获取id等于1到5的对象
    • 5、startswith 以xx开头,istartswith 开头.不区分大小写, endswith结尾, iendswith结尾不区分大小写

锁和事务

1. 锁

select_for_update(nowait=False, skip_locked=False)

返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SELECT ... FOR UPDATE 语句。

举个例子:

entries = Entry.objects.select_for_update().filter(author=request.user)

所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。

一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞,直到锁被释放。 如果这不想要使查询阻塞的话,使用select_for_update(nowait=True)。 如果其它事务持有冲突的锁, 那么查询将引发 DatabaseError 异常。你也可以使用select_for_update(skip_locked=True)忽略锁定的行。 nowait和skip_locked是互斥的,同时设置会导致ValueError。

目前,postgresql,oracle和mysql数据库后端支持select_for_update()。 但是,MySQL不支持nowait和skip_locked参数。

使用不支持这些选项的数据库后端(如MySQL)将nowait=True或skip_locked=True转换为select_for_update()将导致抛出DatabaseError异常,这可以防止代码意外终止。

2. 事务

import os

if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup() import datetime
from app01 import models try:
from django.db import transaction
with transaction.atomic():
new_publisher = models.Publisher.objects.create(name="火星出版社")
models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10)
# 指定一个不存在的出版社id
except Exception as e:
print(str(e))

Django中使用ORM的更多相关文章

  1. Django中的ORM进阶操作

    Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. ...

  2. 在Django中使用ORM创建图书管理系统

    一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等 ...

  3. Django中的ORM框架使用小技巧

      Django中的ORM框架使用小技巧 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. Django对各个数据提供了很好的支持,包括PostgreSQL,MySQL,SQLite ...

  4. django中的ORM介绍和字段及字段参数

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  5. Django中的ORM介绍,字段以及字段的参数。

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  6. Django 中得ORM介绍和字段及字段参数

    ORM 介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说 ORM 是通过使用 ...

  7. django中的ORM与 应用与补充

    目录 django中的ORM与 应用与补充 ORM与数据的对应关系 ORM 常用字段 ORM 其他字段 自定义字段 字段参数 Model Meta参数 常用13中查询(必会) 单表查询的双下划线应用 ...

  8. Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?

    Inspectdb Django项目通过绑定的数据库中的相应表格直接自动化生成Model 模型类 python manage.py inspectdb Django 中的 ORM 可以实现对象关系映射 ...

  9. Django中的ORM

    Django中ORM的使用. 一.安装python连接mysql的模块:MySQL-python sudo pip install MySQL-python 安装完成后在python-shell中测试 ...

随机推荐

  1. redis集群JedisCluster连接关闭问题

    JedisCluster连接关闭问题 set方法为例 //伪代码 JedisCluster jedisCluster = new JedisCluster(); jedisCluster.set(&q ...

  2. linux问题故障

    分析问题的方法论 What-现象是什么样的 When-什么时候发生 Why-为什么会发生 Where-哪个地方发生的问 How much-耗费了多少资源 How to do-怎么解决问题 4. cpu ...

  3. SSM+Redis结构框架及概述

    1.Spring IoC承担了一个资源管理.整合.即拔即插的功能. 2.Spring AOP可以提供切面管理,特别是数据库事务管理的功能. 3.Spring MVC用于把模型.视图和控制器分层,组成一 ...

  4. GoJS组织结构图

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. dwr超时

    DWR可以指定超时设置: 1.设置局部超时: RemoteBean.remoteMethod(param1, param2, ..., { callback: callbackfun, //回调函数 ...

  6. 多个Activity跳转的小结

    第一个例子:demo1 Main—>SecondActivity—>Main 从流程上看就是从Main跳转到SecondActivity,再从SecondActivity返回到Main.也 ...

  7. 机器学习-liuyubobobo(慕课网)

    第一章 python3玩转机器学习 第二章 机器学习基础 安装:1.anaconda   2.pycharm 第三章 Jupyter Notebook,numpy,Matplotlib 1.jupyt ...

  8. java代码静态分析工具

    需求:有些基础类型的遍历,值希望它被赋予指定的几个值,赋予其他值能够别编译器(IDEA/eclipse)提醒 Android studu结合自己的插件,引入 <!-- https://mvnre ...

  9. IIC协议解析

    (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距 ...

  10. idea安装Maven Helper

    1. File -> Settings... 2. 选择 Plunins, 查询 Maven Helper,如果没有,点击 Search in repositories 3. 选择 Maven ...