【Flask框架】四. Flask框架之 MySQL数据库操作及项目重构

四. Flask框架之 MySQL数据库操作及项目重构

MySQL数据库操

配置数据库的变量

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'zl_flask'
USERNAME = 'root'
PASSWORD = '190211'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

配置数据库的连接

# 配置数据库的连接
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
# 跟踪修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

测试数据库是否连接成功

db = SQLAlchemy(app)
@app.route('/')
def hello_world():
    engine = db.get_engine()
    with engine.connect() as conn:
        result = conn.execute("select 1")
        print(result.fetchone())
    return 'Hello World!'

增删查改操作

添加数据
  1. 创建添加的对象
  2. 进行添加操作
  3. 提交操作
# 创建添加的对象
user=User(username="123")
# 进行添加操作
db.session.add(user)
# 提交操作
db.session.commit()
查找数据

使用filter_by:返回一个类列表的对象

# filter_by:返回一个类列表的对象
user=User.query.filter_by(id=2)[0]
print(user.username)
修改数据
# 查找出需要修改的数据
user = User.query.filter_by(id=2)[0]
# 直接进行修改
user.username="345"
# 提交操作
db.session.commit()
删除数据
# 整条记录需要删除
User.query.filter_by(id=2).delete()
# 提交操作
db.session.commit()
一对多

ORM类

安装Flask-Migrate插件

绑定app和数据库

migrate = Migrate(app,db)
映射ORM

首先需要初始化一个迁移文件夹:

flask db init

然后再把当前的模型添加到迁移文件中:

flask db migrate

最后再把迁移文件中对应的数据库操作,真正的映射到数据库中:

flask db upgrade

项目重构

config.py

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'zl_flask'
USERNAME = 'root'
PASSWORD = '190211'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True

ext.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

models.py

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(200),nullable=False)
    # password = db.Column(db.String(200),nullable=False)


class UserExtension(db.Model):
    __tablename__ = "user_extension"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    school = db.Column(db.String(100))
    user_id = db.Column(db.Integer,db.ForeignKey("user.id"))

    # db.backref
    # 1. 在反向引用的时候,如果需要传递一些其他的参数,那么就需要用到这个函数,否则不需要使用,只要在relationship的backref参数上,设置反向引用的名称就可以了。
    # 2. uselist=False:代表反向引用的时候,不是一个列表,而是一个对象。
    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(200),nullable=False)
    content = db.Column(db.Text,nullable=False)

    # 外键:
    # 1. 外键的数据类型一定要看,所引用的字段的类型
    # 2. db.ForeignKey("表名.字段名 ")
    # 3. 外键是属于数据库层面的,不推荐直接在ORM中使用
    author_id = db.Column(db.Integer,db.ForeignKey("user.id"))

    # relationship:
    # 1. 第一个参数是模型的名字,必须要和模型的名字保持一致
    # 2. backref(back reference):代表反向引用,代表对方访问我的时候的字段名称
    author = db.relationship("User",backref="articles")

app.py

from flask import Flask
from flask_migrate import Migrate
from models import Article,User,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)


@app.route("/otm")
def one_to_many():
    article1 = Article(title="111",content="xxx")
    article2 = Article(title="222", content="yyy")
    user = User(username="zhiliao")
    article1.author = user
    article2.author = user
    db.session.add(article1,article2)
    db.session.commit()

    print(user.articles)
    return "one to many数据操作成功"


@app.route("/oto")
def one_to_one():
    user = User(username="zhiliao")
    extension = UserExtension(school="清华大学")
    user.extension = extension
    db.session.add(user)
    db.session.commit()
    return "one to one"


@app.route("/article")
def article_view():
    # 1. 添加数据
    # insert table article values(xx)
    # article = Article(title="钢铁是怎样炼成的",content="xxx")
    # db.session.add(article)
    # # 做一个提交操作
    # db.session.commit()

    # 2. 查询数据
    # filter_by:返回一个类列表的对象
    # article = Article.query.filter_by(id=1)[0]
    # print(article.title)

    # 3. 修改数据
    # article = Article.query.filter_by(id=1)[0]
    # article.content = "yyy"
    # db.session.commit()

    # 4. 删除数据
    Article.query.filter_by(id=1).delete()
    db.session.commit()
    return "数据操作成功"


@app.route('/')
def hello_world():
    # 写一个测试代码来验证是否连接成功
    engine = db.get_engine()
    with engine.connect() as conn:
        result = conn.execute("select 1")
        print(result.fetchone())
    return 'Hello World!'


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

然后进行以下3个命令即可完成迁移操作了。

flask db init
flask db migrate
flask db upgrade
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值