博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
阅读量:6389 次
发布时间:2019-06-23

本文共 3712 字,大约阅读时间需要 12 分钟。

目录

前文列表

扩展阅读

定义数据模型 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]: dbOut[7]: 
  • 接下来, 我们就可以在 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 "
".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
# 直接调用对象实际上是隐式的调用了 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 objectfrom flask.ext.script import Manager, Serverimport mainimport models# Init manager object via app objectmanager = Manager(main.app)# Create some new commandsmanager.add_command("server", Server())@manager.shelldef 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)

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

转载地址:http://ddcha.baihongyu.com/

你可能感兴趣的文章
常用 tcpdump 抓包方式
查看>>
Geek's Collection(幂运算)
查看>>
easy bootstrap模板
查看>>
Hdu 4734-F(x) 数位dp
查看>>
DRUID连接池的实用 配置详解
查看>>
html&css精华总结
查看>>
ImportError: No module named tornado.ioloop 记录过程
查看>>
[转] SSH 密钥认证机制
查看>>
hihocoder [Offer收割]编程练习赛14 小Hi和小Ho的礼物
查看>>
JQuery EasyUI 动态改变表单项的验证守则
查看>>
Jmeter如何操作数据库
查看>>
iOS开发设置View某个角为圆角
查看>>
【python】python path,macports,easy-install,numpy,scipy,ipython,matplotlib,集成工具...
查看>>
学习进度总结
查看>>
ACCESS模糊查询出现"内存溢出"原因是日文片假名
查看>>
Error setting expression 'XXX' with value 设置表达式“XXX”时出错 解决方法
查看>>
javascript获取url参数和script标签中获取url参数
查看>>
CF359D:Pair of Numbers(数论)
查看>>
进制转换展示
查看>>
张泉灵:做投资这半年哭过的时间比前十年都多
查看>>