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_idzuo 是可以随便定义 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

 

 

 

posted @ 2022-10-24 10:58  我在春天等伱  阅读(61)  评论(0)    收藏  举报