• Django和flask中使用原生SQL方法


    一、Django中使用原生SQL

    from django.db import connection
    
    cursor=connection.cursor()
    
    # 插入操作
    cursor.execute("insert into hello_author(name) values('钱钟书')")
    
    # 更新操作
    cursor.execute("update hello_author set name='abc' where name='bcd'")
    
    # 删除操作
    cursor.execute("delete from hello_author where name='abc'")
    
    # 查询操作
    cursor.execute("select * from hello_author")
    
    raw=cursor.fetchone()  # 返回结果行游标直读向前,读取一条
    cursor.fetchall()  # 读取所有

    二、flask中使用原生SQL

    db = SQLAlchemy(app)
    
        # 插入操作
        db.session.execute("insert into hello_author(name) values('钱钟书')")
        db.session.commit()
    
        # 更新操作
        db.session.execute("update hello_author set name='abc' where name='bcd'")
        db.session.commit()
    
        # 删除操作
        db.session.exectut("delete from hello_author where name='abc'")
        db.session.commit()
    
        # 查询操作
        rest_one = db.session.execute("select * from hello_author").fetchone()  # 一条数据
        rest_all = db.session.execute("select * from hello_author").fetchall()  # 所有数据

    一般查询操作会将数据返回给前端。返回的方式,一般是通过变量(表中字段为属性,字段的值为对应的属性值)或JSON(通过json.dumps将列表或字典转换为json字符串 或者jsonify直接传入列表、字典)的方式。上面的查询操作只会返回由字段的值组成的元组,而且还没有字段的名称。

    所以需做如下处理:

    1.变量的方式    # 先执行execute,返回值的cursor属性可以获取游标对象

    # 返回值调用fetchone()获取一条数据,格式:(字段1的值,字段2的值....),是一个元组
    # 返回值调用fetchall()获取所有数据,格式[(字段1的值,字段2的值....),(字段1的值,字段2的值....)],是一个由元组组成的列表
    rest = db.session.execute("SELECT * FROM `netease_news`;")
    
    # 游标对象的description属性得到由字段和其他值组成的元组,格式:((字段1,...),(字段2,...)...)
    # 通过列表推导式,遍历元组,取遍历后的元组的第一个索引的值组成一个有字段组成的列表
    # 格式:[字段1,字段2,...]
    field_li = [k[0] for k in rest.cursor.description]
    
    
    # 所有数据
    class A():
        pass
    
    # 定义一个字典保存类A创建出来的对象
    a = {}
    # 定义一个列表追加数据对象
    obj_li = list()
    data_all = rest.fetchall()
    x = 0
    for data in data_all:
        a['obj' + str(x)] = A()
        for i in range(len(data)):
            setattr(a['obj'+str(x)], field_li[i], data[i])
        obj_li.append(a['obj'+str(x)])
        x += 1
    for obj in obj_li:
        print(obj.__dict__)
    
    # 一条数据
    class A():
        pass
    
    
    a = A()
    
    data = rest.fetchone()
    for i in range(len(data)):
        setattr(a, field_li[i], data[i])
    
    print(a.__dict__)

    2.列表、字典的方式:

        # 先执行execute,返回值的cursor属性可以获取游标对象
        # 返回值调用fetchone()获取一条数据,格式:(字段1的值,字段2的值....),是一个元组
        # 返回值调用fetchall()获取所有数据,格式[(字段1的值,字段2的值....),(字段1的值,字段2的值....)],是一个由元组组成的列表
        rest = db.session.execute("SELECT * FROM `netease_news`;")
    
        # 游标对象的description属性得到由字段和其他值组成的元组,格式:((字段1,...),(字段2,...)...)
        # 通过列表推导式,遍历元组,取遍历后的元组的第一个索引的值组成一个有字段组成的列表
        field_li = [k[0] for k in rest.cursor.description]
    
        # 所有数据
        data_all = rest.fetchall()  # 查询所有数据,fetchall()或fetchone()要放到description后面,否则会报错
        result_list = list()
        for data in data_all:
            result = dict(zip(field_li, data))
            result_list.append(result)
    
        # [{字段1:字段1的值,字段2:字段2的值,...},{字段1:字段1的值,字段2:字段2的值,...}.....]
        print(result_list)
    
        # 一条数据
        data = rest.fetchone()
        result = dict(zip(field_li, data))
    
        # {字段1:字段1的值,字段2:字段2的值,....}
        print(result)
  • 相关阅读:
    maven springMVC SSM框架中 出现的406 (Not Acceptable)
    eclipse中maven项目部署到tomcat
    @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
    springMvc注解之@ResponseBody和@RequestBody
    springmvc后台接前端的参数,数组,集合,复杂对象等
    Spring项目JUnit测试报错ClassNotFoundException解决
    后台给前端返回图片
    前端js实现 blob转base64位 和 base64位转blob
    tomcat中实现特定路径下的图片的url访问Tomcat配置图片保存路径,图片不保存在项目路径下
    data:image/png;base64 上传图像将图片转换成base64格式
  • 原文地址:https://www.cnblogs.com/zzmx0/p/13178379.html
Copyright © 2020-2023  润新知