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:tj037778@127.0.0.1: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
from flaskdir.views import *     # 一定导入 models ,否则找不到表 创建不出来
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 中获取配置
db.drop_all()

离线脚本:

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

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:123456@127.0.0.1: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

flask-script组件:

安装:

pip install flask-script

还是以上面的代码为例:

manage.py

from flaskdir import create_app
from flask_script import Manager # 从 flask-script 引入 Manager app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化 # flask-script 用途一:按照位置传参
@manager.command
def custom(arg):
"""
自定义命令;有个这个,以后不仅可以 runserver,还可以 run 这个命令(函数)
执行 如: python manage.py custom 123
"""
print(arg)
"""
用途如:创建表时不用再写 create_all()、create_table.py 这样的离线脚本,而可以直接放到 这个命令里面
""" # flask-script 用途二:按照关键字传参
@manager.option("-n", "--name", dest="name") # -n 代表 --name,表示 要传入函数参数的 "name"
@manager.option("-u", "--url", dest="url") # -u 代表 --url,表示 要传入函数参数的 "url"
def cmd(name, url):
"""
自定义命令:
执行如:python manage.py cmd -n neo -u http://www.baidu.com
"""
print(name, url) if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run() """
flask-script runserver 启动程序:
在命令行输入: python manage.py runserver
并且也可以指定 IP 和 端口,如: python manage.py runserver -h 127.0.0.1 -p 8001
"""

flask-script用途小结:

1. 多了 runserver 的命令:
from flaskdir import create_app
from flask_script import Manager # 从 flask-script 引入 Manager app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化 if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run() 2. 按照位置传参的命令:
from flaskdir import create_app
from flask_script import Manager # 从 flask-script 引入 Manager app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化 # flask-script 用途一:按照位置传参
@manager.command
def custom(arg):
"""
自定义命令;有个这个,以后不仅可以 runserver,还可以 run 这个命令(函数)
执行 如: python manage.py custom 123
"""
print(arg)
"""
用途如:创建表时不用再写 create_all()、create_table.py 这样的离线脚本,而可以直接放到 这个命令里面
""" if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run() 3. 按照关键字传参人命令:
from flaskdir import create_app
from flask_script import Manager # 从 flask-script 引入 Manager app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化 # flask-script 用途二:按照关键字传参
@manager.option("-n", "--name", dest="name") # -n 代表 --name,表示 要传入函数参数的 "name"
@manager.option("-u", "--url", dest="url") # -u 代表 --url,表示 要传入函数参数的 "url"
def cmd(name, url):
"""
自定义命令:
执行如:python manage.py cmd -n neo -u http://www.baidu.com
"""
print(name, url) if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run()

flask-migrate 组件:

安装:

pip install flask-migrate

flask-migrate 用于 数据库迁移,该组件依赖于 flask-script 组件

以上面代码为例:

from flaskdir import create_app,db
from flask_script import Manager # 从 flask-script 引入 Manager
from flask_migrate import Migrate,MigrateCommand # 导入 Migrate 和 MigrateCommand app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化
Migrate(app,db) # 利用 app 和 db 进行 Migrate 的实例化;db 中有数据库的相关操作
"""
数据库迁移命令:
python manage.py db init # 初始化;仅第一次时需要执行该命令
python manage.py db migrate # 相当于 Django 的 makemigrations
python manage.py db upgrade # 相当于 Django 的 migrate
"""
manager.add_command("db",MigrateCommand) # 定义了一个 "db" 的命令; flask-migrate 依赖于 flask-script if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run()

pipreqs 工具:

pipreqs 用于 找到项目中使用的所有组件和版本

安装:

pip install pipreqs

用法:

# 生成 requirements.txt 文件
pipreqs ./ --encoding=utf-8 # 会自动找到 当前目录下 所有文件所依赖的所有的组件和库,并生成一个 requirements.txt 的文件 # 下载所有依赖
pip install -r requirements.txt

虚拟环境:

# 安装:
pip install virtualenv # 命令行创建虚拟环境:
virtualenv env1 --no-site-packages # 创建虚拟环境;--no-site-packages 表示 该虚拟环境中不会安装 python site-packages 目录下的组件和库 # 进入虚拟环境:
cd Scripts
activate # 退出虚拟环境:
deactivate # 也是在 Scripts 目录下

Flask组件:flask-sqlalchemy & flask-script & flask-migrate的更多相关文章

  1. Flask的插件session、SQLAlchemy、Script、Migrate

    一.flask-session 1.为什么要使用flask-session 因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,而使用flask-session可以更 ...

  2. Flask组件

    组件踩坑记录 : 先注册组件在使用配置(...) flask-script Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shel ...

  3. 14、Flask实战第14天:Flask使用SQLAlchemy

    flask-sqlalchemy使用详解 之前我们用到的SQLAchemy是可以单独使用的,不需要用到Flask 如果我们在Flask框架中使用SQLAchemy,可以使用flask_sqlalche ...

  4. Flask 中的 SQLAlchemy 使用教程

    Flask 是一个 python web micro framework.所谓微框架,主要是 flask 简洁与轻巧,自定义程度高.相比 django 更加轻量级. 之前一直折腾 django,得益于 ...

  5. flask连接数据库mysql+SQLAlchemy

    使用flask框架链接2种数据库 ----------db.py # -*- coding: utf-8 -*- # Flask hello world from flask import Flask ...

  6. 【数据可视化之Flask】快速设计和部署Flask网站

    Flask是Python应用于WEB开发的第三方开源框架,以设计简单高效著称.我也尝试过Django,相对于Flask显得更加全面同样也更加笨重,并且我也不需要它的后台管理功能,因此选择了Flask作 ...

  7. Flask 学习篇二:学习Flask过程中的记录

    Flask学习笔记: GitHub上面的Flask实践项目 https://github.com/SilentCC/FlaskWeb 1.Application and Request Context ...

  8. Flask最强攻略 - 跟DragonFire学Flask - 第一篇 你好,我叫Flask

    首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 一. Python 现阶段三大主流Web框 ...

  9. [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题

    http://www.cnblogs.com/mizhon/p/4242073.html [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题 最近想 ...

随机推荐

  1. fastboot命令详解

    Android手机分区(每个分区都有相应的img文件对应):开机启动画面区(splash1),数据恢复区(recovery),内核区(boot), 系统区(system),数据缓存区(cache),用 ...

  2. java中什么包不需要导入

    java中Math.random()*10;在math包中不需要导入: 即import java.lang.Math; 即lang下的所有包都不需要导入.

  3. 205 Isomorphic Strings 同构字符串

    给定两个字符串 s 和 t,判断它们是否是同构的.如果 s 中的字符可以被替换最终变成 t ,则两个字符串是同构的.所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字符不能映射到同一个字 ...

  4. c语言-依赖倒转

    当一个文件(aa.c文件)依赖于头文件(bb.h)时,如果bb.c编译之后形成的bb.o文件重新编译后,aa.o的文件不需要重新编译 aa.c文件: bb.h文件:对bb.c文件进行声明 bb.c文件 ...

  5. Discrete Logging

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5865   Accepted: 2618 ...

  6. 【数据分析 R语言实战】学习笔记 第四章 数据的图形描述

    4.1 R绘图概述 以下两个函数,可以分别展示二维,三维图形的示例: >demo(graphics) >demo(persp) R提供了多种绘图相关的命令,可分成三类: 高级绘图命令:在图 ...

  7. Android 计算view 的高度

    上午在做一个QuickAction里嵌套一个ListView,在Demo运行没事,结果引入到我的项目里,发现我先让它在Button上面,结果是无视那个Button的高度,这很明显,就是那个Button ...

  8. RegisterClientScriptBlock和RegisterStartupScript的区别

    RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚 ...

  9. 从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)

    本篇主要讲配置Windows 故障转移集群及遇到的相关问题(坑),因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁配置 四种集群的仲裁配置: 1.多 ...

  10. 关于Farseer.net轻量级ORM开源框架 V1.0 概念版本开发的消息

    V0.2版的开源距离今天(05年03月)已有近3年的时间.可以说这个版本已经有点落伍的感觉了,呵呵. V0.2版至今一直处于BUG的修复及一些细小功能的增加,所以版本号上一直没有变化. 其实在这1.2 ...