由于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對象一定是創(chuàng)建數據庫模型的那個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應用程序關聯(lián)起來呢?
在我們創(chuàng)建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() # 初始化數據庫,若數據庫中沒有相應的表,則創(chuàng)建表結構
from .api_1_0 import api as api_blueprint
app.register_blueprint(api_blueprint, url_prefix='/api/v1')
return app