Flask-SQLAlchemy在Flask中的應用實戰(zhàn)

由于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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容