Flask调用数据库实现建表,插入数据
1.准备
(1)下载相应的库
pip install pymysql # MySQL驱动
pip install flask-script==2.7.0 # flassk的外壳
pip install flask-sqlalchemy==2.4.1 # 连接数据库的桥梁
pip install flask-migrate==1.0.1 # 执行命令的操作工具
(2)在项目下创建Setting文件
【包含什么环境,以及连接数据库】
class Setting_config:
# 具体 sqlalchemy的设置链接 https://www.jianshu.com/p/f7ba338016b8
# mysql+pymysql://用户名:用户密码@主机名:端口名/数据库名
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@localhost:3306/database' # database:数据库名
# 当 migister去交给 manager管理时,会同时向 app发送连接,会弹出警告,对此将警告进行关闭 【如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。】
SQLALCHEMY_TRACK_MODIFICATIONS = False
class Develoopment_config(Setting_config):
ENV = 'development'
DEBUG = True
class Production_config(Setting_config):
ENV = 'production'
DEBUG = False
(3)创建一个新的 app 包(package)以及 extes的扩展包(package)
2.使用
1.app扩展包下的 init 文件:
import Setting
def create_app():
app = Flask(__name__,template_folder="../templates",static_folder="../static")
# 外部环境条件
app.config.from_object(Setting.Production_config)
return app
2. app开始文件
from apps import create_app
from flask_script import Manager
app = create_app()
# 创建外壳
manager = Manager(app)
if __name__ == '__main__':
manager.run()
3.在 extes扩展包下的 init 文件导入 db
# 创建映像
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
4.在扩展包app下的 init 文件导入 db
import Setting
from Extends import db
def create_app():
app = Flask(__name__,template_folder="../templates",static_folder="../static")
# 外部环境条件
app.config.from_object(Setting.Production_config)
# 将 db对象与 app进行关联,并进行初始化配置 db 会跟 setting下的数据库进行关联
db.init_app(app = app)
return app
5.在开始文件 app 中将命令的操作导入到 manager以及 app中
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from Extends import db
from apps import create_app
app = create_app()
# 创建外壳
manager = Manager(app)
# 命令工具的连接 目的:实现migrate和数据库的连接
migrate = Migrate(app = app ,db= db)
# 目的:将 将 migrate的命令交给 manager管理
manager.add_command('db',MigrateCommand) # 给要执行的命令添加一个 db 名
if __name__ == '__main__':
manager.run()
6.创建一个网站所需要的类别,比如用户,商品,货物等
创建一个 user 的package,以及 views.py ,model.py 文件
(1)model文件
# ORM 类 ——————> 表
#类对象 ——————> 表中的一条记录
from datetime import datetime
from Extends import db
# create table user(id int primarykey auto_increment,username varchar(20)...) 下面的方式类似与上面这种
class User(db.Model):
# db.Column(类型,约束) ——》映射成表中的每一列 比如:是整型,还是浮点型,还是字符型
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(5),nullable=False)
phone = db.Column(db.String(11),unique=True) # 手机唯一
datatime = db.Column(db.DateTime,default=datetime.now) # 时间
# sex = db.Column(db.Boolean,default=False) # 布尔类型,Flask代表男
def __str__(self):
return self.username # 返回信息。可多条信息
(2)在start中导入相应的文件【目的:为了在执行操作命令时,可以将User下的model文件进行导入】
from apps.user.model import User # 然后在终端执行
(3)视图 view 文件
from flask import Blueprint,render_template
User_Blueprint = Blueprint("User_Blueprint",__name__)
@User_Blueprint.route("/",methods = ['GET','POST'])
def index():
return render_template("index.html")
并将蓝图的 RootBlueprint 导入到 create_app中
import Setting
from apps.user.views import User_Blueprint
def create_app():
app = Flask(__name__,template_folder="../templates",static_folder="../static")
# 外部环境条件
app.config.from_object(Setting.Production_config)
app.register_blueprint(User_Blueprint) # 插上 user的蓝图
return app
7.将在 view中获得的数据同步到数据库中
(1)register ——HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="{{ url_for('/register') }}" method="post">
<input type="text" name="username" placeholder="用户名:">
<input type="password" name="password" placeholder="用户密码:">
<input type="password" name="repassword" placeholder="再次输入密码:">
<input type="submit" value="注册">
</form>
</body>
</html>
(2)register——view
from flask import Blueprint,render_template,request
from Extends import db
from apps.user.models import User
User_Blueprint = Blueprint("User_Blueprint",__name__)
@User_Blueprint.route("/register",methods = ['GET','POST'])
def register():
if request.method == 'POST':
username = request.form.get("username")
password = request.form.get("password")
repassword = request.form.get("repassword")
if password == repassword:
# 1.找到模板
user = User() # 将 用户信息添加到 model模型中去
# 2.给对象的属性赋值
user.username = username # 列举一条
# 3.添加到数据库
db.session.add(user) # 将数据添加到 session 缓存之中
db.session.commit() # 进行提交
return '注册成功'
else:
return '两次密码不一致'
return render_template("user/register.html")
3.执行脚本:
(1)生成版本文件
[db 指代 Sqlalchemy下的实例化参数] 一个项目只需要 init一次
python app.py db init
(2)当添加了表之后,要通过以下脚本进行修改进行迁移
python app.py db migrate
(3)同步到数据库上
python app.py db upgrade
(4)降级数据库
当添加的字段不想要的时候,既要进行降级,同时要将新加的版本手动删除掉,防止再次同步的时候出现版本不一致
python app.py db downgrade
————————
内有不足!
请多指教!