Python Web开发之Flask框架(三)
使用Flask-SQLAlchemy创建映射表到数据库
在Flask的web开发中,我们使用Flask-SQLAlchemy来操作数据库跟操作对象一样,非常方便,因为在ORM中,一个表就抽象成一个类,一条数据就抽象成该类的一个对象。
1、首先初始化和设置数据库配置信息
使用flask_sqlalchemy中的SQLAlchemy进行初始化:
from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app)
在config.py文件中设置数据库配置信息
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://用户名:密码@ip:端口号/数据库名' # pymysql为数据库驱动
2、创建模型类,该类会直接映射到数据库中对应的表
class User2(db.Model, UserMixin): # 对应数据库中user2表 id = db.Column(db.Integer, primary_key=True) # id对应表user2中id字段(类型为int,设置为主键) name = db.Column(db.String(20)) # name对应表user2中name字段(类型为string,长度为20) username = db.Column(db.String(20)) # username对应表user2中username字段(类型为string,长度为20) class Movie2(db.Model): # 对应数据库中Movie2表 id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(60)) year = db.Column(db.String(4))
3、设置好模型类后,通过 db.create_all() 来映射创建对应的表
from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app) class User2(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) username = db.Column(db.String(20)) class Movie2(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(60)) year = db.Column(db.String(4)) if __name__ == '__main__': db.create_all()
模型需要继承处db.Model,然后要映射到表中的属性,必须写成db.Column的数据类型。
数据类型
db.Interger:代表的是整形;
db.String代表的是varchar,需要指定最长长度;
db.Text代表的是text;
其他参数:
primary_key:代表的是将这个字段设置为主键;
autoincrement:代表的是这个主键为自增;
nullable:代表的是这个字段是否为空,默认可为空,可以将这个值设置为False,即不能为空;
执行以上代码后,在对应的数据库中就创建了user2,movies2两张表并创建了对应的表结构
使用Flask-SQLAlchemy对表中数据增删改查
1、增
m = Movie2(title=’流浪地球‘, year = ’2019‘) # Movie2为上面创建的模型类,映射了数据库的的movie2表 db.session.add(m) # 通过add来把m保存到session中 db.session.commit() # 通过commit()来把保存在session中的数据提交到数据库
直接对Movie2类进行操作,把对应的字符数据直接赋值给类中的title,year属性,Movie2类直接映射了数据库中movie2表,类中title,year属性直接映射了movie2表中的title,year字段;赋值完成后,通过db.session.add(m)把修改的数据保存到session中,此时未提交时,数据库中movie2中的数据不会映射更改,只有执行db.session.commit(()后才完成对数据库数据映射提交。
2、查
movie = Movie2.query.filter_by(title = 'Leon').all() # SELECT * FROM movie2 WHERE title='Leon'; print(movie) print(movie.title) print(movie.year) 结果: <Movie2 4> Leon 1994
上述代码中print(movie)直接打印出的是实例对象,需要加入对应的属性才能返回对应字段的数据;
通过对模型类query属性调用可选的过滤方法和查询方法,我们就可以获取到对应单个或多个记录,记录是以模型类实例形式表示;查询语句格式如下:
<模型类>.query.<过滤方法(可选)>.<查询方法>
下面是一些常用的过滤方法:
| 过滤方法 | 说明 |
| filter() | 使用指定的规则过滤记录,返回新生产的查询对象 |
| filter_by() | 使用指定规则过滤记录(以关键字表达式的形式),返回新产生的查询对象 |
| order_by() | 根据指定条件对记录进行排序,返回新产生的查询对象 |
| group_by() | 根据指定条件对记录进行分组,返回新产生的查询对象 |
下面是一些常用查询方法:
| 查询方法 | 说明 |
| all() | 返回包含所有查询记录的列表 |
| first() | 返回查询的第一条记录,如果未找到,则返回None |
| get(id) | 传入主键值作为参数,返回指定主键值的记录,如果未找到,由返回None |
| count() | 返回查询结果的数量 |
| first_or_404() | 返回查询的第一条记录,如果未找到,则返回404错误响应 |
| get_or_404(id) | 传入主键值作为参数,返回指定主键值的记录,如果未找到则返回404错误响应 |
| paginate() | 返回一个Pagination对象,可以对记录进行分页处理 |
3、改(更新)
下面操作更新了Movie2模型中主键为3的记录:
movie = Movie2.query.get(3) # 通过查询的方式获取到这个id=3的对象 movie.title = '我要更新这个title’ # 直接对实例属性赋予新的值即可 movie.year = '2020' db.session.commit() # 调用commit来提交更新
更新数据库的数据,首先要通过查询获取到该对象实例,然后通过对对象实例属性直接赋值可完成更新,注意:必须调用commit()提交来完成更新操作
4、删
movie = Movie2.query.get(3) # 同样首先需要获取到需要操作的实例对象 db.session.delete(movie) # 使用delete()方法直接删除 db.session.commit() # 提交改动
删除数据库中数据,同样首先需要获取到要操作的对象实例,通过db.session.delete()来删除,最后调用db.session.commit()提交改动,完成删除操作。

浙公网安备 33010602011771号