参考博文为知了传课的flask课程,这是数据库连接详解的一段博文
此博文参考知了传课flask课程,这是在b站上的视频可以随时观看
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()
flask db init(运行一次即可)
(此db为上述自己设置的连接数据库的对象,可以修改)
flask db migrate(将orm模型生成迁移脚本)
flask db upgrade (将迁移脚本映射到数据库中)
运行完之后再看navicat的数据库就有了我们的表的信息,项目中会出现下图所示的文件夹
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()
见名知义,这就是配置数据库的设置,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
为了解决原本的循环引用问题,我们把引用调整成下图所示。
循环引用情况1:创建UserModel需要引用db.Model,而app.py当中又需要引用UserModel并创建db。
循环引用情况2:这个也循环引用
解决办法:
此处在app.py文件中需要使用db.init_app(app)代码进行db与app的绑定,而不是在db创建的时候就是使用db = SQLAlchemy(app)进行绑定,这样会出现循环引用情况2。
# exts文件代码
# 为了解决循环引用的问题
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
此文件负责创建设计数据库表
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)
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对象的子对象。
flask db init(运行一次即可)
(此db为上述自己设置的连接数据库的对象,可以修改)
flask db migrate
flask db upgrade
运行完之后再看navicat的数据库就有了我们的表的信息,项目中会出现下图所示的文件夹
以上便是我们一个flask框架连接数据库的大致框架,细节的东西我们需要什么添加什么即可