Python 的 flask:models.py 来创建 mysql 数据库

olei 4,220 views 0

Python 3.6

用到的包

  • flask 下有一个叫 flask_sqlalchemy 的数据库框架,没有安装的可以使用下面的来安装
$ pip install -i https://pypi.douban.com/simple/ flask-sqlalchemy
  • flask 就不多说了
$ pip install -i https://pypi.douban.com/simple/ flask
  • pymysql
$ pip install -i https://pypi.douban.com/simple/ pymysql

-i 后面跟的是豆瓣源,目的是访问国内的源加快安装速度

基础

你所有模型的基类叫做 db.Model 。它存储在你必须创建的 SQLAlchemy 实例上。

Column 类型

类型名 Python 类型 说明
Integer int 整数
String(size) str 有最大长度的字符串
Text str 长 unicode 文本
Float float 存储浮点值
Boolean bool 存储布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
PickleType 任何 python 对象 存储一个持久化 Python 对象
LargeBinary str 存储任意大的二进制数据

常用字段

选项名 说明 示例
primary_key 设置主键 primary_key=True
unique 是否唯一 unique=True
index 是否创建索引 index=True
nullable 是否允许为空 nullable=True
default 设置默认值 default=datetime.datetime.utcnow

连接 URI 格式

dialect+driver://username:password@host:port/database
  • Mysql mysql://scott:tiger@localhost/mydatabase
  • Postgres postgresql://scott:tiger@localhost/mydatabase
  • SQLite sqlite:////absolute/path/to/foo.db

创建数据库逻辑

  • 一个博客的很简单数据库的 ER 图

Python的flask:models.py来创建mysql数据库

  • 创建 models.py 文件,代码逻辑如下
# -*- coding: utf-8 -*-
# @Time    : 2018/2/4 14:46
# @Author  : Wugang Li
# @Email   : i@olei.me
# @File    : models.py
# @Software: PyCharm

from flask import Flask
import pymysql
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:root@localhost:3306/artcms_pro"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True

db = SQLAlchemy(app)

"""
用户表:
0. 编号
1. 账号
2. 密码
3. 注册的时间
"""


class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(20), nullable=False)
    pwd = db.Column(db.String(100), nullable=False)
    addtime = db.Column(db.DateTime, nullable=False)

    def __repr__(self):
        return "<User %r>" % self.name


"""
文章表
1. 编号
2. 标题
3. 分类
4. 作者
5. 封面
6. 内容
7. 发布时间
"""


class Art(db.Model):
    __tablename__ = "art"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    cate = db.Column(db.Integer, nullable=False)
    user_id = db.Column(db.Integer, nullable=False)
    logo = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    addtime = db.Column(db.DateTime, nullable=False)

    def __repr__(self):
        return "<User %r>" % self.title


if __name__ == "__main__":
    db.create_all()
  • 一个表一个类,继承 SQLAlchemy 的 Model 类
  • app.config 的两个,一个是连接数据库的,跟平常的 SQLAlchemy 表示的一样,一个是是否可以跟踪修改,一般是 True
  • __tablename__来作为表的名称
  • db.Column 来创建表头,db 中有很多类型,比如 String、Integer、Text、Datetime 等
  • primary_key 来设置主键
  • nullable 表示是否可以为空
  • 要有一个__repr__函数,来返回呈现一个值
  • db.create_all() 表示创建所有的表
  • 运行创建
$ python models.py
  • 没有报错就创建好了

Python的flask:models.py来创建mysql数据库

进阶

有很多的表,各个一些表之间有外键相关联的情况

  • 如图,相对很复杂的 ER 图

Python的flask:models.py来创建mysql数据库

  • 如图大部分的外键都是,一个表的 id 对于另外一个表的相对应的 id
  • 代码如下
# -*- coding: utf-8 -*-
# @Time    : 2018/5/16 14:59
# @Author  : Wugang Li
# @Email   : i@olei.me
# @File    : models.py
# @Software: PyCharm
# 存放数据模型

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from _datetime import datetime
import pymysql

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:root@127.0.0.1:3306/movie"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True

db = SQLAlchemy(app)


# 会员数据模型
class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 昵称
    pwd = db.Column(db.String(100))  # 密码
    email = db.Column(db.String(100), unique=True)  # 邮箱
    phone = db.Column(db.String(100), unique=True)  # 手机号
    info = db.Column(db.Text)  # 个性简介
    face = db.Column(db.String(255), unique=True)  # 头像
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 注册时间
    uuid = db.Column(db.String(255), unique=True)  # 唯一标志符
    userlogs = db.relationship('Userlog', backref='user')  # 会员日志外键关系关联
    comments = db.relationship('Comment', backref='user')  # 评论外键关系关联
    moviecols = db.relationship('Moviecol', backref='user')  # 电影收藏外键关系关联

    def __repr__(self):
        return "<User %r>" % self.name


# 会员登录日志
class Userlog(db.Model):
    __tablename__ = "userlog"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 所属会员
    ip = db.Column(db.String(100))  # 登录 IP
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 登录时间

    def __repr__(self):
        return "<Userlog %r>" % self.id


# 标签
class Tag(db.Model):
    __tablename__ = "tag"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 标题
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间
    movies = db.relationship('Movie', backref='tag')  # 电影外键关系关联

    def __repr__(self):
        return "<Tag %r>" % self.name


# 电影
class Movie(db.Model):
    __tablename__ = "movie"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    title = db.Column(db.String(255), unique=True)  # 电影标题
    url = db.Column(db.String(255), unique=True)  # 电影播放的 url
    info = db.Column(db.Text)  # 电影简介
    logo = db.Column(db.String(255), unique=True)  # 电影的 logo
    star = db.Column(db.SmallInteger)  # 电影的星级
    playnum = db.Column(db.BigInteger)  # 电影播放量
    commentnum = db.Column(db.BigInteger)  # 电影的评论量
    tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'))  # 电影所属标签 id
    area = db.Column(db.String(255))  # 上映地区
    release_time = db.Column(db.Date)  # 上映时间
    length = db.Column(db.String(100))  # 播放时间
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间
    comments = db.relationship('Comment', backref='movie')  # 评论外键关系关联
    moviecols = db.relationship('Moviecol', backref='movie')  # 电影收藏外键关系关联

    def __repr__(self):
        return "<Movie %r>" % self.title


# 上映预告
class Preview(db.Model):
    __tablename__ = "preview"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    title = db.Column(db.String(255), unique=True)  # 电影标题
    logo = db.Column(db.String(255), unique=True)  # 电影的 logo
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
        return "<Preview %r>" % self.title


# 评论
class Comment(db.Model):
    __tablename__ = "comment"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    content = db.Column(db.Text)  # 评论内容
    movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))  # 电影所属 ID
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 用户所属 id
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
        return "<Comment %r>" % self.id


# 电影收藏
class Moviecol(db.Model):
    __tablename__ = "moviecol"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))  # 电影所属 ID
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 用户所属 id
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
        return "<Moviecol %r>" % self.id


# 权限
class Auth(db.Model):
    __tablename__ = "auth"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 权限名称
    url = db.Column(db.String(255), unique=True)  # 权限的地址
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
        return "<Auth %r>" % self.name


# 角色
class Role(db.Model):
    __tablename__ = "role"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 角色名称
    auths = db.Column(db.String(600))  # 权限列表
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间
    admins = db.relationship('Admin', backref='role')  # 角色外键关系关联

    def __repr__(self):
        return "<Role %r>" % self.name


# 管理员
class Admin(db.Model):
    __tablename__ = "admin"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 管理员名称
    pwd = db.Column(db.String(100), unique=True)  # 密码
    is_super = db.Column(db.SmallInteger)  # 是否是超级管理员,0 为超级管理员
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'))  # 角色 ID
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间
    adminlogs = db.relationship('Adminlog', backref='admin')  # 管理员登录日志外键关系关联
    oplogs = db.relationship('Oplog', backref='admin')  # 管理员操作日志外键关系关联

    def __repr__(self):
        return "<Admin %r>" % self.name


# 管理员登录日志
class Adminlog(db.Model):
    __tablename__ = "adminlog"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))  # 管理员所属 ID
    ip = db.Column(db.String(100))  # 登录 IP
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
        return "<Adminlog %r>" % self.id


# 操作日志
class Oplog(db.Model):
    __tablename__ = "oplog"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))  # 管理员所属 ID
    ip = db.Column(db.String(100))  # 操作 ip
    reason = db.Column(db.String(600))  # 操作原因
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
        return "<Oplog %r>" % self.id


if __name__ == "__main__":
    db.create_all()
  • 通过 db.relationship()来建立与其他表的联系,上面代码可以看出,比如 user 表与 userlog 表 (第一个与第二个类),user 表中的 userlogs 表头是要 userlog 这个表建立联系,那么第一个参数就是对应的类的名称,backref 后面跟的是本表的名字
  • 接下来就是 userlog 表的类 Userlog 中的 user_id 的外键是 user 表中的 id,外键通过 db.Foreignkey()来建立外键,参数就是对应的表. 表头,比如上面参数的 user.id
  • 运行创建
$ python models.py

没有报错,就会生成如下的库

Python的flask:models.py来创建mysql数据库

上面生成 ER 表、查看数据库结构的软件是 DataGrip

发表评论 取消回复
表情 图片 链接 代码

分享