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

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图
  • 创建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
  • 没有报错就创建好了

进阶

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

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

  • 如图大部分的外键都是,一个表的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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

SQL注入的常规思路及奇葩技巧

最近在看《SQL注入攻击与防御》这本书,看了之后感觉自己之前的视野和格局还是太小了些。SQLi的应用特别广泛,多种web数据库不说,移动安卓端也存在通用的SQL...

1350
来自专栏运维技术迷

连仕彤博客[Python笔记] Python 一次性替换多个字符

在一个字符串中,一次性替换多个字符串,可以使用字符串的replace函数来处理(目前我想到的是这个方法,大神请指教!) 要求 把INSERT语句中的riqi、b...

3595
来自专栏Python研发

pymysql

pymsql是python中操作的MYsql的模块,其使用方法和MySQLdb几乎相同

3674
来自专栏coder修行路

Go基础之--操作Mysql(二)

在上一篇文章中主要整理了Golang连接mysql以及一些基本的操作,并进行了大概介绍,这篇文章对增删查改进行详细的整理 读取数据 在上一篇文章中整理查询数据...

5746
来自专栏北京马哥教育

10分钟学会理解和解决MySQL乱码问题

本文将详细介绍MySQL乱码的成因和具体的解决方案。在阅读本文之前,强烈建议对字符集编码概念还比较模糊的同学 阅读下博主之前对相关概念的一篇科普:十分钟搞清字符...

3018
来自专栏IT探索

hive使用笔记

json_tuple(json_object,'key1','key2','keyN')

1962
来自专栏李智的专栏

Mysql进阶

1) 内连接 select a.*,b.* from a inner join b on a.id=b.parent_i...

751
来自专栏崔庆才的专栏

Python操作MySQL存储,这些你都会了吗?

4135
来自专栏Java帮帮-微信公众号-技术文章全总结

Oracle应用实战八(完结)——存储过程、函数+对象曹组

游标 在写java程序中有结果集的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。 游标可以理解为是PL/S...

3546
来自专栏乐沙弥的世界

MongoDB 多键索引

更多参考 MongoDB 单键(列)索引 MongoDB 复合索引 MongoDB执行计划获取(db.collection.explain()) ...

1513

扫码关注云+社区

领取腾讯云代金券