Django框架 ,Flask框架 ORM 以及pyrthon原生sql语句操作数据库

WHAT IS ORM?

ORM( Object Relational Mapping) 对象关系映射 , 即通过面向对象思维方式来实现对数据库的操作.

对模型类对象的操作转化为sql 语句

模块内实现数据库表和模型类的关系映射 : 开发人员只用对模型内的实例化对象进行相应操作,底层函数会自动转化为sql 语句来实现对数据库 的增改查删

优点 : 1操作简单更易理解代码编写简单, 2比起原生sql 语句可以节省代码量少可以节省大量开发时间, 符合目前开发的主流思想是用空间换取时间 缩短开发周期降低开发难度

缺点 : 建立了ORM映射 对模型类对象的操作 内层执行命令的依然是sql语句 这个反射的过程 存在不少的性能消耗问题,索性现在都有懒加载,缓存等机制 让ORM 性能消耗大大降低 , 相信未来会更低到可忽略

目前python主流 框架 Django,Flask 以及原生sql 语句 在实际编程的使用对比

原生sql

PyMySQL 模块

python3 连解数据库模块

实现流程

1 导入模块包
2 创建连接对象
3 获取游标对象
4 编写sql 语句
5 执行sql 语句
5.1 查询语句- 接受结果
   5.2 增删改语句 - 提交执行 或者回滚执行
6 关闭 游标对象
7 关闭连接对象
   

对数据库的CURD操作

Django

django.db 模块

Django框架自带数据库映射模块

实现流程

0 配置数据库
1 定义模型类
2 创建模型类的实例化对象
3 利用对象的方法实现对数据库的CURD

django.db 模块 定义模型类

导包 models

所有自定义模型类都继承 models.Model

案例:

class BookInfo(models.Model):
# django.db 会自动映射id 字段不用指定
# CharField 指定数据类型为字符串类型 参数是字段约束
name = models.CharField(default=0, verbose_name='书名') # 表库列名 映射属性名
# IntegerField 指定数据类型为整型 参数是字段约束
count = models.IntegerField(default=0, verbose_name='阅读量') # 表库列名 映射属性名 class Meta:
      db_table = 'tb_books' # 指明数据库表名 映射表
      verbose_name = '图书' # 在admin站点中显示的名称
      verbose_name_plural = verbose_name # 显示的复数名称
       
      def __str__(self):
      """定义每个数据对象的显示信息"""
      return self.btitle
   

对数据库的CURD操作

create:

案例

# 原生sql insert into tb_book values (0,"少年维特的烦恼", 1000)
方法一
book = BookInfo(name="少年维特的烦恼", count=1000)
book.save()
方法二 升级版
BookInfo.objects.create(
name="仲夏夜之梦",
count=1000
)

update:

案例

# 原生sql update tb_book set name = "围城" where id = 1;
方法一:
book = BookInfo.objects.get(id=1)
book.name = "围城"
book.save()
方法二 升级版:
# .objects.filter.update() 会修改所有过滤出的行 一般过滤条件用id
BookInfo.objects.filter(name="人间失格").update(name="西游记")

read:

案例

 # 获得所有数据行,相当于SQL中的SELECT * FROM
list_all = BookInfo.objects.all()
# filter相当于SQL中的WHERE,可设置条件过滤结果
list_filter = BookInfo.objects.filter(count=1000)
# 获取单个对象
response1 = BookInfo.objects.get(id=1)
 #数据排序
list_all = BookInfo.objects.all().order_by("count")
 # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
 list_limit = Test.objects.all().order_by('count',desc)[0:2]

delete:

案例

原生sql delete from tb_book where id=1
test1 = BookInfo.objects.get(id=1)
test1.delete()

这样看ORM 与原生sql 相差不大

面向对象的优势在强大的继承封装能力

Django 框架加上 DRF 框架后 对数据库 的CURD 将直接被封装到底层,开发者只用指定路由,序列化器,模型类即可

完成CURD

Flask

SQLAlchemy模块

Flask 为轻量级的框架没有自带ORM包一般用SQLAlchemy模块

实现流程

0 配置数据库
1 定义模型类
2 创建模型类的实例化对象
3 利用对象的方法实现对数据库的CURD

SQLAlchemy模块定义模型类

db = SQLAlchemy(app) 所有模型类继承 db.Model

案例:

class BookInfo(db.Model):
# 映射数据库表
__tablename__ = 'user_basic'
# 映射列 参数(表类字段名, 数据类型, 其他约束..., admin站点中显示的名称)
id = db.Column('user_id', db.Integer, primary_key=True, doc='书籍id')

对数据库的CURD操作

SQLAlchemy 的操作指令更接近PyMySQL 模块

create:

案例

# 原生sql insert into tb_book values (0,"少年维特的烦恼", 1000)
方法一
book = BookInfo( name="少年维特的烦恼")
db.session.add(book)
db.session.add_all([user1, user2, user3]) # 批量增加
db.session.commit()

update

案例:

# 原生sql update tb_book set name = "围城" where id = 1;
方法一:
book = BookInfo.query.get(1)
book.name = "围城"
db.session.add(book)
db.session.commit()
方法二 升级版:
# django.db update 传入是 命名参数 SQLAlchemy update 传入是字典
BookInfo.query.filter_by(name="人间失格").update({(name:"西游记"}))
db.session.commit()

read

案例:

方法一:
# 获得所有数据行,相当于SQL中的SELECT * FROM
list_all = BookInfo.query.all()
# 查询第一个 有什么用?
book = book.query.first()
# 根据ID 查询,不存在主键返回 None [django.db 中可以根据更多字段查 get 不到会报错]
book = book.query.get(1)
方法二:
list_all = db.session.query(BookInfo).all()
book = db.session.query(BookInfo).first()
book = db.session.query(BookInfo).get(1)
# filter和filter_by相当于SQL中的WHERE,可设置条件过滤结果
list_filter = BookInfo.query.filter_by(count=1000) #filter_by
list_filter = BookInfo.query.filter(BookInfo.count==1000)
#filter是全局过滤要指定模型 条件要用python 比较符号
# 和fiest()同时使用过滤唯一数据 类似django.db get
# 偏移起始值得置位 offset
list_all = BookInfo.query.offset(2).all()
# 限制获取数据
list_all = BookInfo.query.limit(3).all()
#数据排序
list_all = BookInfo.query.order_by(BookInfo.id.all()
list_all = BookInfo.query.order_by(BookInfo.id.desc()).all()

Django&,Flask&pyrthon原生sql语句 基本操作的更多相关文章

  1. Django中执行原生SQL语句【新编辑】

    参考我的个人博客 这部分迁移到了个人博客中:Django中执行原生SQL语句 这里需要补充一下,还有一个extra方法: ret = models.Student.objects.all().extr ...

  2. Flask使用原生sql语句

    安装pip install flask-sqlalchemy 创建数据库对象 # 设置数据库连接地址app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://r ...

  3. 在django中使用原生sql语句

    raw # row方法:(掺杂着原生sql和orm来执行的操作) res = CookBook.objects.raw('select id as nid from epos_cookbook whe ...

  4. Django设置查看原生SQL语句

    LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBU ...

  5. 043:Django使用原生SQL语句操作数据库

    Django使用原生SQL语句操作数据库 Django配置连接数据库: 在操作数据库之前,首先先要连接数据库.这里我们以配置 MySQL 为例来讲解. Django 连接数据库,不需要单独的创建一个连 ...

  6. 05: MySQLdb 原生SQL语句操作数据库

    1.1 MySQLdb安装与简介 1.MySQLdb 模块的安装(python3中目前这个模块还不可用)参考博客 1. linux: yum install MySQL-python 2. windo ...

  7. Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...

  8. django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境

    ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...

  9. Django之ORM执行原生sql语句

    django中的ORM提供的操作功能有限,在模型提供的查询API不能满足实际工作需要时,可以在ORM中直接执行原生sql语句. Django 提供两种方法使用原生SQL进行查询:一种是使用raw()方 ...

随机推荐

  1. 「每日五分钟,玩转JVM」:线程独占区

    前言 如果我们对计算机组成有所了解,那么我们一定会知道在计算机中有一块儿特殊的区域,称之为寄存器,寄存器包括了指令寄存器和程序计数器,这两样位于CPU中,作为程序运行的大脑来控制程序的运行和流转. 而 ...

  2. lrzsz——一款好用的文件互传工具

    日常开发中,经常需要在linux服务器和本地计算机(Windows或者Mac)两者之间传输文件,这时候就需要用到文件传输工具了. 最近偶然发现一款很好用的文件互传工具: lrzsz .墙裂推荐,好用指 ...

  3. Leetcode之二分法专题-374. 猜数字大小(374. Guess Number Higher or Lower)

    Leetcode之二分法专题-374. 猜数字大小(374. Guess Number Higher or Lower) 我们正在玩一个猜数字游戏. 游戏规则如下:我从 1 到 n 选择一个数字. 你 ...

  4. 转载-springboot缓存开发

    转载:https://www.cnblogs.com/wyq178/p/9840985.html   前言:缓存在开发中是一个必不可少的优化点,近期在公司的项目重构中,关于缓存优化了很多点,比如在加载 ...

  5. 关于Socket、TCP/IP、HTTP、FTP及网络编程

    来源:陶邦仁 链接:http://blog.jobbole.com/99694/ 既然是网络传输,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,再者如何进行可靠高效 ...

  6. JIRA使用过程出现问题整理解答

    转自:http://www.51testing.com/html/44/n-2820444.html 发表于:2015-5-28 10:22  作者:知乎   来源:51Testing软件测试网采编 ...

  7. 2019nc#3

    题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A Graph Games 点击查看 进入讨论 18/292 未通过 B Crazy Binary String 点击查看 1107/3615 ...

  8. codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)

    题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...

  9. 疯狂的bLue

    疯狂的bLue Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 众所周知神秘的 ACM 实验 ...

  10. codeforces #583 problem D(搜索好题)

    题目大意:在一个已经有障碍的地图上,设置尽可能少的障碍使得(1,1)无法到达(n,m),行进路线位向下或向右. 数据范围:n*m<=1e6 解题思路:答案一定是小于等于2的,因为可以直接阻碍(1 ...