有了三种映射关系,就可以进行增删改查

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库


add和add_all是用在session上的,需要使用sqlalchemy提供的session,利用这个会话对数据库进行操作

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_02

现在想要放到数据库里去,add()要的是实例

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_03


还有一种写法,一旦操作数据库就要判断有没有错误,没有错误就提交,有错误就打印 ,回滚

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_04


执行提交就有实际操作,就有sql语句

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_05


但是commit还没记录

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_06


做了两次add都没报错

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_07


实际上这个提交这个数据,已经在数据库里存在了,sqlalchemy做了一些处理,判断数据库的状态,同样的数据放在数据库里了,所以没必要做同样的操作,如何发现的,就是看状态变化执行一下

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_08


新增完了,update一下

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_09


加了这一句相当于insert之后,update了一下

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_10

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_11


新增这个实例之后,进行修改,add_all会检测这个数据有没有差异,有差异就进行更新

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_12


**现在进行查询,get(2) 等于id=2,没有就是没有条件 *星号from **

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_13


参数化查询

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_14


student打印成这样是repr决定的

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_15


现在是用query方法对某个类进行查询,相当于对表查询,2代表主键=2即可,主键用get方法是最快的

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_16


现在student刚好对应id=2的那条记录,可以进行修改,修改只提供了一种方法,add(studnet),现在实例是student,刚才是s

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_17


要修改,要在某个实例上,确实发生过变化再加进来,commit才会有提交,没有变化,写了也是白写

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_18


增加是完全新建一个对象,add,commit就是新增

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_19


现在是从数据库找到一条对应的数据,现在是对student这样的数据进行修改,add就会发现现在是在有数据的对象上面进行修改,而且是跟数据库一一对应的,然后把数据进行修改,自动转换成update语句进行commit

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_20


先select再update,最后where 还是2,echo=true,就可以详细看到这些在做什么

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_21


这样就发生了改变

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_22


这就是如何简单查询和更新先查到所有数据,全部删掉,删除最后也是要commit,固定下来的,现在这样是delet * from 表很危险

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_23

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_24

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_25


add_all()提交不成功,是因为s没有变化过,只要修改其中一条数据,就不一样了,就可以提交了

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_26


这里相当于只告诉了name,和age两个字段,所以print(s)id是空的

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_27


数据库会帮你自增主键ID,然后我们select,就 把id找回来了,将之前insert成功的id拿回来了,所以commit之后,print(s),就有id了

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_28


这里add_all发现数据没有改变过,就没有提交,update语句出不来

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_29

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_30


简单查询得到的是一个可迭代对象

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_31


get语句可以通过主键查询

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_32


没写,代表 from,但是sql语句没执行*

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_33


把语句构造出来了,但是没查询

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_34


list,本来student返回的时候是一个可迭代对象,被迫迭代查询,

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_35


最后可以用for循环迭代

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_36


get(2)就会查询,get是主键查询,返回的就是一个对象,没必要用容器再封一下

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_37


这个是个集合,但是是懒的,你不动它,它就不查

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_38


一般我们是先查后改,大多数ORM工具都是先查后改,查完的结果,对这些实例一个个进行变化,变化完之后add,add之后commit

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_39


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

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_40


insert完了后面还有select语句,再次提交

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_41


但凡后面用,就再次提交

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_42


拿到第4条进行更新

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_43


第4条年龄是50

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_44


凡是更新,先查后盖,insert之后先select,再update

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_45


ORM框架一般都这么做,凡是更新,先查后改

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_46


sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_47


删除指定对象做不到

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_48


sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_主键_49


rollback了,告诉你一个错误

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_50

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_51


这个实例没有persisted持久化(ORM都不知道这条数据有没有持久化过,就没法删除),所以我们应该先查后删

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_52


删除失败,是因为这个状态不是persisted

/

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_53


这样就会直接查,然后再删除,select,修改,删除都要查数据库已经持久化的数据,insert不需要

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据_54


改成这样就可以删除

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_55

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_56


先查后改,改完之后add,commit
delete是要把你的数据拿过来,挨个告诉session删除,先查后删,最后commit即可
query直接查的结果是迭代器本身,查询时候需要迭代,相当于逼它开始真正查询,拿回来的是一个容器,get方法一般返回一个对象,要么找到,要么没找到,底层用的还是pymysql
这种情况下应该少访问数据库,一般创建一个容器,就反复用这个容器,在内存里折腾。不要问数据库要了,写代码的时候应该先把echo打开,,了解特性之后,真正运行的时候,再把echo=flase,默认false

sqlalchemy 参数 SQLALCHEMY_POOL_RECYCLE sqlalchemy crud_数据库_57