Flask组件:flask-sqlalchemy

flask-sqlalchemy组件

项目目录结构:

flask目录  # 项目名
|--- flaskdir
     |--- static  # 静态文件
     |--- templates  # 模板
     |--- models.py  # models 文件
     |--- __init__.py  # 创建 app 对象
     |--- views  # 视图
          |--- account.py
          |--- user.py
|--- manage.py  # 入口程序
|--- settings.py  # 配置文件
|--- create_table.py  # 在数据库中创建表的脚本

manage.py

from flaskdir import create_app

app = create_app()

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

settings.py

from redis import Redis

class BaseConfig(object):
    # SESSION_TYPE = "redis"
    # SESSION_REDIS = Redis(host="127.0.0.1",port=6379)

    # ##### SQLAlchemy 相关配置 #####
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:[email protected]:3306/dbtest?charset=utf8"  # 连接 数据库
    SQLALCHEMY_POOL_SIZE = 10  # 连接池大小
    SQLALCHEMY_MAX_OVERFLOW = 5  # 连接池 最大溢出

    SQLALCHEMY_TRACK_MODIFICATIONS = False

    pass

class ProConfig(BaseConfig):
    pass

create_table.py

# 在数据库中创建表的脚本

from flaskdir import db,create_app  # 导入 db

app = create_app()
app_ctx = app.app_context()  # 导入 Flask 的 app 上下文
with app_ctx:  # __enter__ 方法:通过 LocalStack 放入 Local 中
    db.create_all()  # 在 with app_ctx 中,执行 db.create_all();调用 LocalStack 获取 Local 中的 app,再去 app 中获取配置

flaskdir/__init__.py

from flask import Flask
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy  # 从 flask-sqlalchemy 引入 SQLAlchemy

# flask-sqlalchemy 的使用方法:
# 第一步: 导入并实例化 SQLAlchemy
db = SQLAlchemy()  # db 这个对象中含有 SQLAlchemy 需要的所有东西,唯独少 数据库连接
# 注意: SQLAlchemy 的实例化必须要在 蓝图的上面


from .views.account import ac
from .views.user import usr
from .models import *  # 也要导入 models 中的类


def create_app():
    app = Flask(__name__)
    app.config.from_object("settings.ProConfig")

    app.register_blueprint(ac)
    app.register_blueprint(usr)

    # Flask-session:第一步要实例化 Session;第二步要加配置
    # Session(app)

    # 第三步:注册:app 中含有所有的配置文件,所以这一步是去 配置文件中读取 数据库连接
    db.init_app(app)

    return app

flaskdir/models.py

from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
from flaskdir import db

# 第二步:让 Users 继承 db.Model;db.Model 就是 SQLAlchemy 中的 Base
class Users(db.Model):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=False)
    # email = Column(String(32), unique=True)
    # ctime = Column(DateTime, default=datetime.datetime.now)
    # extra = Column(Text, nullable=True)

flaskdir/views/user.py

from flask import Blueprint
from flaskdir.models import *  # 导入 model 类
from flaskdir import db

usr = Blueprint("sur",__name__)

@usr.route("/index")
def login():
    # 使用flask-sqlalchemy 在数据库 users 表中插入一条数据
    """
    db.session.add(Users(name="neo"))  # db,session 会为每个线程在 数据库连接池 中获取一个连接;基于 scoped_session 实现的
    db.session.commit()  # 提交
    db.session.remove()  # 把连接归还给连接池
    """
    # 使用 flask-sqlalchemy 从数据库 users 表中获取数据
    ret = db.session.query(Users).all()
    print(ret)
    db.session.remove()

    return "index"

flaskdir/views/account.py 略

flask-sqlalchemy用法归纳:

a. 下载安装
    pip3 install flask-sqlalchemy
    
b. chun.__init__.py 
    导入并实例化SQLAlchemy
    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    
    注意事项:
         - 必须在导入蓝图之前
         - 必须导入models.py 

c. 初始化
    db.init_app(app)
    
d. 在配置文件中写入配置
    # ##### SQLALchemy配置文件 #####
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:[email protected]:3306/s9day122?charset=utf8"
    SQLALCHEMY_POOL_SIZE = 10
    SQLALCHEMY_MAX_OVERFLOW = 5

e. 创建models.py中的类(对应数据库表)
    flaskdir/models.py 
        from sqlalchemy.ext.declarative import declarative_base
        from sqlalchemy import Column
        from sqlalchemy import Integer,String,Text,Date,DateTime
        from sqlalchemy import create_engine
        from chun import db


        class Users(db.Model):
            __tablename__ = 'users'

            id = Column(Integer, primary_key=True)
            name = Column(String(32), index=True, nullable=False)
            depart_id = Column(Integer)

f. 生成表(使用app上下文)
    from flaskdir import db,create_app

    app = create_app()
    app_ctx = app.app_context() # app_ctx = app/g
    with app_ctx: # __enter__,通过LocalStack放入Local中
        db.create_all() # 调用LocalStack放入Local中获取app,再去app中获取配置

        
g. 基于ORM对数据库进行操作。
    from flask import Blueprint
    from flaskdir import db
    from flaskdir import models
    us = Blueprint('us',__name__)


    @us.route('/index')
    def index():
        # 使用SQLAlchemy在数据库中插入一条数据
        # db.session.add(models.Users(name='高件套',depart_id=1))
        # db.session.commit()
        # db.session.remove()
        result = db.session.query(models.Users).all()
        print(result)
        db.session.remove()

        return 'Index'

补充: with obj 的用法 

class Foo:
    def __init__(self):
        pass

    def __enter__(self):
        print("进入with obj")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出with obj")

obj = Foo()

with obj:  # with 对象 会自动触发类的 __enter__ 方法
    print("在with obj 中")
"""
with 对象: 时,刚进入 缩进时会自动触发 __enter__ 方法
缩进执行完后,会自动触发 __exit__ 方法
"""

# 打印结果:
# 进入with obj
# 在with obj 中
# 退出with obj

猜你喜欢

转载自www.cnblogs.com/neozheng/p/10317683.html