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

原文地址:https://www.cnblogs.com/neozheng/p/10317683.html

时间: 2024-11-06 13:38:06

Flask组件:flask-sqlalchemy的相关文章

Flask组件 flask_session

flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis memcached filesystem mongodb sqlalchmey 安装 pip3 install flask-session 存储方式 redis #!/usr/bin/env python # -*- coding:utf-8 - import redis from flask import F

Flask 如何使用 SQLAlchemy 框架

step1#配置数据库 simpleBlog/config.py import os basedir = os.path.abspath(os.path.dirname(__file__)) SQLALCHEMY_DATABASE_URI = 'sqlite:///'+ os.path.join(basedir, 'app.db') SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository') WTF_CSRF_ENABLED=

flask连接数据库mysql+SQLAlchemy

使用flask框架链接2种数据库 ----------db.py # -*- coding: utf-8 -*- # Flask hello world from flask import Flask from flask.ext.mysql import MySQL app = Flask(__name__) '''' ###链接数据库MySQL版 mysql = MySQL() app.config['MYSQL_DATABASE_USER'] = 'root' app.config['MY

网站后端_Python+Flask.0008.FLASK响应相关之隐式显式与自定义响应?

隐式响应: 1. 视图函数的返回值会被隐式转换为一个响应对象 2. 如果返回的是一个合法的响应对象,则会从视图函数中直接返回 3. 如果返回的是一个字符串,会用字符串数据和默认参数创建字符串为主体,状态码为200,MIME类型为text/html的werkzeug.wrappers.Response响应对象 4. 如果返回的是一个元组(response, status, headers),且至少包含一个元素,status值会覆盖状态代码,headers可以是一个列表或是字典,作为额外的消息头 5

网站后端_Python+Flask.0009.FLASK静态资源之默认及自定义资源目录?

默认位置: 说明: WEB应用大多会提供基于CDN的静态文件服务以便给用户更好的体验,静态文件主要包括CSS/JS/图片/字体等,FLASK默认只需要在项目根目录下创建"static"的目录,项目中使用基于/static开头的路径就可以访问,但是为了更好的处理能力,推荐使用Nginx或是其它的WEB服务器管理静态文件 推荐方案: 1. 不要在项目中直接写死静态文件路径,应该使用url_for生成路径,当然如果我们想指定路径也可以在创建app实例时指定static_folder参数 #!

网站后端_Python+Flask.0010.FLASK即插视图之自定义视图类及视图修饰?

即插视图; 说明: FLASK的视图灵感来自于DJANGO的基于类而非基于函数的通用视图,主要目的是为了解决多个视图函数之间已经实现的部分,通过类继承的方式继承到其它视图,总之为了一点,就是少写代码,然后通过add_url_rule让我们定义的视图类支持动态插入,也就是所谓的即插视图 深入视图: # 转换前: #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # 51CTOBG: h

网站后端_Python+Flask.0006.FLASK地址转换之默认转换与自定义转换?

动态规则: 说明: URL规则可添加变量部分,也就是说将符合同种规则的URL抽象成一个URL模式 @app.route('/instance/<uuid>/') def instance(uuid):     return 'Instance: {}'.format(uuid) 注意: 尖括号中内容是动态的,凡是匹配到/instance/前缀的都会被映射到这个路由上,在内部把uuid作为参数而获得,默认类型为字符串 默认转换: 说明: 可通过<converter:variable_nam

网站后端_Python+Flask.0007.FLASK构造跳转之301跳转与302重定向?

构造地址: 说明: FLASK支持通过视图函数及传参来构造URL,而且未来修改URL可一次性修改,且默认构建会转义特殊字符和Unicode数据,这些工作不需要我们自己处理,且不仅支持在上下文中构造而且还支持在模版文件中构造 #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # 51CTOBG: http://xmdevops.blog.51cto.com/ # Purpose: #

网站后端_Python+Flask.0005.FLASK调试模式之开启DEBUG与PIN使用?

自动加载: # 方式一 if __name__ == '__main__':     app.run(host='0.0.0.0', port=9000, debug=True) # 方式二 if __name__ == '__main__':     app.debug = True     app.run(host='0.0.0.0', port=9000) 说明: 可通过如上两种方式开启调试模式,调试模式下PY文件被修改会自动重新加载,资源文件/模版文件/配置文件修改必须重启生效~这个确实