欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-16 10:29:12
...

1、目的:一个学生拥有多张卡

学生表:

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

卡号表:

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

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)