《Flask_Web开发》读书笔记-第五章

第五章 数据库

        序:数据库按照一定的规则保存数据,程序发起查询取回所需的数据。Web程序最常用的基于关系模型的数据库,他们使用结构化查询语言。这种数据库也成为SQL数据库。

建议学习本章时一并学习SQL或MySQL,配置flask数据库插件Flask_SQLAlchemy。

5.1 使用Flask_SQLAlchemy管理数据库

        SQLAlchemy实际上是对数据库的抽象,让开发者不用直接和SQL语句打交道,而是通过python对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。

        SQLAlchemy是一个关系型数据框架,它提供了高层的ORM和底层的原生数据库操作,flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展。

        要完成Flask对sql的操作,电脑中需要配置:

  1. sqlalchemy→pip3 install SQLAlchemy
  2. mysqldb→pip install mysql-python
  3. 对于python3以及以上版本用户,还需要安装一个插件:pymysql→http://www.lfd.uci.edu/~gohlke/pythonlibs/
  4. mysql→https://dev.mysql.com/downloads/windows/  对于此项目,只需要安装mysql的服务器就可。
  5. 对于win10系统,最好把系统更新至Microsoft Visual C++ 14.0,否则插件将会报错。

         在Flask-SQLAlchemy中,数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象的SQLALCHEMY_DATABASE_URI键中。

app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:password@127.0.0.1/filename'

        db对象是SQLAlchemy类的实例,表示程序使用的数据库。在开始项目之前,需在mysql终端创建一个新数据库,命名为flask_sql_xx

配置数据库与flask的连接,并创建db实例:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
#py3用户引入
import pymysql
pymysql.install_as_MySQLdb()

app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:xxxxxx@127.0.0.1/flask_sql_xx'
#跟踪数据库的修改→不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False

#创建数据库实例
db=SQLAlchemy(app)

?常用的sqlalchemy字段类型表

类型名python中类型说明
Integerint普通整数,32位
SmallIntegerint取值范围小的整数,一般是16位
BigIntegerint/long不限制精度的整数
Floatfloat浮点数
Numericdecimal,Decimal普通整数
Stringstr变长的字符串
Textstr变长的字符串,对较长或不限制长度的字符串做了优化
Unicodeunicode变长unicode字符串
UnicodeTextunicode变长unicode字符串,对较长或不限制长度的字符串做了优化
Booleanbool布尔值
Datedatetime.date时间
Timedatetime.datetime日期和时间
LargeBinarystr二进制文件

5.2 定义模型

5.2.1 数据库的基本操作

一.增删改

        1.基本概念

                ①.在Flask——SQLAlchemy中,插入,修改,删除操作,均由数据库会话管理,会话用db.session表现。在准备把数据写入数据库前,要先将数据添加到会话中,然后调用commit()方法提交会话。

                ②.在Flask_SQLAlchemy中,查询操作是通过query对象操作数据,最基本的查询是返回列表中的所有数据,可以通过过滤器进行更精确的数据库查询。

例如:

db.session.add(role)添加到数据库的session中
db.session.add_all([user1,user2])添加多个信息到session中
db.session.commit()提交数据库的修改
db.session.roleback()数据库的回滚操作
db.session.delete(user)删除数据库

之后需要跟上commit()提交改变。

二.模型之间的关联

1.一对多

class Role(db.Modle):
    '''
    关键代码
    '''
    user = db.relationship('User',backref='role')
    
class User(db.Modle):
    '''
    关键代码
    '''
    role_id = db.Column(db.Integer,db.foreignKey('roles.id'))

        其中的relationship描述了Role和User的关系,在上例中,relationship()中第一个类参数代表对应参照的类User,第二个参数backref为类User申明新属性的方法。类Role与User代表了表Role与表User。

⭐下面画两张表:

Role表

role_id 主键role_name  唯一users
1管理员张三,李四
2普通用户赵五

User表

user_iduser_namerole_idrole
1张三1管理员
2李四1管理员
3赵五2普通用户

注:两表中紫色列为辅助列,不会出现在表格中

        所谓的一对多关系,即表Role对User,一个角色可以对应多个用户。程序的查询过程是,需要先查询出role_id,根据role_id去另一张表中查询,这里需要用到relationship()函数,即user=db.relationship('User',backref='role')

完整程序为:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql

pymysql.install_as_MySQLdb()

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:xxxxxx@127.0.0.1/flask_sql_xx'
# 跟踪数据库的修改→不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)


class Role(db.Modle):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('User', backref='role')

    def __repr__(self):
        return '<Role:%s>' % (self.name, self.id)


class User(db.Modle):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    email = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))


@app.route('/sqlx')
def index():
    return 'Hello World!'


if __name__ == '__main__':
    db.drop_all()
    db.create_all()
    app.run(debug=True)

以上定义表完成。

5.2.2 数据库的查询

        Flask_SQLAlchemy为每个模型类都提供了query对象,最基本的模型查询是取回对应表中的所有记录,例如Role.query.all()命令。

以下为常用的SQLAlchemy查询过滤器

过滤器说明
filter()把过滤器添加到原查询上,返回一个新查询
filter_by()把等值过滤器添加到原查询上,返回一个新查询
limit()使用指定的值限制原查询返回的结果数量,返回一个新查询
offset()偏移原查询返回的结果,返回一个新的查询
order_by()根据指定条件对原查询结果进行排序,返回一个新查询
group_by()根据指定条件对原查询结果进行分组,返回一个新查询

以下为查询执行函数

执行函数说明
all()以列表的形式返回查询的所有结果
first()返回查询到的第一个结果,若无结果,返回None
first_or_404()返回查询到的第一个结果,若无结果,则终止请求并返回404
get()返回指定主键对应的行,若没有,则返回None
get_or_404()

返回指定主键对应的行,若没有,则终止请求并返回404

count()返回查询结果的数量
paginate()返回一个paginate对象,它包含指定范围内的结果

查询的具体操作在综合案例中演示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值