介绍几种常用的数据库操作,操练直接在Python Shell中进行。
1、创建表
(venv)$ python hello.py shell
>>> from hello import db
>>> db.create_all()
此时查看程序目录,就会发现新建了一个data.sqlite文件。
需要注意的是,如果数据库表已经存在于数据库中,db.create_all()这个操作不会重新创建或者更新这个表。更新现有数据库表的粗暴方式是先删除旧表再创建新的:(这个在Crossin的教程中也提到过,用的是SQLite 3,以后一个会学到更好的解决办法)
>>> db.drop_all() #删除旧表
>>> db.create_all() #创建新表
2、插入行
下面这段代码创建了一些角色和用户:
>>> from hello 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)
通过数据库会话(session)管理对数据库所做的改动,在Flask-SQLAlchemy中,会话由db.session表示。准备把对象写入数据库之前,先将其添加到会话中:
>>> db.session.add_all([admin_role, mod_role, user_role, user_john, user_susan, user_david])
为了把对象写入数据库,要调用commit()方法提交会话:
>>> db.session.commit()
这时查看角色的id属性,发现它们已经赋值了:
>>> print admin_role.id
1
>>> print mod_role.id
2
>>> print user_role.id
3
3、修改行
>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit() #提交改动到数据库
直接重写的做法,类似Python字典中的修改某个键值的方法。
4、删除行
用数据库会话中的delete()方法。例如把“Moderator”角色从数据库中删除:
>>> db.session.delete(mod_role)
>>> db.session.commit() #提交改动到数据库
5、查询行
Flask-SQLAlchemy为每个模型类都提供了query对象。(这句话啥意思==!英文是Flask-SQLAlchemy makes a query object available in each model class.)最基本的模型查询是取回对应表中的所有记录:
>>> Role.query.all()
[<Role u'Admin'>, <Role u'Moderator'>, <Role u'User'>]
>>> User.query.all()
[<User u'leon'>, <User u'kitty'>, <User u'bin'>]
试用过滤器可以配置query对象进行更精确的数据库查询,如 查找角色为“User”的所有用户:
>>> User.query.filter_by(role=user_role).all()
[<User u'bin'>]
Tips:
1、若要查看SQLAlchemy为查询生成的原生SQL查询语句,只需要把query对象(貌似就是User.query这家伙)转换成字符串:
>>> str(User.query.filter_by(role=user_role))
'SELECT users.id AS users_id, users.username AS users_username,
users.role_id AS users_role_id \nFROM users \nWHERE :param_1 = users.role_id'
2、常用的SQLAlchemy查询过滤器
3、最常使用的SQLAlchemy查询执行函数
查了一下Paginate对象,没有找到相关的内容,不过发现书后面有介绍分页(Pagination)的内容,就没去深究,后面再学吧。
下一篇中会涉及在视图函数中操作数据库,使用Flask-Migrate实现数据库迁移等内容。