Flask入门之SQLAlchemy数据库连接操作(第15讲)

时间:2021-05-12 00:18:51

一、库安装

Flask-SQLAlchemy    2
SQLAlchemy 1.0.8

二、进入venv

三、切换到项目Sample\ 文件夹,进入manager.py 的shell

python manager.py shell

四、创建data.sqlite数据库

from app import db
from app import models
db.create_all()

  执行完最后一条命令后,在Sample\app下就会生成一个data.sqlite文件

五、在Pycharm中导入数据库,方便可视化

  Data Source -> Sqlite(Xerial)

  Flask入门之SQLAlchemy数据库连接操作(第15讲)

  然后进行如下操作

  Flask入门之SQLAlchemy数据库连接操作(第15讲)

  点击OK后,会发现已经导入成功了

  Flask入门之SQLAlchemy数据库连接操作(第15讲)

六、在shell模式下操作数据

  1. 增(写入数据)

>>> from app import db
>>> from app import models
>>> from app.models import User,Role
>>> admins = Role(name='administrators')
>>> mod = Role(name='moderator')
>>> db.session.add(admins)
>>> db.session.add(mod)
>>> db.session.commit() #或者两条一起添加
#db.session.add([admins,mod])

  注意,对数据库增删改查,都必须进行commit()方法才能写入数据库。

  现在来查看下,到底有没有写入?双击roles表,看到了我们写入的两行记录

Flask入门之SQLAlchemy数据库连接操作(第15讲)

  2. 删(删除数据)

# 说明一下:表的每行记录都是一个对象
# 例如上面:admins和mod都是对象,name是其属性 >>> admins.name
u'administrators' # 为什么说明这点,因为删除行就是删除对象 >>> db.session.delete(admins)
>>> db.session.commit() # 删除成功

  3.改(修改数据)  

# 通过对属性重新赋值,添加,提交事务进行修改数据

mod.name='moderators-new'
db.session.add(mod)
db.session.commit()

  4. 查(查询数据)

# query返回的是包含所有记录的查询对象(BaseQuery)
>>> Role.query
<flask_sqlalchemy.BaseQuery object at 0x0000000004936E10> # query之后如果需要对记录进行条件筛选,要加上过滤函数,返回过滤后的查询对象(BaseQuery),可以多次执行过滤函数
>>> Role.query.filter_by(name='admins')
<flask_sqlalchemy.BaseQuery object at 0x0000000004A2C438> # 过滤函数之后,加执行函数,返回是记录对象(如果是多行怎么办),赋值为一个对象名Admin
>>> Role.query.filter_by(name='administrators').first()
<app.models.Role object at 0x0000000004A13F98> #Admin对象的属性,就相当于单元格的值
>>> Admin = Role.query.filter_by(name='administrators').first()
>>> Admin.name
u'administrators'

  5. 表之间的关联

还记得我们之前定义models.py中的Role和User类时,那个relationship吗,关键是参数backref

先来看看我们Role表中的对象admins,name=administrator,id为3

Flask入门之SQLAlchemy数据库连接操作(第15讲)

我们知道这个Role表中的id和User表中的role_id(外键)是对应连接的。

那我们在往User表写入数据的时候,还要写入对应的role_id,有个一步到位的方法,就是把Role行的对象作为参数传给定义类时backref的值(这里是role)

他就会自动获取id,并传给role_id

Flask入门之SQLAlchemy数据库连接操作(第15讲)

  执行代码

>>> Bikmin = User(name='Bikmin',roles=admins)
>>> db.session.add(Bikmin)
>>> db.session.commit()

  看看效果,role_id为3,对应上了

Flask入门之SQLAlchemy数据库连接操作(第15讲)

  这里说一下,query()和get()的区别

1. query() 返回所有记录的查询对象

2. get() 使用的主键查询

  示例

>>> Role.query.get(2).name
u'moderator'

返回的是moderator,和id一样

Flask入门之SQLAlchemy数据库连接操作(第15讲)

  要讲SQLAlchemy查询语句转成原生的SQL语句,只需用str()即可

str(Role.query.filter_by(name='administrators').all())

  

  如果在第一次使用shell会话的时候,创建了行的Python对象,那么再关闭Shell后,再打开,这些对象不能再使用,必须重新创建

admins = Role.query.filter_by(name='administrators').first()

参考文章:选择(Select),插入(Insert), 删除(Delete)

Flask入门之SQLAlchemy数据库连接操作(第15讲)

Flask入门之SQLAlchemy数据库连接操作(第15讲)