用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 目录目录前文列表扩展阅读定义数据模型 models创建表前文列表用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)V...
+关注继续查看

目录

前文列表

用 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 = username

    def __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 object
    type: `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)

以同样的方法我们可以创建所和需要的所有数据库表.

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
前端开发 API 开发工具
用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和...
2005 1
|
API 开发工具 Python
用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hel...
1374 0
|
API 开发工具 数据库
用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQ...
2003 0
|
Web App开发 API 开发工具
用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式化输出 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask ...
1925 0
|
API 数据格式 网络架构
用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — He...
1640 0
|
Web App开发 安全 开发工具
用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-Admin 的权限安全 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Fl...
2074 0
|
Web App开发 开发工具 Python
用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能
目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)VC_连...
1651 0
|
前端开发 开发工具 Python
用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy
目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 ModelView 实现效果 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World!...
2904 0
|
Web App开发 前端开发 JavaScript
用 Flask 来写个轻博客 (28) — 使用 Flask-Assets 压缩 CSS/JS 提升网页加载速度
目录 目录 前文列表 扩展阅读 Flask-Assets 将 Flask-Assets 应用到项目中 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写...
1430 0
|
缓存 数据库 开发工具
用 Flask 来写个轻博客 (27) — 使用 Flask-Cache 实现网页缓存加速
目录 目录 前文列表 扩展阅读 Flask-Cache 应用 Flask-Cache 实现视图函数缓存 缓存无参数的普通函数 缓存带参数的普通函数 缓存无动态参数的视图函数 缓存带动态参数的视图函数 前文列表 用 Flask 来写个轻博客 (1)...
1549 0