zoukankan      html  css  js  c++  java
  • flask连接数据库、反向数据表以及项目文件组织结构

    一、背景

    利用flask+mysql+mongodb开发一个网站,对文件结构以及将已存在的数据表用SQLALchemy转成操作对象,并对flask文件结构进行组织。

    二、文件组织架构

    我按照MVC的模式设计我的文件结构,flask和Django属于MVT的结构,这里T用前后端分离的方式来实现,所以文件的结构模型如下图。

    2.1 文件结构模型

    2.2 文件结构

    三、连接数据库

    按照相应的驱动包

    # mysql
    pip install sqlalchemy
    # mongo
    pip install Flask-PyMongo

    3.1 写好文件配置

    写好相应的配置,使用sqlalchemy_database_uri进行连接。mongodb或者sqlite也是一样,mongo配置参考文件

    # mysql连接管理
    from flask_sqlalchemy import SQLAlchemy
    
    # 导入相应的配置
    from webLearn.dbconfig.db_config import *
    
    DIALECT = 'mysql'
    DRIVER = 'pymysql'
    USERNAME = MYSQL_NAME
    PASSWORD = MYSQL_PASSWORD
    HOST = MYSQL_HOST
    PORT = MYSQL_PORT
    DATABASE = MYSQL_DB
    SQLALCHEMY_DATABASE_URI = '{}+{}://{}:{}@{}:{}/{}?charset=utf8'.format(
        DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE
    )
    # 自动提交变动
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    # 追踪对象修改,部署的时候可以设置成False
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    
    # 初始化db,在这里声明防止循环导入
    db = SQLAlchemy()

    3.2 在flask的APP注册

    # 注册mysql的配置并初始化
    # 注册方式有多种方式,使用py文件或者是使用对象或者环境都可以
    app.config.from_pyfile('./dbconfig/mysql_manage.py')
    db.init_app(app)
    
    # 注册mongo的配置并初始化
    app.config.from_pyfile('./dbconfig/mongo_manage.py')
    mongo.init_app(app)

    四、现有数据表转化

    flask使用的是使用orm映射,可以使用现有的数据进行设计,然后使用create_all()进行创建,也可以通过sqlacodegen反向建立数据表,操作入下:

    # 安装指令
    pip install sqlacodegen

    使用命令导出SQLAlchemy,然后就可以对其进行操作,如果不输出文件名就会在控制台打印,注:有中文这样子导出来有乱码。

    # 指令
    # []:参数类型
    # {}:可选参数
    sqlacodegen mysql+pymysql://[连接名]:[密码]@[ip]/[db_name] {{--tables [表名]}>[输出名字].py}

    五、使用路由进行查询

    5.1 引入model

    我们在view中引入model进行数据查询,获取相应的数据。

    # 用户管理页面访问
    import json
    
    from flask import Blueprint, request, jsonify
    # 引入model
    from webLearn.model.user import User
    
    # 蓝图注册
    user = Blueprint("user", __name__)

    5.2 查询方式

    我们可以通过db对象进行查询,也可以使用model生成的管理对象进行查询(Base查询)。

    @user.route('/login', methods=['GET', 'POST'])
    def login_method():
        param = request.json
        userid = param.get("id")
        password = param.get("password")
        result = User.query.filter(User.id == userid, User.password == password).all()
        data = {}
        if result:
            data.update({'code': 200})
            return jsonify(data)
        data.update({"code": -1})
        return jsonify(data)

    5.3 数据优化

    我们查询的结果是一个对象,这个时候就需要涉及对这个对象进行序列化的问题,我们需要在model文件中去设计一个json化的方法。

        def to_json(self):
            """将实例对象转化为json"""
            item = self.__dict__
            # 这个是用于session存储的内容,可以通过print(item)来查看
            if "_sa_instance_state" in item:
                del item["_sa_instance_state"]
            # 涉及时间数据的转化,可能还有优化的地方。
            if 'birthday' in item:
                item['birthday'] = self.birthday.strftime("%Y-%m-%d")
            return item

    六、注意

    6.1 问题

    在引入配置的时候,会出现import错误,这是因为循环引入的原因。我们需要在view中引入model,在app中引入view(蓝图),在model中引入app进行注册,这个时候就会出现循环引入的问题。

    6.2 解决方案

    我们建立一个新文件,用于生成mysql或者其他数据库的连接对象,然后在去引入这个文件。我的做法将数据库对象放入到对应的管理文件中,这样在model,app中都引入这个文件,就不存在循环引用。

    七、参考

    其他人的blog:

    flask-sqlalchemy的使用博客及配置

    flask-model的博客

    flask对象转化

    flaskCRUD操作

    官方文档:

    flask-pymongo官方文档

    flask-sqlchemy官方文档

  • 相关阅读:
    meta标签中的http-equiv属性使用介绍
    MySQL中批量执行SQL语句
    <fmt:formatNumber/>显示不同地区的各种数据格式
    <fmt:setBundle/>标签
    <fmt:bundle/>、<fmt:message/>、<fmt:param/>资源国际化
    <fmt:setTimeZone/>设置时区
    <fmt:timeZone/>显示全球时间
    初识Storm
    storm安装及启动
    HBase API 的使用(一)
  • 原文地址:https://www.cnblogs.com/future-dream/p/14352292.html
Copyright © 2011-2022 走看看