Python的flask:models.py来创建mysql数据库
时间:2022-05-30
本文章向大家介绍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
- 基层医疗破局关键:从医疗SaaS三大未来趋势说起
- 无数据库权限下载文献攻略大全
- 学 Python 就是为了当程序员?不止一种可能性
- 2018程序员必备碎片化学习工具
- 深入理解php底层:php生命周期
- 网站性能测试指标详解
- 在.NET Core类库中使用EF Core迁移数据库到SQL Server
- 人类的未来:儿童都能驾驶的汽车
- 论循证新闻的方法与意义——一种媒体融合背景下新闻生产方式创新
- 域名资讯:域名jiuhuang.com已搭建成“韭黄答题助手”网站
- Servlet开篇
- 浅谈中国域名的名与利
- 加密货币的火爆,tokens.com域名已50万美元成交
- 家具平台谷居完成2000万元融资,启用长尾双拼域名
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法