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)