Flask基础-(数据库操作)

1.mysql数据库的连接和配置
a.导库:
import pymysql
from flask_sqlalchemy import SQLAlchemy

b.
# 创建程序实例
app = Flask(__name__)

# 数据库配置:数据库地址/关闭自动跟踪修改
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://Juliet:123456@127.0.0.1/flask_books'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 设置secret_key
app.secret_key = 'dev'
# 创建数据库对象
pymysql.install_as_MySQLdb()
db = SQLAlchemy(app)
复制代码
2.自定义模型类
 定义书和作者模型
class Author(db.Model):
    '''作者模型'''
    __tablename__ = 'authors'

    # 字段
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(16),unique=True)

    # 关系引用
    # books是给自己(Author模型)用的,author是给Book模型用的
    books = db.relationship('Book',backref='author')

    def __repr__(self):
        return 'Author:%s'% self.name

class Book(db.Model):
    '''书籍模型'''
    __tablename__ = 'books'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    author_id = db.Column(db.Integer,db.ForeignKey('authors.id'))

    def __repr__(self):
        return 'Book:%s'% self.name
复制代码
3.删除表和创建表
 db.drop_all()
 db.create_all()
复制代码
4.数据库的基本操作
a.在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理,用db.session表示
b.在准备把数据写入数据库前,要先将数据添加到会话中然后调用commit()方法提交会话
c.提交操作把会话对象全部写入数据库,如果写入过程发生错误,整个会话都会失效,据库会话也可以回滚,
  通过db.session.rollback()方法,实现会话提交数据前的状态
d.在Flask-SQLAlchemy中,查询操作是通过query对象操作数据。最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询
复制代码

5.数据库迁移

在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。

参考:juejin.im/post/5cc7fb…

导包:需要安装Flask-Script和flask-migrate

配置:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

pymysql.install_as_MySQLdb()
app = Flask(__name__)

# 通过脚本管理flask程序
manager = Manager(app)

# 设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/db_flask'

# 设置每次请求结束后会自动提交数据库中的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

# 数据库和模型类同步修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

# 查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True

db = SQLAlchemy(app)

# 创建数据库迁移对象
Migrate(app, db)

# 向脚步管理添加数据库迁移命令 db指命令的别名
manager.add_command('db', MigrateCommand)


# 类型
class Type(db.Model):
    # 表名
    __tablename__ = 'tbl_types'

    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    name = db.Column(db.String(32), unique=True)  # 名字

    # 数据库中不存在的字段,只是为了查找和反向查找。
    # backref:在关系的另一模型中添加反向引用
    heros = db.relationship("Hero", backref='type')

    def __repr__(self):
        return self.name


# 英雄
class Hero(db.Model):
    # 表名
    __tablename__ = 'tbl_heros'
    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    name = db.Column(db.String(64), unique=True)  # 名字
    gender = db.Column(db.String(64))  # 性别

    # 外键 一个射手对应很多英雄
    type_id = db.Column(db.Integer, db.ForeignKey("tbl_types.id"))

    def __repr__(self):
        return self.name


if __name__ == '__main__':
    # 0.0.0.0代表任何能代表这台机器的地址都可以访问
    # app.run(host='0.0.0.0', port=5000)  # 运行程序
    manager.run()

首先我们通过命令创建出migrations文件夹,后面所有的迁移文件都会放在这个文件夹里面

python flask_migrate_db.py db init

下面这条命令跟我们Django里面的makemigrations一样,是生成迁移文件的作用。因为我们的模型类并没有添加或删除字段,所有第一次会出现没有改变的提示。 -m:给迁移文件加上注释

python flask_migrate_db.py db migrate -m 'first create'

添加新字段 我们在英雄里面添加一个年龄字段,再迁移一下:
python flask_migrate_db.py db migrate -m 'add age' 
生成迁移文件,这个时候数据库并没有改变,我们还要用upgrade命令同步到数据库中:
python flask_migrate_db.py db upgrade

age字段已经添加到数据库当中了。

回退:
回退数据库时,需要指定回退版本号,由于版本号是随机字符串,为避免出错,建议先使用python flask_migrate_db.py db history命令查看历史版本的具体版本号,然后复制具体版本号执行回退。

回退到原始版本:
python flask_migrate_db.py db downgrade base
回退到指定版本:
python flask_migrate_db.py db downgrade 4cee71e47df3
复制代码
6.邮件扩展

from flask import Flask
from flask_mail import Mail,Message

app = Flask(__name__)

#配置邮件:服务器/端口/传输层安全协议/邮箱名/密码
app.config.update(
    DEBUG = True,
    MAIL_SERVER='smtp.qq.com',
    MAIL_PROT=465,
    MAIL_USE_TLS = True,
    MAIL_USERNAME = '876972931@qq.com',
    MAIL_PASSWORD = 'mkdggikrxfxkbcee',  # 邮箱的SMTP授权码
)

mail = Mail(app)

@app.route('/')
def index():
    # sender 发送方,recipients 接收方列表
    msg = Message("This is a test message!",sender="876972931@qq.com",recipients=['876972931@qq.com','837053035@qq.com'])
    # 邮件内容
    msg.body = "Flask Test Mail"
    mail.send(msg)
    print("Mail Sent!")
    return "Sent Success!!"

if __name__ == '__main__':
    app.run()
复制代码
7.数据库模型关系

a.一对一模型 案例:一篇文章只对应一个内容

# 文章模型
class Article(db.Model):
    # 表名
    __tablename__ = 'tbl_article'

    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    title = db.Column(db.String(128), unique=True)  # 名字
    
    # 方便查找,数据并不存在的字段
    content = db.relationship('Acontent', backref='article', uselist=False) #一对一需要把uselist设置为False


# 内容模型
class Acontent(db.Model):
    # 表名
    __tablename__ = 'tbl_acontent'

    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    content = db.Column(db.Text(4000))  # 名字
    article_id = db.Column(db.Integer, db.ForeignKey('tbl_article.id'))
复制代码

b.一对多模型 案例:一个分类下有很多文章

# 分类模型
class Category(db.Model):
    # 表名
    __tablename__ = 'tbl_category'

    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    name = db.Column(db.String(32), unique=True)  # 名字
    # 方便查找,数据并不存在的字段
    article = db.relationship('Article', backref='category')


# 文章模型
class Article(db.Model):
    # 表名
    __tablename__ = 'tbl_article'

    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    title = db.Column(db.String(128), unique=True)  # 名字
    category_id = db.Column(db.Integer, db.ForeignKey('tbl_category.id'))  # 分类id
    # 方便查找,数据并不存在的字段
    content = db.relationship('Acontent', backref='article', uselist=False)  # 一对一需要把uselist设置为False
复制代码

c.多对多模型 案例:一个标签对应很多文章,一篇文章也对应很多标签

# 辅助表
tbl_tags = db.Table('tbl_tags',
                db.Column('tag_id', db.Integer, db.ForeignKey('tbl_tag.id')),
                db.Column('article_id', db.Integer, db.ForeignKey('tbl_article.id'))
                )

# 标签模型
class Tag(db.Model):
    # 表名
    __tablename__ = 'tbl_tag'

    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    name = db.Column(db.String(32), unique=True)  # 名字


# 文章模型
class Article(db.Model):
    # 表名
    __tablename__ = 'tbl_article'

    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    title = db.Column(db.String(128), unique=True)  # 名字
    category_id = db.Column(db.Integer, db.ForeignKey('tbl_category.id'))  # 分类id
    # 方便查找,数据并不存在的字段
    content = db.relationship('Acontent', backref='article', uselist=False)  # 一对一需要把uselist设置为False
    tags = db.relationship('Tag', secondary=tbl_tags, backref='articles')
复制代码

d.自关联模型 案例:地区

# 地区模型
class Area(db.Model):
    # 表名
    __tablename__ = "tbl_area"
    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    name = db.Column(db.Text, nullable=False)  # 地区名字
    parent_id = db.Column(db.Integer, db.ForeignKey("tbl_area.id"))  # 父评论id

    # 方便查找,数据并不存在的字段
    parent = db.relationship("Area", remote_side=[id])  # 自关联需要加remote_side
复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值