博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
flask-sqlalchemy(包含离线脚本,with在上下文管理的应用)
阅读量:4543 次
发布时间:2019-06-08

本文共 4511 字,大约阅读时间需要 15 分钟。

将SQLAlchemy相关的所有功能都封装到db=flask_sqlalchemy.SQLAlchemy()对象中

- 创建表

class User(db.Model):
pass

- 操作表

db.session

具体使用

项目目录结构

步骤:

1. 在 __init__.py中创建db对象    from flask_sqlalchemy import SQLAlchemy    # 包含了SQLAlchemy相关的所有操作    db = SQLAlchemy()    2. 在 __init__.py中create_app函数中让将app传入到db中        def create_app():        app = Flask(__name__)        app.config.from_object('settings.DevelopmentConfig')        from .views.account import ac        app.register_blueprint(ac)                # 看这里看这里        db.init_app(app)                return app3. 写配置文件,将连接字符串定义在配置文件中        SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:        SQLALCHEMY_POOL_SIZE = 5        SQLALCHEMY_POOL_TIMEOUT = 30        SQLALCHEMY_POOL_RECYCLE = -14. 定义 s8day130_pro/models.py            #!/usr/bin/env python        # -*- coding:utf-8 -*-        from sqlalchemy.ext.declarative import declarative_base        from sqlalchemy import Column, Integer, String, UniqueConstraint,        from s8day130_pro import db        class Users(db.Model):            __tablename__ = 'users'            id = Column(Integer, primary_key=True,autoincrement=True)            name = Column(String(32),nullable=False,unique=True)                5. 创建数据库表,编写离线脚本:drop_create_table.py         from s8day130_pro import db        from s8day130_pro import create_app        from s8day130_pro import models        app = create_app()        with app.app_context():            db.drop_all()            db.create_all()            #data = db.session.query(models.Users).all()            #print(data)6. 在视图函数中使用SQLAlchemy操作数据库        from s8day130_pro import models        from s8day130_pro import db        ac = blueprints.Blueprint('ac',__name__)        @ac.route('/login',methods=['GET','POST'])        def login():            data = db.session.query(models.Users).all()            print(data)            db.session.remove()            return 'Login'

__init__文件

from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy# 包含了SQLAlchemy相关的所有操作db = SQLAlchemy()from .views.account import acfrom .views.home import hmdef create_app():    app = Flask(__name__)    app.config.from_object('settings.DevelopmentConfig')    app.register_blueprint(ac)    app.register_blueprint(hm)    db.init_app(app)    return app

在配置完成后,我们也写了models表后,如果进行数据迁移(在数据库中创建表),我们可以使用离线脚本(不需要运行项目,可以直接执行的文件)

"""Web运行时,flask程序运行起来,用户通过浏览器访问离线脚本,自定义的一个py文件+使用flask中定义好的功能"""from s8day130_pro import dbfrom s8day130_pro import create_appfrom s8day130_pro import modelsapp = create_app()with app.app_context():    db.drop_all()    # db.create_all()    # data = db.session.query(models.Users).all()    # print(data)

db就我们在__init__文件中实例化的对象,它包含了create_all(创建表)和drop_all(删除表)的命令,但是由于在使用db时我们需要用到app中关于数据库的配置(从上下文中取),但是这时项目没有运行,没有请求,在local类中没有app的内容,所以我们使用with

方法,利用上下文管理,将需要的内容添加到loacl对象中

with方法

class Sxw(object):    def __enter__(self):        '''进入'''        print("你好啊")    def __exit__(self, exc_type, exc_val, exc_tb):        '''退出'''        print("hao")obj = Sxw()with obj:    print("正在执行")

打印结果截图

在上面的离线脚本中,进入时其实就是在__enter__中执行了push方法,将appcontext的对象放入到local中,而退出时则是在__exit__中执行了pop方法,将对象从local中删除

SQLAlchemy两种创建session的方式

方式一:    import models    from threading import Thread    from sqlalchemy.orm import sessionmaker    from sqlalchemy import create_engine    engine =create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/s8day128db?charset=utf8",pool_size=2,max_overflow=0)    XXXXXX = sessionmaker(bind=engine)    def task():        from sqlalchemy.orm.session import Session        session = XXXXXX()        data = session.query(models.Classes).all()        print(data)        session.close()    for i in range(10):        t = Thread(target=task)        t.start()方式二(推荐):    import models    from threading import Thread    from sqlalchemy.orm import sessionmaker    from sqlalchemy import create_engine    from sqlalchemy.orm import scoped_session    engine =create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/s8day128db?charset=utf8",pool_size=2,max_overflow=0)    XXXXXX = sessionmaker(bind=engine)    session = scoped_session(XXXXXX)            def task():        # 1. 原来的session对象 = 执行session.registry()        # 2. 原来session对象.query        data = session.query(models.Classes).all()        print(data)        session.remove()            for i in range(10):        t = Thread(target=task)        t.start()

方式二的内部其实就利用threading.loacl为每个线程单独创建了一个session

flask-session默认也是使用的第二种方式:scoped_session

 

转载于:https://www.cnblogs.com/weiwu1578/articles/8992252.html

你可能感兴趣的文章
[问题记录.dotnet]取网卡信息报错"找不到"-WMI - Not found
查看>>
Codeforces Round #254 (Div. 2):B. DZY Loves Chemistry
查看>>
linux 安装虚拟机
查看>>
Thinkphp5笔记二:创建模块
查看>>
centos 安装mysql
查看>>
Redis 禁用FLUSHALL FLUSHDB KEYS 命令
查看>>
Matlab中imread函数使用报错“不应为MATLAB 表达式”分析
查看>>
MFC ADO数据库操作
查看>>
图像质量评价-NQM和WPSNR
查看>>
面试准备——相关知识
查看>>
每日一字:悟
查看>>
CentOS7.6安装稳定版Nginx
查看>>
LeetCode 1002. Find Common Characters (查找常用字符)
查看>>
建立隐藏管理员用户
查看>>
android设置图文提醒功能
查看>>
ajax跨域提交
查看>>
完成登录与注册页面的前端
查看>>
Mac下source tree 下的安装
查看>>
Q学习原理及例子
查看>>
rpmbuild 源码打包clickhouse,附带打好的rpm包下载地址
查看>>