Tornado+SQLalchemy 插入多条数据时,结果只插入一条数据
程序员文章站
2022-04-16 10:29:12
...
1、目的:一个学生拥有多张卡
学生表:
卡号表:
2、出现问题:
多值插入只插入了一条值
3、过程
①、先将SQL alchemy 的session封装成上下文形式
# 使用上下文管理器封装session的建立和关闭,这样就不用手动关闭session
@contextmanager
def session_maker(session=session1):
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
②、for 语句插入值 正确插入值示例
Q:怎么只插入一条值?
A: for i in ids:
cinfo = CardInfo()
注解:遍历之后实例化模型对象,一个对象只能对应插入一条值,要插入几条值就创建几个模型对象
Q:怎么获取插入值的ID?
A: session.add() 之后 session.flush();格式:表对象.字段 eg:stu.ID
class AddStudentHandler(tornado.web.RequestHandler):
def post(self):
# 创建多条数据
# 通过多张卡来联合学生id
ids = [3, 4] # 存放卡号
sid = [] # 存放插入学生记录自生成的ID
cid = [] # 存放插入卡号记录自生成的ID
with session_maker() as session:
stu = Student()
stu.s_name = '小云'
stu.s_age = 18
#因为之前封装了session,直接使用session.add()方法,不用手动提交和关闭
session.add(stu)
# 提交后需要刷新才会生成新插入记录的 ID
session.flush()
# 存放到全局列表便于其他方法调用
# 获取 插入值ID stu.id
sid.append(stu.id)
# 可以创建多个session,也可以使用同一个session,因为用完会自动关闭
with session_maker() as session:
for i in ids:
# 表模型对象实例化一定要放在遍历下,要不然只会插入一条记录
cinfo = CardInfo()
print('遍历卡号', i)
cinfo.cardnum = '%s' % i
cinfo.s_id = sid[0]
session.add(cinfo)
session.flush()
print("插入的卡号返回的ID", cinfo.id)
cid.append(cinfo.id)
③、错误示例:
#错误示例:对象实例化在遍历之外,就只实例化一次,因此只插入一条值
cinfo = CardInfo()
for i in ids:
class AddStudentHandler(tornado.web.RequestHandler):
def post(self):
# 创建多条数据
# 通过多张卡来联合学生id
ids = [3, 4] # 存放卡号
sid = [] # 存放插入学生记录自生成的ID
cid = [] # 存放插入卡号记录自生成的ID
with session_maker() as session:
stu = Student()
stu.s_name = '小云'
stu.s_age = 18
#因为之前封装了session,直接使用session.add()方法,不用手动提交和关闭
session.add(stu)
# 提交后需要刷新才会生成新插入记录的 ID
session.flush()
# 存放到全局列表便于其他方法调用
# 获取 插入值ID stu.id
sid.append(stu.id)
# 可以创建多个session,也可以使用同一个session,因为用完会自动关闭
with session_maker() as session:
#错误示例:对象实例化在遍历之外,就只实例化一次,因此只插入一条值
cinfo = CardInfo()
for i in ids:
print('遍历卡号', i)
cinfo.cardnum = '%s' % i
cinfo.s_id = sid[0]
session.add(cinfo)
session.flush()
print("插入的卡号返回的ID", cinfo.id)
cid.append(cinfo.id)
上一篇: Django 中ORM操作数据库的使用方法、步奏、案例
下一篇: Django(五)、ORM基础