有了三种映射关系,就可以进行增删改查
add和add_all是用在session上的,需要使用sqlalchemy提供的session,利用这个会话对数据库进行操作
现在想要放到数据库里去,add()要的是实例
还有一种写法,一旦操作数据库就要判断有没有错误,没有错误就提交,有错误就打印 ,回滚
执行提交就有实际操作,就有sql语句
但是commit还没记录
做了两次add都没报错
实际上这个提交这个数据,已经在数据库里存在了,sqlalchemy做了一些处理,判断数据库的状态,同样的数据放在数据库里了,所以没必要做同样的操作,如何发现的,就是看状态变化执行一下
新增完了,update一下
加了这一句相当于insert之后,update了一下
新增这个实例之后,进行修改,add_all会检测这个数据有没有差异,有差异就进行更新
**现在进行查询,get(2) 等于id=2,没有就是没有条件 *星号from **
参数化查询
student打印成这样是repr决定的
现在是用query方法对某个类进行查询,相当于对表查询,2代表主键=2即可,主键用get方法是最快的
现在student刚好对应id=2的那条记录,可以进行修改,修改只提供了一种方法,add(studnet),现在实例是student,刚才是s
要修改,要在某个实例上,确实发生过变化再加进来,commit才会有提交,没有变化,写了也是白写
增加是完全新建一个对象,add,commit就是新增
现在是从数据库找到一条对应的数据,现在是对student这样的数据进行修改,add就会发现现在是在有数据的对象上面进行修改,而且是跟数据库一一对应的,然后把数据进行修改,自动转换成update语句进行commit
先select再update,最后where 还是2,echo=true,就可以详细看到这些在做什么
这样就发生了改变
这就是如何简单查询和更新先查到所有数据,全部删掉,删除最后也是要commit,固定下来的,现在这样是delet * from 表很危险
add_all()提交不成功,是因为s没有变化过,只要修改其中一条数据,就不一样了,就可以提交了
这里相当于只告诉了name,和age两个字段,所以print(s)id是空的
数据库会帮你自增主键ID,然后我们select,就 把id找回来了,将之前insert成功的id拿回来了,所以commit之后,print(s),就有id了
这里add_all发现数据没有改变过,就没有提交,update语句出不来
简单查询得到的是一个可迭代对象
get语句可以通过主键查询
没写,代表 from,但是sql语句没执行*
把语句构造出来了,但是没查询
list,本来student返回的时候是一个可迭代对象,被迫迭代查询,
最后可以用for循环迭代
get(2)就会查询,get是主键查询,返回的就是一个对象,没必要用容器再封一下
这个是个集合,但是是懒的,你不动它,它就不查
一般我们是先查后改,大多数ORM工具都是先查后改,查完的结果,对这些实例一个个进行变化,变化完之后add,add之后commit
get完之后,对相应的数据进行修改,这样数有差异,add进来,commit就可以生成update语句。
必须先查后改,要更新,就add进来,commit即可
insert完了后面还有select语句,再次提交
但凡后面用,就再次提交
拿到第4条进行更新
第4条年龄是50
凡是更新,先查后盖,insert之后先select,再update
ORM框架一般都这么做,凡是更新,先查后改
删除指定对象做不到
rollback了,告诉你一个错误
这个实例没有persisted持久化(ORM都不知道这条数据有没有持久化过,就没法删除),所以我们应该先查后删
删除失败,是因为这个状态不是persisted
/
这样就会直接查,然后再删除,select,修改,删除都要查数据库已经持久化的数据,insert不需要
改成这样就可以删除
先查后改,改完之后add,commit
delete是要把你的数据拿过来,挨个告诉session删除,先查后删,最后commit即可
query直接查的结果是迭代器本身,查询时候需要迭代,相当于逼它开始真正查询,拿回来的是一个容器,get方法一般返回一个对象,要么找到,要么没找到,底层用的还是pymysql这种情况下应该少访问数据库,一般创建一个容器,就反复用这个容器,在内存里折腾。不要问数据库要了,写代码的时候应该先把echo打开,,了解特性之后,真正运行的时候,再把echo=flase,默认false