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()提交改动,完成删除操作。

 

posted @ 2020-08-30 23:05  smilepassed  阅读(204)  评论(0)    收藏  举报