sqlalchemy 学习(一)创建Session和Engine

基本概念

 

说到数据库,就离不开Session。Session的主要目的是建立与数据库的会话,它维护你加载和关联的所有数据库对象。它是数据库查询(Query)的一个入口

在Sqlalchemy中,数据库的查询操作是通过Query对象来实现的。而Session提供了创建Query对象的接口

Query对象返回的结果是一组同一映射(Identity Map)对象组成的集合。事实上,集合中的一个对象,对应于数据库表中的一行(即一条记录)。所谓同一映射,是指每个对象有一个唯一的ID。如果两个对象(的引用)ID相同,则认为它们对应的是相同的对象。

要完成数据库查询,就需要建立与数据库的连接。这就需要用到Engine对象。一个Engine可能是关联一个Session对象,也可能关联一个数据库表。

当然Session最重要的功能还是实现原子操作。

 

创建Session

 

[python] view plain copy
 
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不应该在操作事务的方法中创建

 

例如下面的方法定义就是不规范的。

 

[python] view plain copy
 
  1. class SomeThing(object):  
  2.     def go(self):  
  3.         session = Session()  
  4.         try:  
  5.             # Do something  
  6.             session.commit()  
  7.         except:  
  8.             session.rollback()  
  9.             raise  



我们应该做如下改正。

 

 

[python] view plain copy
 
    1. class SomeThing(object):  
    2.     def go(self, session):  
    3.         # Do something  
    4.   
    5. def run_my_program():  
    6.     session = Session()  
    7.     try:  
    8.         SomeThing().go(session)  
    9.         session.commit()  
    10.     except:  
    11.         session.rollback()  
    12.         raise  
    13.     finally:  
    14.         session.close()  

posted on 2018-05-07 22:25  王大拿  阅读(284)  评论(0)    收藏  举报

导航