zoukankan      html  css  js  c++  java
  • 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
    • 创建连接
  • 相关阅读:
    A. Dreamoon and Stairs(Codeforces Round #272)
    bootstrap之UpdateStrings
    FZU
    IT忍者神龟之 oracle行转列、列转行
    linux find 10天内改动过的文件
    内核调试日志打印宏
    ack-grep 代码全文搜索
    JDK配置 linux
    IDA修改游戏
    curl 访问https问题
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/9657719.html
Copyright © 2011-2022 走看看