由于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