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

西顾博客

用到的包

  • 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 Flaskimport pymysqlfrom 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 Flaskfrom flask_sqlalchemy import SQLAlchemyfrom _datetime import datetimeimport 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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏冰霜之地

深入研究Block捕获外部变量和__block实现原理

Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”。从那开始,Block就出现...

703
来自专栏cs

研究生的一份试题的几道题节选

首先祝朋友考研成功,勇往直前,我是不考研的,所以完全以提高能力,使用为主,不在意细节。小伙伴让我帮忙看了一下试卷,故截取了几道题目。 c我是真的应了那句话,从入...

3378
来自专栏Java成神之路

HQL语句大全

Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它...

975
来自专栏知识分享

C中的预编译宏定义

文章来自 http://www.uml.org.cn/c++/200902104.asp 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. ...

2364
来自专栏GIS讲堂

shape文件的生成与打包下载

632
来自专栏天天

sass语法

854
来自专栏帘卷西风的专栏

关于mysql自增id的获取和重置

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)

832
来自专栏JadePeng的技术博客

使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。本文介绍使用Spring D...

3775
来自专栏Python

Django——model基础

ORM 映射关系:     表名 <-------> 类名 字段 <-------> 属性     表记录 <------->类实例对象...

16810
来自专栏python3

习题10:那是什么?

    I'm tabbed in. I'm split on a line. I'm \ a \ cat. I'll do a list:     * Ca...

421

扫码关注云+社区