链接所有数据库都有个链接,链接在sqlalchemy里封装成了一个引擎,需要创建引擎,引擎内部有个链接池,内部集成了对不同数据库的支持,有一个方言的东西,会调用对应数据库的DBAPI
ORM,要求,必须把映射建立好,在新的sqlalchemy提供的编程接口中,尽量让创建mapper的时候使用基类,利用这个基类来创建子类,子类用到了基类的特性,使用元编程来实现的,走这个元类来做了一些改变
sqlalchemy本来就是个ORM框架,还用到了描述器
用了ORM,mapper之后就要对数据库建立链接,需要依靠另外一个实例,session实例,session方法是用sessionmaker得到一个session类;
session要链接数据库,必须绑定一个引擎
session直接调用,query,add,最后commit,会话线程不安全,并行起来,session就会出现问题
CRUD,比较简单,增,就需要先创建一个对象,add,之后commit,
修改,先查后改,查到数据已经在数据库里已经有,再add之后,commit
删除,也是先查后删除
删除之后,会有个问题,会持久化,持久化就是当前对象实例的状态,是持久化状态
状态
每一个实例都有一个状态属性,_一个下划线代表是一个保护属性
inspect给了一个对象
使用repr也这样,代表没有好的表达方式
这个语法是再3.6才支持的,定义一个变量,是这个类型
persistent持久=True
transient是临时的,也不知道以后要不要持久化,所以是临时的
写一个函数,pending就是预备着的,可能要做一些操作的,persistent真正写到数据库里
session_id=没有,attached附加没有,pending没有,transistent临时的,还没有和数据库发生关系,detached分离
这里是mapp
下面是session状态,现在是准备新增
查看状态变化
add之后i,attached是附加的了,pending预备状态=true,就差commit了,当前session中的id=1
修改数据,查看1,2,34,的变化
提交成功后,就persistent持久化=true
先注释掉
会话建立就需要干活了,所以有个会话ID
后面几个状态很有用,
persistent=true说明在数据库里有对应的数据
第一步先transistent,然后只要add加入之后,就变成pending,commit之后,成功的话就是persistent
现在修改下name,然后commit,再看下5,6,7状态
现在操作的是已经在数据库已经持久的记录,presistent=true,怎么修改都是持久的
删除了然后getstate看下状态,需要调用一次flush,不然状态无法改变
调用删除,需要flush一下,在没有commit之前,这时候的状态是deleted,事务提交了就是detached
查看这几步的变化
一调用flush,delete开始执行,
事务一旦提交就是detached分离的了
常见的状态有5个,transient,pending,persistent,deleted,detached
类产生的实例还没有add到session当中去,也就是s=students(),跟谁都没关联,只是创建了一个普通的对象
把实例,在session add之后,就是pending状态,但是还没有真正写入数据库,一旦commit,变成persistent
修改和删除,都需要拿到这些对象,这些状态对象都必须是persistent=true,所以要先查后改,所以首先有个persistent实例,否则不能进行操作。
真要用delete语句,首先需要get,拿到一个persistent实例,然后对这个实例进行删除,看状态必须flush一下,flush之后,变成deleted,做数不作数还需要看commit,就从原来持久化的变成了真删除
看一下persistent指的是什么意思
property装饰器,是一个属性
首先需要有ke’y,且不是none,查询完户分配一个key值
attached要把数据加进来,不能是deleted
把key一加,就可以知道状态是如何切换的
通过这样的方式可以看到实例究竟如何跟数据库关联起来,以及是怎么转变状态的,和数据库里的对应关系