目录
建好数据库模型之后,就需要对模型进行操作了,如何使用SQLAlchemy创建或删除数据库表?如何对创建的数据库表进行增删改查等操作?推荐使用Python shell进行相关联系操作。前置需要的操作:
(flasky) Z:\NewPycharmProjects\study-flasky>set FLASK_APP=hello.py
(flasky) Z:\NewPycharmProjects\study-flasky>flask shell
db.create_all()会寻找所有db.Model的子类进行库表的创建:
>>> from hello import db
>>> db.create_all()
需要注意的是,如果表在库中已经存在,db.create_all()并不会创建或更新响应的表,这种情况下就需要先删除再重新创建了,把数据都销毁了,很不方便:
>>> db.drop_all()
>>> db.create_all()
创建一些角色和用户对象,按顺序执行:
>>> 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)
模型实例的构造函数需要使用关键字参数指定初始值。role属性可以指定成对象实例表示。id主键由数据库自身管理,默认自增主键,当前仅仅是创建了模型实例,还未保存在数据库中。保存代码如下:
>>> 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.commit()
对数据库该种需要进行会话管理,会话由db.session表示,先将需要的操作添加到会话中,再由db.session.commit()进行提交。批量操作可以简写成:
>>> db.session.add_all([admin_role, mod_role, user_role,
... user_john, user_susan, user_david])
验证一下:
>>> print(admin_role.id)
1
>>> print(mod_role.id)
2
>>> print(user_role.id)
3
如果程序中间出错可以使用db.session.rollback()进行回滚。
>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()
>>> db.session.delete(mod_role)
>>> db.session.commit()
常用查询方法:
# 查询表的全部数据
>>> Role.query.all()
[<Role Administrator>, <Role User>]
>>> User.query.all()
[<Role john>, <Role david>, <Role susan>]
# 使用过滤器筛选数据并返回所有过滤后的数据,使用对象过滤
>>> User.query.filter_by(role=user_role).all()
[<Role david>, <Role susan>]
# 原始查询sql
>>> 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 ? = users.role_id'
# 使用值过滤数据,并返回第一个数据,当确认只会返回一行数据时可以用这种方式
>>> user_role = Role.query.filter_by(name='User').first()
>>> user_role
<Role User>
# 关联关系及反向引用操作
>>> users = user_role.users
>>> users
[<User 'susan'>, <User 'david'>]
>>> users[0].role
<Role 'User'>
>>> user_role.users.order_by(User.username).all()
[<User 'david'>, <User 'susan'>]
>>> user_role.users.count()
2
表的所有查询操作都是在query对象上进行操作,query对象还有其它的过滤器:
过滤器 | 说明 |
---|---|
filter() | 把过滤器加到原查询上 |
filter_by() | 等值过滤器、指定特定值 |
limit() | 限制结果数量 |
offset() | 偏移查询结果 |
order_by() | 根据指定条件进行排序 |
group_by() | 根据指定条件进行分组 |
所有的过滤器返回的都是一个新查询,需要更详细的解释,可以参考官方文档。
除了all()、first()查询方法外还有其它查询方法:
方法 | 说明 |
---|---|
all() | 列表形式返回所有结果 |
first() | 返回第一个结果,如果没有,返回None |
first()_or_404() | 返回第一个结果,没有就终止请求,返回404 |
get() | 根据主键返回结果,没有就返回None |
get_or_404() | 根据主键返回结果,没有就终止请求,返回404 |
count() | 结果计数 |
paginate() | 返回一个paginate对象,包含指定范围的结果 |