常见的数据库管理系统(DBMS):MySQL SQLite MongoDB
我们可以把数据库看作一个大仓库,仓库里有一些负责搬运货物的机器人,而DBMS就是操控机器人搬运货物的程序。
数据库分类:
SQL:关系型,SQLServer,Oracle,MYSQL,SQLite
noSQL:非关系型,文档存储(MongoDB,CouchDB),键值对存储(Redis,Riak)
大型项目一般会混用,比如MySQL存储用户资料和文章,使用Redis缓存数据,使用MongoDB存储实时消息。
python实现的ORM有SQLAlchemy(最常用),Peewee,PonyORM等
表-》python的类
字段(列) >> 类属性
记录(行) >> 类实例
常用的数据库URI格式:
MYSQL: mysql://username:password@host/databasename
SQLite:sqlite:///absolute\\path\\to\\foo
1)、连接数据库:设置地址,配置值
MYSQL: mysql://username:password@host/databasename
SQLite:sqlite:///absolute\\path\\to\\foo
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
2)、定义数据库模型-->也就是写建表语句-->也就是写一个python类
字段类型: Integer String Text Data Time DateTime Interval Float Boolean PickleType LargeBinary
字段参数: primary_key unique index nullable default
执行生成一个表: db.create_all()
3)、数据库操作
C:增
a:写数据,note = Note(body='this is the first note.')
b:提交到db session db.session.add(note)
c:确认 db.session.commit()
R:查
模型类.query.过滤方法.查询方法
查询方法: all first one get(id) count one_or_none first_or_404 get_or_404 paginate with_parent(instance)
Note.query.all()
过滤方法:可叠加使用,filter filter_by order_by limit(limit) group_by offset
Note.query.filter(Note.body == 'hello').first()
在filter()方法中,可以用 == != like in not in and or 等
filter_by可以直接使用字段名称
U:改
直接赋值给模型类的字段属性,然后调用commit就行
D:删
先调用delete,然后调用commit就行
为了避免CSRF攻击,像删除这类修改数据的操作绝对不能通过GET请求实现。正确的做法是为删除操作创建一个表单。
定义关系: 1、 创建外键
2、 定义关系属性
1、一对多:作者和文章 << 优先掌握
在表示author作者类中添加一个关系属性articles,作为集合属性,当我们对特定的author对象调用articles属性会返回所有相关的article对象。
第一步、定义外键 foreign key 多的那一方写外键
第二步、定义关系属性 一的这一方写关系属性,relationship
第三步、建立关系 -- 为外键赋值
author:relationship(表名)
article:foreign_key(表名.字段名)
2、还有其他关系:多对多 多对一 一对一
3、更新数据库表
a)、不在乎表数据的情况下,重新生成表:db.drop_all() db.create_all()
b)、使用Alembic迁移数据库数据,原来的数据留着。
1)、创建迁移环境 flask db init,在项目根目录下自动创建文件夹migrations
2)、生成迁移脚本 flask db migrate -m 'edit note table'。会有一个新文件migrations/versions/c343_fjidefkfsdfds.py。最好检查一下正确性
3)、更新数据库 flask db upgrade
总结:实践出真知!写出博客增删改查,以检验上述理论知识。