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)

 

 

發佈了59 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章