Flask-SQLAlchemy主要是把Flask和SQLAlchemy進行無縫對接python
settings.pymysql
#!/usr/bin/env python # -*- coding:utf-8 -*- class BaseConfig(object): # SESSION_TYPE = 'redis' # session類型爲redis # SESSION_KEY_PREFIX = 'session:' # 保存到session中的值的前綴 # SESSION_PERMANENT = True # 若是設置爲False,則關閉瀏覽器session就失效。 # SESSION_USE_SIGNER = False # 是否對發送到瀏覽器上 session:cookie值進行加密 SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root@127.0.0.1:3306/s7day145_2?charset=utf8" SQLALCHEMY_POOL_SIZE = 5 SQLALCHEMY_POOL_TIMEOUT = 30 SQLALCHEMY_POOL_RECYCLE = -1 # 追蹤對象的修改而且發送信號 SQLALCHEMY_TRACK_MODIFICATIONS = False class ProductionConfig(BaseConfig): pass class DevelopmentConfig(BaseConfig): pass class TestingConfig(BaseConfig): pass
run.pyredis
from sansa import create_app app = create_app() if __name__ == '__main__': app.run()
sansa __init__.pysql
#!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() from .models import * from .views import account def create_app(): app = Flask(__name__) app.config.from_object('settings.DevelopmentConfig') # 將db註冊到app中 db.init_app(app) # 註冊藍圖 app.register_blueprint(account.account) return app
views account.py數據庫
#!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Blueprint from .. import db from .. import models account = Blueprint('account', __name__) @account.route('/login') def login(): # 添加示例 """ db.session.add(models.Users(username='alex', pwd='123', gender=1)) db.session.commit() obj = db.session.query(models.Users).filter(models.Users.id == 1).first() print(obj) PS: db.session和db.create_session """ # db.session.add(models.Users(username='wupeiqi1', email='wupeiqi1@xx.com')) # db.session.commit() # db.session.close() # # db.session.add(models.Users(username='wupeiqi2', email='wupeiqi2@xx.com')) # db.session.commit() # db.session.close() # db.session.add(models.Users(username='alex1',email='alex1@live.com')) # db.session.commit() # db.session.close() user_list = db.session.query(models.Users).all() db.session.close() for item in user_list: print(item.username) return 'login'
在上面代碼中db.init_app(app)主要是將db註冊到app中,在init_app函數源碼中,能看去讀取配置文件數據庫相關的配置flask
那在建立表和操做表都要鏈接數據庫,首先看建立表,以前SQLAlchemy定義表須要繼承一個基類Base = declarative_base(),而在Flask-SQLAlchemy只要繼承db.Model,而後其餘的和SQLAlchemy是同樣的瀏覽器
#!/usr/bin/env python # -*- coding:utf-8 -*- from . import db from flask import Flask,request class Users(db.Model): """ 用戶表 """ __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return '<User %r>' % self.username
在Flask-SQLAlchemy導入的SQLAlchemy進行實例化時,self.Model長這樣cookie
self.Model = self.make_declarative_base(model_class, metadata)
而在make_declarative_base函數,會看到下列這段代碼,本質上是和SQLAlchemy同樣的session
if not isinstance(model, DeclarativeMeta): model = declarative_base( cls=model, name='Model', metadata=metadata, metaclass=DefaultMeta )
另外建立有一個函數db.create_all的函數,若是是離線腳本進行建立,則須要用到Flask的上下文app
#!/usr/bin/env python # -*- coding:utf-8 -*- from sansa import create_app from sansa import db app = create_app() with app.app_context(): db.create_all()
上面建立表過程當中,還須要注意的是 在create_app裏,你要把定義好的表加載進來(也就是導入進來,原理和導入藍圖是同樣的),而且導入要在實例化db後,由於model裏要用到db
而操做表,什麼engine和拿鏈接都不用你作了,直接db.session進行操做就能夠了
""" db.session.add(models.Users(username='alex', pwd='123', gender=1)) db.session.commit() obj = db.session.query(models.Users).filter(models.Users.id == 1).first() print(obj) PS: db.session和db.create_session """ # db.session.add(models.Users(username='wupeiqi1', email='wupeiqi1@xx.com')) # db.session.commit() # db.session.close() # # db.session.add(models.Users(username='wupeiqi2', email='wupeiqi2@xx.com')) # db.session.commit() # db.session.close() # db.session.add(models.Users(username='alex1',email='alex1@live.com')) # db.session.commit() # db.session.close() user_list = db.session.query(models.Users).all() db.session.close() for item in user_list: print(item.username)
Flask-SQLAlchemy主要作了這幾件事