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