flask项目的使用数据库的一些配置(ORM映射版)

参考博文为知了传课的flask课程,这是数据库连接详解的一段博文
此博文参考知了传课flask课程,这是在b站上的视频可以随时观看

1 一个数据库连接的小Demo

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
HOSTNAME = 'localhost'
PORT = '3306'
DATABASE = 'zl_flask'
USERNAME = 'root'
PASSWORD = '123456'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

db = SQLAlchemy(app)

migrate = Migrate(app, db)

# 测试数据库连接是否成功
# with db.engine.connect() as conn:
#     result = conn.execute("select 1")
#     print(result.fetchone())


class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # varchar
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)


class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)

    # 添加作者的外键
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    author = db.relation("User", backref="articles")


# db.create_all()


# user = User(username="张三", password='123456')


@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'


@app.route("/user/add")
def add_user():
    user1 = User(username="张三", password='123456')
    db.session.add(user1)
    db.session.commit()
    return "添加对象成功!"


@app.route("/user/query")
def query_user():
    # 1.get查找:根据主键查找
    # user = User.query.get(1)
    # print(f"{user.id}:{user.username}--{user.password}")
    # 2.filter_by查找
    # Query:类数组
    users = User.query.filter_by(username="张三")
    for user in users:
        print(type(user))
        print(user.username)
    return "数据查找成功!"


@app.route("/user/update")
def update_user():
    user = User.query.filter_by(username="张三").first()
    user.password = '147852'
    db.session.commit()
    return "数据修改成功!"


@app.route("/user/delete")
def delete_user():
    user = User.query.get(1)
    db.session.delete(user)
    db.session.commit()
    return "删除数据成功!"


if __name__ == '__main__':
    app.run()

使用migrate方式进行数据库连接需要在终端分别运行三行代码

flask db init(运行一次即可)
(此db为上述自己设置的连接数据库的对象,可以修改)
flask db migrate(将orm模型生成迁移脚本)
flask db upgrade (将迁移脚本映射到数据库中)

运行完之后再看navicat的数据库就有了我们的表的信息,项目中会出现下图所示的文件夹
flask项目的使用数据库的一些配置(ORM映射版)_第1张图片

2 一个解耦合的项目进行数据库配置

2.1 首先需要创建几个文件如下图

flask项目的使用数据库的一些配置(ORM映射版)_第2张图片

2.2 上述文件作用

2.2.1 app文件

app文件不再把数据库配置,数据表的模型等一些配置写在一起过于冗余。我们分成几个文件分别来写,然后在app文件中进行调用,这样实现了解耦的作用,并且方便观看。

from flask import Flask
import config
from exts import db
from models import UserModel
from blueprints.qa import qa_blueprint
from blueprints.auth import auth_blueprint
from flask_migrate import Migrate

app = Flask(__name__)

# 绑定配置文件
app.config.from_object(config)

# 把db与app绑定
db.init_app(app)

# 上传数据库
migrate = Migrate(app, db)

# 注册蓝图
app.register_blueprint(qa_blueprint)
app.register_blueprint(auth_blueprint)


if __name__ == '__main__':
    app.run()

2.2.2 config文件

见名知义,这就是配置数据库的设置,app文件中app.config.from_object(config)代码可以自己找的config文件的配置。

# -*- coding: UTF-8 -*-

# 配置数据库信息
HOSTNAME = 'localhost'
PORT = '3306'
DATABASE = 'zl_flask'
USERNAME = 'root'
PASSWORD = '123456'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True

2.2.3 exts文件

为了解决原本的循环引用问题,我们把引用调整成下图所示。

循环引用情况1:创建UserModel需要引用db.Model,而app.py当中又需要引用UserModel并创建db。
flask项目的使用数据库的一些配置(ORM映射版)_第3张图片
循环引用情况2:这个也循环引用

flask项目的使用数据库的一些配置(ORM映射版)_第4张图片
解决办法:
flask项目的使用数据库的一些配置(ORM映射版)_第5张图片
此处在app.py文件中需要使用db.init_app(app)代码进行db与app的绑定,而不是在db创建的时候就是使用db = SQLAlchemy(app)进行绑定,这样会出现循环引用情况2。

# exts文件代码
# 为了解决循环引用的问题
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

2.2.4 models文件

此文件负责创建设计数据库表

from datetime import datetime

from exts import db


class UserModel(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100), nullable=False, unique=True)
    join_time = db.Column(db.DateTime, default=datetime.now)

2.2.5 blueprints文件

auth.py文件

from flask import Blueprint

auth_blueprint = Blueprint("auth", __name__, url_prefix="/auth")


@auth_blueprint.route("/login")
def login():
    pass

qa.py文件

from flask import Blueprint

qa_blueprint = Blueprint("qa", __name__, url_prefix="/")


@qa_blueprint.route("/")
def index():
    pass

蓝图文件相当于模块化我们的功能,之后再分别设置路由。这也是实现了解耦,每一个蓝图都是相当于我们创建app对象的子对象。

使用migrate方式进行数据库连接需要在终端分别运行三行代码

flask db init(运行一次即可)
(此db为上述自己设置的连接数据库的对象,可以修改)
flask db migrate
flask db upgrade

运行完之后再看navicat的数据库就有了我们的表的信息,项目中会出现下图所示的文件夹
flask项目的使用数据库的一些配置(ORM映射版)_第6张图片

以上便是我们一个flask框架连接数据库的大致框架,细节的东西我们需要什么添加什么即可

你可能感兴趣的:(flask,flask,数据库,python)