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
本文作者为 olei,转载请注明。