Flask-SQLAlchemy(四)—— 数据库操作

目录

创建表:

插入数据:

修改数据:

删除数据:

查询数据:


        建好数据库模型之后,就需要对模型进行操作了,如何使用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对象还有其它的过滤器:

SQLAlchemy常用查询过滤器
过滤器说明
filter()把过滤器加到原查询上
filter_by()等值过滤器、指定特定值
limit()限制结果数量
offset()偏移查询结果
order_by()根据指定条件进行排序
group_by()根据指定条件进行分组

        所有的过滤器返回的都是一个新查询,需要更详细的解释,可以参考官方文档。

除了all()、first()查询方法外还有其它查询方法:

SQLAlchemy常用查询执行方法
方法说明
all()列表形式返回所有结果
first()返回第一个结果,如果没有,返回None
first()_or_404()返回第一个结果,没有就终止请求,返回404
get()根据主键返回结果,没有就返回None
get_or_404()根据主键返回结果,没有就终止请求,返回404
count()结果计数
paginate()返回一个paginate对象,包含指定范围的结果

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值