一、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)