数据库的学习笔记

来源:互联网 发布:淘宝宝贝图片宽度 编辑:程序博客网 时间:2024/06/07 01:14

数据库的学习笔记

web程序最常用基于关系行的数据库(SQL数据库),因为使用的是结构话语言,数据库还有其他类型,文档数据库、键值对数据库最近也比较流行(NoSQL数据库)。

1. 关系型数据库把数据存储在表中,用表来模拟程序中不同的实体。

2. SQL数据库很大程度避免了重复,NoSQL数据库可提升查询的速度(对于大型程序来说)。

3 . 数据库的安装,这里是Flask-SQLAlchemy。

pip install flask-sqlalchemy

4. Flask-SQLAlchemy要求每个模型都要定义主键,并经常命名成id。

5. 创建表

python file.py shell>>> from file import db>>> db.create_all

6. 插入行

>>> from file import Role, User>>> admin_role = Role(name='Admin')>>> mod_role = Role(name='Moderator')>>> user_role = Role(name='User')>>> user_john = User(username='john', role=admin_role)>>> user_susan = User(username='susan', role=user_role)>>> user_david = User(username='david', role=user_role)创建了一些角色和用户,未写入数据库。>>> db.session.add(admin_role)>>> db.session.add(mod_role)>>> db.session.add(user_role)>>> db.session.add(user_john)>>> db.session.add(user_susan)>>> db.session.add(user_david)准备把对象写入数据库之前,先将其添加到会话中,也可以换种写法:>>> db.session.add_all([admin_role, mod_role, user_role, user_john, user_susan, user_david])下面调用commit()方法提交会话>>> db.session.commit()可以检验是否将数据写入数据库>>> print(admin_role.id)>>> print(mod_role.id)>>> print(user_role.id)

7. 修改行

>>> admin_role.name = 'Administrator'>>> db.session.add(admin_role)>>> db.session.commit()

8. 删除行

>>> db.session.delete(mod_role)>>> db.session.commit()

9. 查询行

>>> Role.query.all()[<Role u'Administrator'>,<Role u'User'>]>>> User.query.all()[<User u'john', <User u 'susan'>, <User u'david'>]下面是查找角色未'User'的所有用户:>>> User.query.filter_by(role=user_role).all()[<User u'susan'>, <User u'david'>]

10. 常用的SQLAlchemy查询过滤器:


过滤器 | 说明
filter() | 把过滤器添加到原查询上,返回一个新查询
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询
limit() | 使用制定的值限制原查询返回值的数量,返回一个新查询
offset() | 偏移原查询返回的结果,返回一个新查询
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询
group_by() | 根据指定条件对原查询结果进行分析分组,返回一个新查询

11. 最常使用的SQLAlchemy查询执行函数


方法 | 说明
all() | 以列表形式返回查询的所有结果
first() | 返回查询的第一个结果,如果没有结果,则返回None
first_or_404() | 返回查询的第一个结果,如果没有结果,则终止请求,返回404错误响应
get() | 返回指定主键对应的行,如果没有对应的行,则返回None
get_or_404() | 返回指定主键对应的行,如果没有找到指定的主键,则终止请求,返回404错误响应
count() | 返回查询结果的数量
paginate() | 返回一个Paginate对象,它包含指定范围内的结果

12. 每次启动shell会话都要导入数据库实例和模型,为了避免这一个繁琐工作,可以为shell注册一个make_context回调函数:

from flask.ext.script import Shelldef make_shell_context():    return dict(app=app,db=db,User=User, Role=Role)manger.add_command("shell", Shell(make_context=make_shell_context))我们可以自己试一下:python file.py shell>>> app<Flask 'app'>>>> db<SQLAlchemy engine='sqlite:////home/flask/flasky/data.sqlite'>>>> User<class 'app.User'>

13. 创建迁移仓库,以便进行数据库更新。

 首先要安装Flask_Migrate:
pip install flask-migrate
然后要初始化这个扩展:
from flask.ext.migrate import Migrate, MigrateCommand#.....migrate = Migrate(app, db)manager.add_command('db', MigrateCommand)

初始化完成后,在维护数据库迁移之前,要使用init子命令创建迁移仓库:

python hello.py db init
会看到创建了一个文件夹,其中存放这迁移脚本。

14. 自动创建的迁移库不一定总是正确的,自动生成迁移库时要检查,也可以用migrate子命令来自动创建迁移脚本:

python file.py db migrate -m "initial migration"

15. 检查修正好迁移脚本后,要把迁移库应用到数据库中:

python file.py db upgrade
先写到这,如有问题,请留言!
0 0
原创粉丝点击