zoukankan      html  css  js  c++  java
  • 用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog

    目录

    前文列表

    用 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)

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

  • 相关阅读:
    OpenCascade Ray Tracing Rendering
    Create New Commands in Tcl
    OpenCascade Modeling Algorithms Fillets and Chamfers
    OpenCascade Modeling Algorithms Boolean Operations
    Construction of Primitives in Open Cascade
    Open Cascade Data Exchange STL
    Tcl Tk Introduction
    Open Cascade DataExchange IGES
    Netgen mesh library : nglib
    Hello Netgen
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/10589876.html
Copyright © 2011-2022 走看看