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
    • 创建连接
  • 相关阅读:
    Android自定义之仿360Root大师水纹效果
    Android之TextView的Span样式源码剖析
    Android之TextView的样式类Span的使用详解
    随着ScrollView的滑动,渐渐的执行动画View
    仿微信主界面导航栏图标字体颜色的变化
    android自定义之 5.0 风格progressBar
    Android性能优化之内存篇
    Android性能优化之运算篇
    How to install Zabbix5.0 LTS version with Yum on the CentOS 7.8 system?
    How to install Zabbix4.0 LTS version with Yum on the Oracle Linux 7.3 system?
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/9657719.html
Copyright © 2011-2022 走看看