zoukankan      html  css  js  c++  java
  • Django&,Flask&pyrthon原生sql语句 基本操作

    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()
     
    

     

     

     

  • 相关阅读:
    python os模块汇总
    python xlsxwriter使用方法汇总
    python 虚拟环境生成requirements.txt 和利用requirements.txt批量安装
    python 中将大列表拆分成小列表
    python print的用法
    python学习
    浮躁
    在线绘图工具
    开通园子
    iOS拓展---(APP)进程间常用通信方式总结
  • 原文地址:https://www.cnblogs.com/renoyuan/p/11284696.html
Copyright © 2011-2022 走看看