2020/02/01 02-SQLAlchemy的CRUD

有了三种映射关系,就可以进行增删改查
2020/02/01 02-SQLAlchemy的CRUD_第1张图片
add和add_all是用在session上的,需要使用sqlalchemy提供的session,利用这个会话对数据库进行操作
2020/02/01 02-SQLAlchemy的CRUD_第2张图片

现在想要放到数据库里去,add()要的是实例
2020/02/01 02-SQLAlchemy的CRUD_第3张图片
还有一种写法,一旦操作数据库就要判断有没有错误,没有错误就提交,有错误就打印 ,回滚
2020/02/01 02-SQLAlchemy的CRUD_第4张图片
执行提交就有实际操作,就有sql语句2020/02/01 02-SQLAlchemy的CRUD_第5张图片
但是commit还没记录
2020/02/01 02-SQLAlchemy的CRUD_第6张图片
做了两次add都没报错
2020/02/01 02-SQLAlchemy的CRUD_第7张图片
实际上这个提交这个数据,已经在数据库里存在了,sqlalchemy做了一些处理,判断数据库的状态,同样的数据放在数据库里了,所以没必要做同样的操作,如何发现的,就是看状态变化

执行一下
2020/02/01 02-SQLAlchemy的CRUD_第8张图片
新增完了,update一下
2020/02/01 02-SQLAlchemy的CRUD_第9张图片
加了这一句相当于insert之后,update了一下
2020/02/01 02-SQLAlchemy的CRUD_第10张图片2020/02/01 02-SQLAlchemy的CRUD_第11张图片
新增这个实例之后,进行修改,add_all会检测这个数据有没有差异,有差异就进行更新
2020/02/01 02-SQLAlchemy的CRUD_第12张图片
**现在进行查询,get(2) 等于id=2,没有就是没有条件 *星号from **
2020/02/01 02-SQLAlchemy的CRUD_第13张图片
参数化查询
2020/02/01 02-SQLAlchemy的CRUD_第14张图片
student打印成这样是repr决定的
2020/02/01 02-SQLAlchemy的CRUD_第15张图片
现在是用query方法对某个类进行查询,相当于对表查询,2代表主键=2即可,主键用get方法是最快的
2020/02/01 02-SQLAlchemy的CRUD_第16张图片
现在student刚好对应id=2的那条记录,可以进行修改,修改只提供了一种方法,add(studnet),现在实例是student,刚才是s
2020/02/01 02-SQLAlchemy的CRUD_第17张图片
要修改,要在某个实例上,确实发生过变化再加进来,commit才会有提交,没有变化,写了也是白写
2020/02/01 02-SQLAlchemy的CRUD_第18张图片
增加是完全新建一个对象,add,commit就是新增
2020/02/01 02-SQLAlchemy的CRUD_第19张图片
现在是从数据库找到一条对应的数据,现在是对student这样的数据进行修改,add就会发现现在是在有数据的对象上面进行修改,而且是跟数据库一一对应的,然后把数据进行修改,自动转换成update语句进行commit
2020/02/01 02-SQLAlchemy的CRUD_第20张图片
先select再update,最后where 还是2,echo=true,就可以详细看到这些在做什么
2020/02/01 02-SQLAlchemy的CRUD_第21张图片
这样就发生了改变
2020/02/01 02-SQLAlchemy的CRUD_第22张图片
这就是如何简单查询和更新

先查到所有数据,全部删掉,删除最后也是要commit,固定下来的,现在这样是delet * from 表很危险
2020/02/01 02-SQLAlchemy的CRUD_第23张图片2020/02/01 02-SQLAlchemy的CRUD_第24张图片2020/02/01 02-SQLAlchemy的CRUD_第25张图片
add_all()提交不成功,是因为s没有变化过,只要修改其中一条数据,就不一样了,就可以提交了
2020/02/01 02-SQLAlchemy的CRUD_第26张图片
这里相当于只告诉了name,和age两个字段,所以print(s)id是空的
2020/02/01 02-SQLAlchemy的CRUD_第27张图片
数据库会帮你自增主键ID,然后我们select,就 把id找回来了,将之前insert成功的id拿回来了,所以commit之后,print(s),就有id了2020/02/01 02-SQLAlchemy的CRUD_第28张图片
这里add_all发现数据没有改变过,就没有提交,update语句出不来2020/02/01 02-SQLAlchemy的CRUD_第29张图片2020/02/01 02-SQLAlchemy的CRUD_第30张图片
简单查询得到的是一个可迭代对象
2020/02/01 02-SQLAlchemy的CRUD_第31张图片
get语句可以通过主键查询
在这里插入图片描述
没写,代表 from,但是sql语句没执行*
2020/02/01 02-SQLAlchemy的CRUD_第32张图片
把语句构造出来了,但是没查询
2020/02/01 02-SQLAlchemy的CRUD_第33张图片
list,本来student返回的时候是一个可迭代对象,被迫迭代查询,2020/02/01 02-SQLAlchemy的CRUD_第34张图片
最后可以用for循环迭代
2020/02/01 02-SQLAlchemy的CRUD_第35张图片
get(2)就会查询,get是主键查询,返回的就是一个对象,没必要用容器再封一下2020/02/01 02-SQLAlchemy的CRUD_第36张图片
这个是个集合,但是是懒的,你不动它,它就不查
在这里插入图片描述
一般我们是先查后改,大多数ORM工具都是先查后改,查完的结果,对这些实例一个个进行变化,变化完之后add,add之后commit

在这里插入图片描述
get完之后,对相应的数据进行修改,这样数有差异,add进来,commit就可以生成update语句。
必须先查后改,要更新,就add进来,commit即可

2020/02/01 02-SQLAlchemy的CRUD_第37张图片
insert完了后面还有select语句,再次提交
2020/02/01 02-SQLAlchemy的CRUD_第38张图片
但凡后面用,就再次提交
2020/02/01 02-SQLAlchemy的CRUD_第39张图片
拿到第4条进行更新2020/02/01 02-SQLAlchemy的CRUD_第40张图片
第4条年龄是502020/02/01 02-SQLAlchemy的CRUD_第41张图片
凡是更新,先查后盖,insert之后先select,再update
2020/02/01 02-SQLAlchemy的CRUD_第42张图片
ORM框架一般都这么做,凡是更新,先查后改

2020/02/01 02-SQLAlchemy的CRUD_第43张图片
2020/02/01 02-SQLAlchemy的CRUD_第44张图片
删除指定对象做不到
2020/02/01 02-SQLAlchemy的CRUD_第45张图片
2020/02/01 02-SQLAlchemy的CRUD_第46张图片
rollback了,告诉你一个错误
2020/02/01 02-SQLAlchemy的CRUD_第47张图片2020/02/01 02-SQLAlchemy的CRUD_第48张图片
这个实例没有persisted持久化(ORM都不知道这条数据有没有持久化过,就没法删除),所以我们应该先查后删在这里插入图片描述
删除失败,是因为这个状态不是persisted
/2020/02/01 02-SQLAlchemy的CRUD_第49张图片
这样就会直接查,然后再删除,select,修改,删除都要查数据库已经持久化的数据,insert不需要2020/02/01 02-SQLAlchemy的CRUD_第50张图片
改成这样就可以删除
2020/02/01 02-SQLAlchemy的CRUD_第51张图片2020/02/01 02-SQLAlchemy的CRUD_第52张图片
先查后改,改完之后add,commit
delete是要把你的数据拿过来,挨个告诉session删除,先查后删,最后commit即可
query直接查的结果是迭代器本身,查询时候需要迭代,相当于逼它开始真正查询,拿回来的是一个容器,get方法一般返回一个对象,要么找到,要么没找到,底层用的还是pymysql

这种情况下应该少访问数据库,一般创建一个容器,就反复用这个容器,在内存里折腾。不要问数据库要了,写代码的时候应该先把echo打开,,了解特性之后,真正运行的时候,再把echo=flase,默认false
2020/02/01 02-SQLAlchemy的CRUD_第53张图片

你可能感兴趣的:(2020/02/01 02-SQLAlchemy的CRUD)