Flask-SQLAlchemy

  Flask-SQLAlchemy主要是把Flask和SQLAlchemy进行无缝对接

settings.py

#!/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.py

from sansa import create_app

app = create_app()

if __name__ == '__main__':
    app.run()

 sansa __init__.py

#!/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函数源码中,能看去读取配置文件数据库相关的配置

  那在创建表和操作表都要连接数据库,首先看创建表,之前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长这样

        self.Model = self.make_declarative_base(model_class, metadata)

   而在make_declarative_base函数,会看到下列这段代码,本质上是和SQLAlchemy一样的

        if not isinstance(model, DeclarativeMeta):
            model = declarative_base(
                cls=model,
                name='Model',
                metadata=metadata,
                metaclass=DefaultMeta
            )

 

  另外创建有一个函数db.create_all的函数,如果是离线脚本进行创建,则需要用到Flask的上下文

#!/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主要做了这几件事

  • 读取配置
  • 创建ORM基类
  • 包含create_all
  • engine
  • 创建连接
posted @ 2018-09-17 11:28  财经知识狂魔  阅读(242)  评论(0编辑  收藏  举报