Flask与数据库操作的整合(Flask-sqlalchemy、Flask-Migrate[数据库迁移]、Flask-Script)

一、Python数据库连接方式

python中的数据库连接方式有两种:

  • Python标准数据库接口,使用SQL域居正常操作数据库,eg:MySQL关系型数据库的pymysql模块
  • 用ORM来进行数据库连接,python中使用sqlalchemy,flask中典型的flask_sqlalchemy,已面向对象的方式进行数据库的连接和操作
  • ORM是什么?有什么优势?
    ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需要简单的操作对象的属性和方法
    在这里插入图片描述

什么是Flask_SQLAlchemy?

  Flask-SQLAlchemy 是一个 Flask 扩展,简化了在 Flask 程序中使用SQLAlchemy 的操作。SQLAlchemy 是一个很强大的关系型数据库框架,支持多种数据库后台。 SQLAlchemy 提供了高层 ORM ,也提供了使用数据库原生 SQL 的低层功能。

如何配置数据库?

安装第三方模块

pip install flask-sqlalchemy

数据库配置

官方配置信息网址

# app.py文件
from flask_sqlalchemy import SQLAlchemy
# 获取当前绝对路径
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
# SQLALCHEMY_DATABASE_URI: 用于连接数据的数据库。
app.config['SQLALCHEMY_DATABASE_URI'] =
           'sqlite:///' + os.path.join(basedir, 'data.sqlite')   
# sqlchemy将会追踪对象的修改并且发送信号
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 每次请求结束之后都会提交数据库的变动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 数据库与app项目关联, 返回SQLAlchemy实例对象,后面可以使用对象调用数据
db = SQLAlchemy(app)
  • 流行的数据库引擎采用的数据库URL格式
    在这里插入图片描述
  • 连接mysql数据库的报错解决
import pymysql
pymysql.install_as_MySQLdb()

定义模型

  • 模型(Model)这个术语表是程序使用的持久化实体
  • 模型列类型
  • 模型列属性
class Role(db.Model):
   # __tablename__类变量定义数据库中表的名称。不指定默认为模型名称。
   # Flask-SQLAlchemy需要给所有的模型定义主键列,通常命名为id。
   id = db.Column(db.Integer, primary_key=True)
   name = db.Column(db.String(64), unique=True)
   # repr()显示一个可读字符串,用于调试和测试
   def __repr__(self):
       return '<Role %r>' % self.name
class User(db.Model):
   __tablename__ = 'users'
   id = db.Column(db.Integer, primary_key=True)
   username = db.Column(db.String(64), unique=True, index=True)
   def __repr__(self):
       return '<User %r>' % self.username

模型列类型

在这里插入图片描述

模型列属性

选项名 说明
primary_key 如果设为True,这列就是表的主键
unique 如果设为True,这列不允许出现重复的值
index 如果设为True,为这列创建索引,提升查询效率
nullable 如果设为True,这列允许使用空值;如果设为False,这列不允许使用空值
default 为这列设置默认值

数据查询

  • 查询过滤器
过滤器 说明
filter( ) 把过滤器添加到原查询,返回新查询
filter_by( ) 把等值过滤器添加到原查询,返回新查询
limit( ) 使用指定值限制原查询返回的结果数量,返回新查询
offset( ) 偏移原查询返回的结果,返回新查询
order_by( ) 排序返回结果,返回新查询
groupby() 原查询分组,返回新查询
  • 查询执行函数
方法 说明
all( ) 以列表形式返回结果
first() 返回第一个结果,如果没有返回None
first_or_404( ) 返回第一个结果,如果没有抛出404异常
get( ) 返回主键对应记录,没有则返回None
get_or_404( ) 返回主键对应记录,如果没有抛出404异常
count( ) 返回查询结果数量
paginate( ) 返回paginate对象,此对象用于分页

分页实现

  • 分页对象拥有的属性
属性 说明
items 当前页面中的记录
query 分页的源查询
page 当前页数
prev_num 上一页的页数
next_num 下一页的页数
has_next 如果存在下一页,返回True
has_prev 如果有上一页,返回True
pages 查询得到的总页数
per_page 每页显示的记录总数
total 查询返回的记录总数
  • 分页对象拥有的方法
方法 说明
iter_pages(left_edge=2,left_current=2,right_current=5,right_edge=2) 一个迭行代器,返回一个在分页导航栏中显示的页数列表。这个列表的最左边显示left_edge页,当前页的左边显示left_current页,当前页的右边显示right_current页,最右边显示right_edge页。例如:在一个100页的列表中,当前页为第50页,使用默认配置,这个方法会返回以下页数:1、2、None、48、49、50、51、52、53、54、55、None、99、100。None表示页数之间的间隔
prev( ) 上一页的分页对象
next( ) 下一页的分页对象

数据库关系

数据库实体间有三种对应关系:一对一,一对多,多对多。

一对一关系

一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。
在这里插入图片描述

模型定义与基本操作
# one_to_one.py文件

from app import db

class People(db.Model):
    __tablename__ = 'peoples'
    id = db.Column(db.Integer,autoincrement=True,primary_key=True)
    name = db.Column(db.String(15),unique=True)
    age = db.Column(db.Integer,default=18)
    # gender = db.Column(db.String(10))
    """
    关系使用:relationship()函数表示;
            'Card':People类对应的表与Card类对应的表关联;
            backref='people':反向引用,在Card类中添加新属性people;
            userlist=False:默认为True,如果为False代表一对一关系;
            
    """
    # 公民表和身份证表关联起来了,uselist=False代表一个对象不对应一个列表,所以是一对一关系
    # backref = 'people'给Card
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值