sqlalchemy 学习(一)创建Session和Engine
基本概念
说到数据库,就离不开Session。Session的主要目的是建立与数据库的会话,它维护你加载和关联的所有数据库对象。它是数据库查询(Query)的一个入口。
在Sqlalchemy中,数据库的查询操作是通过Query对象来实现的。而Session提供了创建Query对象的接口。
Query对象返回的结果是一组同一映射(Identity Map)对象组成的集合。事实上,集合中的一个对象,对应于数据库表中的一行(即一条记录)。所谓同一映射,是指每个对象有一个唯一的ID。如果两个对象(的引用)ID相同,则认为它们对应的是相同的对象。
要完成数据库查询,就需要建立与数据库的连接。这就需要用到Engine对象。一个Engine可能是关联一个Session对象,也可能关联一个数据库表。
当然Session最重要的功能还是实现原子操作。
创建Session
from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine engine =create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/s8day128db?charset=utf8") XXXXXX = sessionmaker(bind=engine) session = XXXXXX() # 1. 在student表中插入数据 # obj = models.Student(username='梅凯',password='123',class_id=2) # session.add(obj) # session.commit() # 2. 在学校表中查找到梅凯 # obj = session.query(models.Student).filter(models.Student.username=='梅凯').first() # print(obj) # 3. 找到所有学生,打印学生信息(包含班级名称) # objs = session.query(models.Student).all() # for obj in objs: # cls_obj = session.query(models.Classes).filter(models.Classes.id==obj.class_id).first() # print(obj.id,obj.username,obj.class_id,cls_obj.name) # objs = session.query(models.Student.id,models.Student.username,models.Classes.name).join(models.Classes,isouter=True).all() # print(objs) # objs = session.query(models.Student).all() # for item in objs: # print(item.id,item.username,item.class_id,item.cls.name) # 4. 全栈2期所有的学生 # obj = session.query(models.Classes).filter(models.Classes.name=='全栈2期099').first() # student_list = obj.stus # for item in student_list: # print(item.id,item.username) session.close()
Session的生命期
Session通常在我们需要对数据库进行操作时创建。
一旦一个Session创建成功,我们在这个Session下完成多个事务(transaction)。
究竟何时创建和关闭session,不能一概而论。但是一个原则是session不应该在操作事务的方法中创建。
例如下面的方法定义就是不规范的。
- class SomeThing(object):
- def go(self):
- session = Session()
- try:
- # Do something
- session.commit()
- except:
- session.rollback()
- raise
我们应该做如下改正。
- class SomeThing(object):
- def go(self, session):
- # Do something
- def run_my_program():
- session = Session()
- try:
- SomeThing().go(session)
- session.commit()
- except:
- session.rollback()
- raise
- finally:
- session.close()
浙公网安备 33010602011771号