1. flask 数据库链接 | 2. 数据库1对多 | 数据库多对多 | 3. 数据库 1对 1 | 4. migrate数据迁移 | 5.目录重构 | 6. 接收前台提交数据 | 7. 绑定第三方扩展插件
1. flask 数据库链接
插件安装
# 安装 flask-sqlalchemy (用于ORM)
pip install flask-sqlalchemy -i https://pypi.douban.com/simple
#安装flask-migrate(用于数据迁移)
pip install flask-migrate -i https://pypi.douban.com/simple
#安装 pymysql (MySQL驱动)
pip install pymysql -i https://pypi.douban.com/simple
链接
''' 1. 安装 flask-sqlalchemy 2. 安装 flask-mysqldb ''' # 数据库的配置变量 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flash001' USERNAME = 'flash001' PASSWORD = 'flash001' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI # 跟踪数据库动态 建议关闭 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app)
# 测试 数据库链接是否成功
with app.app_context():
with db.engine.connect() as conn:
re = conn.execute('select 1')
print(re.fetchone())
1.1 添加数据之前必须创建数据库
# 没学ORM迁移数据库必须删掉数据 db.drop_all() # 创建数据库 db.create_all()
数据提交 回滚
try: db.session.add all(users) db.session.commit() #事务提交 except Exception as e: db.session.rollback() # 回滚 db.session.flush() return 'fail:'+ str(e)
2. 数据库1对多 创建方法
第一种方法
# 定义用户数据模型 1 class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(25), nullable=False)
# 定义文章模型 多 注释 user_id 与 zuo 是可以随便定义 class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(45), nullable=False) content = db.Column(db.String(145), nullable=False)
# 外键
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
# 关系
author = db.relationship('User', backref='articles')
第二种方法 :
# 定义用户数据模型 class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(25), nullable=False)
# 建立关联
# 第1个参数:关联的模型名(表)
#第2个参数:反向引用的名称,grade对象,
#让student去反过来得到grade对象的名称:student.grade
# 第3个参数:懒加载
articles = db.relationship('Article', backref='user', lazy=True)
# 定义文章模型 多 注释 user_id 与 zuo 是可以随便定义 class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(45), nullable=False) content = db.Column(db.String(145), nullable=False) # 外键 author_id = db.Column(db.Integer, db.ForeignKey(User.id))
数据添加代码 代码 数据调用展示 : 通过新闻找作者, 通过作者找所有新闻
@app.route('/')
def index():
# 没学ORM迁移数据库必须删掉数据
db.drop_all()
# 创建数据库
db.create_all()
article = Article(title='36号技师', content='55555')
article1 = Article(title='34号技师', content='66666')
user = User(username='晓雪')
user1 = User(username='小丽')
article.author = user
article1.author = user
db.session.add(article, article1)
db.session.commit()
# 通过文章找到作者
print(article.author.username, article1.author.username)
# 通过作者找到所有文章
print(user.articles)
print(user1.articles)
return '数据添加成功'
数据库多对多
中间表 需要写到上面
# 中间表:收藏表 collect = db.Table( 'collects', // 随便起
// user_id 关联表id db.column('user_id', db.Integer, db.ForeignKey('usermodel.id'), primary_key=True),
db.column('movie_id', db.Integer, db.ForeignKey('movie.id'), primary_key=True)
)
用户表
#用户:电影=N:M # 用户表 class userModel(db.Model): __tablename__ ='usermodel id = db.column(db.Integer, primary key=True, autoincrement=True) name = db.column(db.string(30),unique=True) age = db.column(db.Integer)
电影表
# 电影表 class Movie(db.Model): __tablename__ ='movie' id = db.column(db.Integer, primary key=True, autoincrement=True) name = db.column(db.string(30),unique=True)
# 关联 collect 是中间表名字
users = db.relationship('UserModel',backref='movies', lazy=True,secondary=collect)
多对多的查询
# 查询 @blue.route('/getcollect/') def get collect(): # 查找某用户收藏的所有电影 user = UserModel.query.get(1) print(user.movies) return 'Ok
#查找收藏了某电影的所有用户
movie = Movie.query.get(4)
print(movie.users)
print(list(movie.users))
多对多数据删除
# 修改:和单表操作 # 删除 @blue.route('/deluser/') def del user(): # 级联删除 user =UserModel.query.get(1) db.session.delete(user) db.session.commit() return 'Ok
3.数据库 1对 1 创建方法
3.1 1对1 的第一种写法
# 定义用户数据模型 class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(25), nullable=Flask) # 定义用户 扩展数据 class UserExtension(db.Model): __tablename__ = 'user_extension' id = db.Column(db.Integer, primary_key=True, autoincrement=True) school = db.Column(db.String(25)) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # userlist=Flask 反向索引时, 不是一个列表 是一个对象 user = db.relationship('User', backref=db.backref('extension', uselist=Flask))
3.1 1对1 数据添加
# 1对1数据添加 @app.route('/user/one') def user_one(): # user = User.query.filter_by(id=1).first() #数据库中查询数据 user = User(username='苍井空') extension = UserExtension(school='大学') user.extension = extension db.session.add(user) db.session.commit() return 'one数据添加成功!'
3.2 1对1 的第二种写法
# 定义用户数据模型 class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(25), nullable=Flask) user = db.relationship('UserExtension', uselist=False, backref='user') # 定义用户 扩展数据 class UserExtension(db.Model): __tablename__ = 'user_extension' id = db.Column(db.Integer, primary_key=True, autoincrement=True) school = db.Column(db.String(25)) user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
3.2.1 数据添加代码
# 1对1数据添加 @app.route('/user/one') def user_one(): # user = User.query.filter_by(id=1).first() #数据库中查询数据 user = User(username='苍井空') extension = UserExtension(school='京东热') user.user = extension db.session.add(user) db.session.commit() return 'one数据添加成功!'
4. migrate数据迁移
# 首先安装 flask_migrate from flask_migrate import Migrate migrate = Migrate(app, db)
4.1 在终端运行 完成数据迁移
1. flask db init # 初始化信息
2. flask db migrate # 生成迁移脚本
3. flask db upgrade # 生成表
5. 目录重构
5.1 app文件代码
from flask import Flask, render_template, request, flash from flask_migrate import Migrate from models import User, Article, UserExtension import config from exts import db app = Flask(__name__) app.config.from_object(config) # app绑定db上 db.init_app(app) # 数据迁移 migrate = Migrate(app, db)
5.2 models 文件代码
from exts import db # 一对多 ************************************* # 定义用户数据模型 class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(25)) # 1对多 的第一种方式 # user = db.relationship("Article",backref="articles") # 1对1 的第一种方式 不同时用 # user = db.relationship('UserExtension', uselist=False, backref='user') # 定义用户 扩展数据 1对1 class UserExtension(db.Model): __tablename__ = 'user_extension' id = db.Column(db.Integer, primary_key=True, autoincrement=True) school = db.Column(db.String(25)) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # userlist=Flask 反向索引时, 不是一个列表 # 1对1的第二种方式 user = db.relationship('User', backref=db.backref('extension', uselist=False)) # 定义文章模型 class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(45)) content = db.Column(db.TEXT) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 1对多得 第二种方式 author = db.relationship('User', backref='articles')
# 备注
#db.Column:表示字段
#db.Integer:表示整数
#primary_key=True:主键
# autoincrement=True:自动递增
#db.String(30):varchar(30)可变字符串
# unique=True:唯一约束
#index=True:普通索引
# default=1 : 默认值
# nulLable=False:是否允许为空
5.3 config 文件代码
''' 1. 安装 flask-sqlalchemy 2. 安装 flask-mysqldb ''' # 数据库的配置变量 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flash001' USERNAME = 'flash001' PASSWORD = 'flash001' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) SQLALCHEMY_DATABASE_URI = DB_URI # 跟踪数据库动态 建议关闭 SQLALCHEMY_TRACK_MODIFICATIONS = False
5.4 exts 文件代码
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
6. 接收前台提交数据
7 绑定第三方扩展插件
创建一个文件 exts.py
#1.导入第三方插件 from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate #2.初始化
db = SQLAlchemy() # ORM
migrate = Migrate() # 数据迁移
# 3.和app对象绑定
def init_exts(app):
db.init_app(app=app)
migrate.init_app(app=app,db=db)
__init__.py 文件代码
from .exts import init_exts
#初始化插件
init_exts(app=app)
插件使用案例 : flask-caching
安装插件
pip install flask-caching
初始化插件
初始化 from flask_cache import cache cache = cache(config={ 'CACHE _TYPE': 'simple' }) cache.init_app(app=app)
使用插件
使用 在视图函数上添加缓存 @blue.route('/') @cache.cached(timeout=30) def home(): print('加载数据') return "home
案例 :
# exts 文件代码
from flask sqlalchemy import sQLAlchemy from flask migrate import Migrate from flask caching import Cache
db = SQLAlchemy() migrate = Migrate() cache =Cache(config={ 'CACHE TYPE':'simple #缓存类型 })
def init exts(app): db.init _app(app=app) migrate.init_app(app=app, db=db) cache.init app(app=app)
# view 代码 # 使用缓存 @blue.route('/') #给视图函数加一个缓存 @cache.cached(timeout=28) // 等待28后重新加载 def index(): print('Index2') time.sleep(5) return 'index2