Flask-SQLAlchemy在Flask中的应用实战

由于flask相较于django又复杂了一些,主要体现在各种插件不像django那般,安装即用。还需要与flask的WSGI实例(补充说明:app = Flask(__ name __))绑定起来。本文只介绍Flask-SQLAlchemy插件在flask中的使用,到写这篇文章时,笔者还未接触到flask-login等其它插件,但笔者认为原理均相似,各位看官举一反三吧!

安装:

    pip install flask-sqlalchemy

一、数据库表结构(db_all.py):

#
# -*- coding:utf-8 -*-
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class User(db.Model):
      # login info
      id = db.Column(db.Integer, primary_key=True)
      username = db.Column(db.String(80), unique=True)
      password = db.Column(db.String(120))
      is_superuser = db.Column(db.String(3))

      def __init__(self, username, password):
            self.username = username
            self.password = password

      def __repr__(self):
            return '<User %r>' % self.username


class ApplyInfo(db.Model):
    # apply info
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    entry = db.Column(db.Date)
    apply = db.Column(db.Date)
    telephone = db.Column(db.String(15))
    computer_type = db.Column(db.String(10))
    apply_status = db.Column(db.String(5))
    buy_time = db.Column(db.Date, nullable=True)

    def __repr__(self):
        return '<ApplyInfo %r>' % self.name

def init_db():
    db.create_all()

操作数据库的方法(operate_db.py):

#
# -*- coding:utf-8 -*-

from .db_all import db  # 格外注意这里的db对象一定是创建数据库模型的那个db对象否则会造成添加完数据源之后,查询不到的问题

class OperationDB(object):
     """
     必须和表中用同一个db对象,否则增加数据后,查询会有问题:查不到数据
     """
    def __init__(self):
        self.db = db

    def add(self, obj):
        self.db.session.add(obj)
        self.db.session.commit()

    def query_all(self, table_class):
        all_data = table_class.query.all()
        return all_data

    def query_per(self, table_class, k, v):
        k = getattr(table_class, k)
        data = table_class.query.filter(k == v).first()
        return data

    def update(self, table_class, k, v, **kwargs):
        result = self.query_per(table_class, k, v)
        for g, m in kwargs.items():
            setattr(result, g, m)
        self.db.session.commit()

    def delete(self, table_class, k, v):
        result = self.query_per(table_class, k, v)
        self.db.session.delete(result)
        self.db.session.commit()

二、现在有了db对象了,怎么跟我们的flask的WSGI应用程序关联起来呢?
在我们创建app应用实例的时候做如下操作:

 def create_app(config_name):
     app = Flask(__name__)
     CORS(app, supports_credentials=True)  # 解决flask跨域问题,这里不做讨论
     app.config.from_object(config[config_name])  # 从配置文件读取自定义配置

    # 以下为flask-sqlachemy与flask应用实例app绑定在一起的必须配置项
    app.config['SQLALCHEMY_DATABASE_URI'] = gconfig.DB_LINK
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

    config[config_name].init_app(app)

    db.init_app(app)    # 将上述配置项初始化到flask-sqlachemy配置中并进行相关初始化
    db.app = app           # 假如在db = SQLAlchemy(app)时,未传递app实例。则该步骤必须,否则 db.create_all()将找不到app实例对象
    db.create_all()         # 初始化数据库,若数据库中没有相应的表,则创建表结构

    from .api_1_0 import api as api_blueprint
    app.register_blueprint(api_blueprint, url_prefix='/api/v1')

    return app
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。