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 = []
    data_all = rest.fetchall()
    for data in data_all:
        x = 0
        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)

Django和flask中使用原生SQL方法

上一篇:VSC - VS Code 运行Web IDE


下一篇:从输入URL到页面呈现的过程