Tornado+SQLalchemy(一) 插入多条数据时,结果只插入一条数据

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)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值