接着上次的定义模型。在models.py内写好Note模型后可以在控制台查看对应的建表语句:
设置URI后
执行
db.create_all()
成功建立了表note。sqlalchemy是不能建立库的,所以sqlalchemy库是我手动创建的。
数据库和表一旦建立后,之后对模型的改动不回自动作用到实际的表中。例如在创建好表后,再在模型中添加新的字段,这时再次调用create_all()并不会更新表的结构。要想让改动生效,最简单的办法是用db.drop_all()删除数据库和表,然后再调用create_all()创建。
执行
db.drop_all()
后删除了表,同样无法删除MySQL的数据库
数据库操作
数据库的主要操作是CRUD,也就是Create(创建)、Read(读取/查询)、Upaate(更新)、Delete(删除)。和增删改查一个意思。SQLAlchemy使用数据库会话来管理数据库操作,数据库会话也称为事务(transaction)。Flask-SQLAlchemy会自动创建会话,可以用db.session属性获取。
数据库的会话代表一个临时存储区,存储了我们对数据库做出的改动。我们可以利用add()方法添加新会话或者更新原有的会话。只有对数据库会话对象调用了commit()方法时,改动才会被提交。调用rollback()方法则会将添加到会话而没有提交的改动撤销。
Create
向数据库添加新记录可以分为三步:
- 实例化模型,作为一条记录
- 添加记录到会话
- 提交会话到数据库
例如向之前的数据库添加三条消息
Read
一个完整的查询遵循这个模式:
<模型类>.query.<过滤方法>.<查询方法>
比较常用的查询方法有
all()-----返回所有记录
first()-----返回第一条记录
get()-----返回指定id的记录
count()-----返回记录总数
通过过滤方法可以获得更精确的查询,而且过滤方法可以叠加使用。最基础的查询过滤器是filter(),用指定的规则来过滤记录。
查找body字段为remember THIS的记录。
也可以查看对应SQL语句
filter中还有其他常用操作符例如:
like
in
not in
and
或者叠加调用多个filter()
Note.query.filter(Note.body.like('%rem%')).filter(Note.id==1).all()
还有一种方法是使用and_(),需要自己import。
or
filter_by()和filter()类似,而且更加简便。
Update
赋值给模型类的字段属性就可以直接改变字段值,调用commit()方法提交会话就完成了更新。
Delete
删和增总是十分相似,只需要把add()方法替换成delete()方法。