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