专栏文章 测试平台系列 (6) 配置 flask-sqlalchemy

米洛 · 2021年11月28日 · 最后由 cooling 回复于 2022年06月04日 · 2760 次阅读

配置 flask-sqlalchemy

说到flask-sqlalchemy,有些人可能不太清楚是什么东西。简单的说,他就是一个 orm 库,帮助咱们能够更好地跟db打交道的。笔者有一篇文章有略微的介绍,可以速览一遍了解一下(其实主要是笔者才疏学浅,讲不出什么深奥的。

既然是登录,那么肯定需要有持久化的数据。那么我们肯定需要建立用户相关的表。

前置准备

  • 安装 MySQL

根据自己的系统 (Windows/Mac/Linux) 安装好对应的 MySQL 并设置好账号密码,这里就不教育大家怎么安装了。端口号用默认的 3306 即可,并且确保服务要启动成功哦!

  • 安装 mysql-connector-python(mysql 官方驱动)

cmd 窗口执行

pip3 install mysql-connector-python

配置 MySQL 连接信息

  • pity/config.py 配置 mysql 连接信息

MySQL配置

注意: 一定要确保 MySQL 的库存在哦, 没有的话可以用 Navicat 或 Datagrip 新建。

可以看出以上包含了 5 个重点内容,mysql 的地址,端口号,用户名,密码和库名。接下来的 SQLALCHEMY_DATABASE_URI 代表了 sql 的连接信息,flask_sqlalchemy会自动根据这个变量去获取 db 连接等。其中mysql+mysqlconnector,代表的是试用 mysql 连接的方式,大家都知道 Python 连接 mysql 有很多库比如 pymysql,mysqldb 等。这里就是一个说明。

至于后面的警告大家可加可不加,如果被警告得太烦了可以这样解决。

SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(
                                    MYSQL_USER, MYSQL_PWD, MYSQL_HOST, MYSQL_PORT, DBNAME)
  • pity/app/models/__init__.py初始化 db

代码很简单,就是将 app 赋给 SQLAlchemy 从而生成一个 db 对象。

from flask_sqlalchemy import SQLAlchemy

from app import pity

db = SQLAlchemy(pity)

配备用户类

  • 在 models 目录建立用户表

首先咱们这个平台肯定不是那种不需要登录的,因为会做一小部分的权限控制,但是肯定也不会很复杂化。所以我们可以先简略设计一下用户表

既然是 Orm,那么咱们的User 表的体现即是Python中的一个类。

因为目前,还不太了解用户表的具体需要字段。但是我们能大概设计一下这个表,首先需要的字段肯定有用户名,密码,用户 id,邮箱,团队 id,职位等。其他的信息比如 enable(是否可用),create_time(创建时间) 等信息暂时先不考虑了。后续可以随意添加。

那么User 表我的大概设计如下:

大致讲一下吧,大概就创建了以上几个字段。unique 是字段是否唯一 (可重复),primary key 自然就是主键,db.String 对应 varchar,db.INT 对应 int,也就是说。现在我们要操作数据表,只需要对这个 User 类操作就行了,因为 sqlalchemy 会自动映射到对应库 -- 对应表进行操作。

from app.models import db
from datetime import datetime


class User(db.Model):
    id = db.Column(db.INT, primary_key=True)
    username = db.Column(db.String(16), unique=True, index=True)
    name = db.Column(db.String(16), index=True)
    password = db.Column(db.String(32), unique=False)
    email = db.Column(db.String(64), unique=True, nullable=False)
    role = db.Column(db.INT, default=0, comment="0: 普通用户 1: 组长 2: 超级管理员")
    created_at = db.Column(db.DATETIME, nullable=False)
    updated_at = db.Column(db.DATETIME, nullable=False)
    deleted_at = db.Column(db.DATETIME)
    last_login_at = db.Column(db.DATETIME)

    def __init__(self, username, name, password, email):
        self.username = username
        self.password = password
        self.email = email
        self.name = name
        self.created_at = datetime.now()
        self.updated_at = datetime.now()
        self.role = 0

    def __repr__(self):
        return '<User %r>' % self.username

  • 在引入 models 的地方初始化数据表

我们在pity/dao/__init__.py dao 层初始化所有表,以后新增一个表都需要在这儿 import 一次

from app.models import db
from app.models.user import User

db.create_all()
  • 在 run.py 引入 dao 包使得建表语句 db.create_all() 生效

重启服务后可以看到出现了 user 表:

项目地址

后端代码地址: https://github.com/wuranxu/pity

前端代码地址: https://github.com/wuranxu/pityWeb

共收到 4 条回复 时间 点赞
我去催饭 回复

下次自己消灭〇回复!!!

大哥,请教下,
【问题 1】你的表单搜索,用的 flask-sqlacheml 的动态 sql【first()?all()】
【问题】flask-sqlachaml 的 qurey.filter() 返回的是一个 model.id,你怎么快速获取表字段?


请问可以这样做?(下图)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册