Flask框架学习笔记—模型Model

文章目录

          • 概述
            • 1. ORM
            • 2. 原生SQL和ORM比较
          • Flask的ORM
            • 1. flask-sqlalchemy
            • 2. 连接数据库
            • 3. 在Flask中使用ORM
          • 数据迁移
          • 模型
            • 1. 字段类型
            • 2. 常用约束
            • 3. 创建模型

概述

Flask默认并没有提供任何数据库操作的API,我们可以选择任何适合自己项目的数据库来使用

Flask中可以自己的选择用原生语句实现功能,也可以选择ORM(SQLAlchemy,MongoEngine)

1. ORM

Flask通过Model操作数据库,不管你数据库的类型是MySql或者Sqlite,Flask自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Flask帮我们自动完成。只要会写Model就可以了

Flask使用对象关系映射(Object Relational Mapping,简称ORM)框架去操控数据库

ORM(Object Relational Mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换

2. 原生SQL和ORM比较

原生SQL缺点:

  1. 代码利用率低,条件复杂代码语句越长,有很多相似语句
  2. 一些SQL是在业务逻辑中拼出来的,修改需要了解业务逻辑
  3. 直接写SQL容易忽视SQL问题

ORM优点:

  1. 易用性,可以有效减少重复SQL
  2. 性能损耗少
  3. 设计灵活,可以轻松实现复杂查询
  4. 移植性好
Flask的ORM
1. flask-sqlalchemy

Flask使用Python自带的ORM:SQLAlchemy

针对于Flask的支持,安装插件flask-sqlalchemy

pip install flask-sqlalchemy
2. 连接数据库

(1) 连接SQLite

DB_URL = 'sqlite:///sqlite3.db'
# 使用的是相对路径
# SQLite数据库连接不需要额外驱动,也不需要用户名和密码

(2) 连接MySQL

# 第一种方法
DB_URL = 'mysql+pymysql://root:[email protected]:3306/flaskdb'
# 第二种方法
USERNAME = 'root'
PASSWORD = 'root'
HOSTNAME = '127.0.0.1'
PORT = 3306
DATABASE = 'flaskdb'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(
  USERNAME,
  PASSWORD,
  HOSTNAME,
  PORT,
  DATABASE)
3. 在Flask中使用ORM

连接数据库需要指定配置

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

DB_URL = 'sqlite:///sqlite3.db'

app = Flask(__name__)
# 配置连接数据库路径DB_URL
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
# 禁止对象追踪修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 初始化
db = SQLAlchemy()
db.init_app(app)

if __name__ == '__main__':
    app.run()
数据迁移

数据迁移需要用到插件flask-migrate

(1) 安装

pip install flask-migrate

(2) 初始化

from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, MigrateCommand

DB_URL = 'sqlite:///sqlite3.db'

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy()
db.init_app(app)
# 使用app和db进行migrate对象初始化
migrate = Migrate()
migrate.init_app(app=app, db=db)
# 在manager上添加迁移指令
manager = Manager(app)
manager.add_command('db', MigrateCommand)

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

(3) 在命令行中使用

# manage.py:将app.py文件名改为manage.py
# db:添加命令时给定的名称
python manage.py db init		# 只调用一次,生成migrations文件夹
python manage.py db migrate		# 生成迁移文件
python manage.py db upgrade		# 执行迁移中的升级
python manage.py db downgrade  	# 执行迁移中的降级
模型
1. 字段类型
类型名 Python类型 说 明
Integer int 普通整数, 一般是32位
SmallInteger int 取值范围小的整数,一般是16位
BigInteger int 或 long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 定点数
String str 变长字符串
Text str 长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长 Unicode 字符串
UnicodeText unicode 变长 Unicode 字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
Interval datetime.timedelta 时间间隔
LargeBinary str 二进制文件
2. 常用约束
选项名 说 明
primary_key 如果设为 True ,这列就是表的主键
unique 如果设为 True ,这列不允许出现重复的值
index 如果设为 True ,为这列创建索引,提升查询效率
nullable 如果设为 True ,这列允许使用空值;如果设为 False ,这列不允许使用空值
default 为这列定义默认值
autoincrement 自增
3. 创建模型
class User(db.Model):
    # 表名
    __tablename__ = 'user'
    # 主键(id)不会自动创建,需手动创建
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20), unique=True)
    age = db.Column(db.Integer, default=1)

你可能感兴趣的:(Flask)