用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog
目录
- 目录
- 前文列表
- 扩展阅读
- 定义数据模型 models
- 创建表
前文列表
用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
扩展阅读
Difference between __str__ and __repr__ in Python
定义数据模型 models
SQLAlchemy 允许我们根据数据库的表结构来创建数据模型, 反之亦可. 所以我们一般无须手动的登录到数据库中使用 SQL 语句来创建表, 我们只需把数据模型定义好了之后, 表结构也就有了.
- 首先要初始化 SQLAlchemy, 在 models.py 中把 app 对象 传入 SQLAlchemy :
vim JmilkFan-s-Blog/models.py
from flask.ext.sqlalchemy import SQLAlchemy
from main import app# INIT the sqlalchemy object
# Will be load the SQLALCHEMY_DATABASE_URL from config.py
# SQLAlchemy 会自动的从 app 对象中的 DevConfig 中加载连接数据库的配置项
db = SQLAlchemy(app)
db 是 class SQLAlchemy 的实例化对象, 包含了 SQLAlchemy 对数据库操作的支持类集.
In [7]: db
Out[7]: <SQLAlchemy engine='mysql+pymysql://root:fanguiju@127.0.0.1:3306/myblog?charset=utf8'>
- 接下来, 我们就可以在 models.py 中定义 models 类了:
class User(db.Model):"""Represents Proected users."""# Set the name for table__tablename__ = 'users'id = db.Column(db.String(45), primary_key=True)username = db.Column(db.String(255))password = db.Column(db.String(255))def __init__(self, username):self.username = usernamedef __repr__(self):"""Define the string format for instance of User."""return "<Model User `{}`>".format(self.username)
这样我们就得到了一个 User models, 该模型是基于 users 表的. 该数据表拥有 3 个字段 id/username/password 对应这由 class db.Column 实例化出来的 3 个对象, 当 class User 继承自 db.Model 时, SQLAlchemy 与 数据库的连接通过就已经自动的 Ready 了.
db.Column: 其构造器的第一个参数是可选的, 如果传入实参时, 表示创建的字段名. 反之, 则默认使用该实例化对象的名字(即 User 的类属性名); 第二个参数指定了字段的数据类型.
__init__(): 其实我们可以省略定义 class User 的构造器. 这样的话 SQLAlchemy 会自动帮我们创建构造器, 并且所有定义的字段名将会成为此构造器的关键字参数名. EXAMPLE:
def __init__(self, id, username, password):
- __repr__(): 该方法返回一个对象的 字符串表达式. 与 __str__() 不同, 前者返回的是字符串表达式, 能被 eval() 处理;后者返回的是字符串, 不能被 eval() 处理得到原来的对象, 但与 print 语句结合使用时, 会被默认调用. 与 repr() 类似, 将对象转化为便于供 Python 解释器读取的形式, 返回一个可以用来表示对象的可打印字符串.
In [15]:user = User('JMilkfan')In [16]:user
<Model User `JMilkfan`>
# 直接调用对象实际上是隐式的调用了 User.__repr__(user)
# __repr__() 其定义了类实例化对象的可打印字符串表达式
创建表
- 在创建表之间需要先创建数据库
mysql -uroot -pfanguiju -e "CREATE DATABASE myblog default charset utf8 COLLATE utf8_general_ci;"
mysql -uroot -pfanguiju -e "GRANT ALL ON myblog.* TO 'user'@'127.0.0.1' IDENTIFIED BY 'fanguiju';"
mysql -uroot -pfanguiju -e "GRANT ALL ON myblog.* TO 'user'@'localhost' IDENTIFIED BY 'fanguiju';"
mysql -uroot -pfanguiju -e "GRANT ALL ON myblog.* TO 'user'@'%' IDENTIFIED BY 'fanguiju';"
指定数据库 myblog 的字符集为 utf8.
- 然后, 我们仍然可以通过 manage.py 来添加创建数据库表的指令:
# import Flask Script object
from flask.ext.script import Manager, Server
import main
import models# Init manager object via app object
manager = Manager(main.app)# Create some new commands
manager.add_command("server", Server())@manager.shell
def make_shell_context():"""Create a python CLI.return: Default import objecttype: `Dict`"""return dict(app=main.app,db=models.db,User=models.User)if __name__ == '__main__':manager.run()
NOTE: 从现在开始我们每在 models.py 中新定义一个数据模型, 都需要在 manager.py 中导入并添加到返回 dict 中.
这样我们就可以通过 manager 的 shell 指令行来进行数据库表的创建了:
(blog)fanguiju@fanguiju:/opt/JmilkFan-s-Blog$ python manage.py shell
>>> db.create_all()
注意: 如果在进入 manager shell 时触发 ERROR 没有 flask.ext 这个模块的话, 应该检查 virtualenv 的环境是否正确, 是否有安装所需要的依赖包, 如果没有则执行:
pip install -r requirements.txt
- 最后, 登录数据库验证数据表表是否由正确创建
mysql> show tables;
+------------------+
| Tables_in_myblog |
+------------------+
| users |
+------------------+
1 row in set (0.00 sec)mysql> desc users;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | varchar(45) | NO | PRI | NULL | |
| username | varchar(255) | YES | | NULL | |
| password | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
以同样的方法我们可以创建所和需要的所有数据库表.
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表相关推荐
- 用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 WTForms WTF 的基础使用 常用的字段类型 fields.Da ...
- 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 前言 Models 模型 SQLAlchemy 安装 SQL ...
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...
- 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts ...
- 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...
- 用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 应用请求中的参数实现 API 分页 测试 前文列表 用 Flask 来 ...
- 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...
- 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 ...
- 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-A ...
最新文章
- linux 编写系统服务,Linux shell编写系统服务脚本
- java基础面试题:抽象类中是否可以有静态的main方法?
- 异步编程的 async/await
- 【大牛系列教学】靠着这份面试题跟答案
- ES6规格之数组的空位
- 20165208 课下作业
- c语言和python的堆栈,python - 在C ++中更快地执行两个程序的可能解释(与Python比较)? - 堆栈内存溢出...
- MATLAB App Designer 制作一个简易计算器的课堂作业
- WSO2流处理器相关学习(1)快速入门指南【转】
- python实现投票问题。
- 宝利德余海军浙商封面 :新数智时代的修行者
- 创业,I have a dream
- 关于carsim2016破解问题
- 深入浅出 “三门问题”
- HTML a 标签 (修改样式,链接邮箱Email地址)
- python镜像站点
- + 实例演练ASP+XML编程(二)
- 首款Nordic蓝牙5.1室内定位SoC芯片nRF52811
- Linux备份与恢复
- 网易云音乐API分析
热门文章
- php面向对象 设计模式,PHP面向对象单态设计模式详解
- 脑电分析系列[MNE-Python-19]| 可视化Evoked数据
- Gameplay 框架
- 苹果的新Siri:不男,也不女
- LSTM之父再称ResNet、GAN等五大网络都有他的功劳,网友却说:自负大于引用数
- Windows 11正式版将于10月5日推出,说好的支持安卓App没上车
- 好爽!我在上海被机器人“马杀鸡”了
- 阿里AI大牛聂再清重返清华,加入张亚勤AIR战队,说“阿里很支持为国家培养人才”...
- 中国农业科技领域最大一笔融资来了:极飞科技拿下12亿投资,百度&软银领投...
- 寒武纪抢答2020:一季度同比亏损扩大377%,86%营收大约在下半年