1.模型 - Models
- 定义模型
模型:根据数据库中表结构创建出来的类(模型类,实体类)- 语法:
class ModelName(db.model):
__ tablename__ = ‘TableName’
CloumnName = db.column(db.Type,options)- Midelname: 定义模型类的名称,根据表名设定。
- TableName:映射数据库表名
- CloumnName: 属性名,映射到数据路就是列名
- Type:映射到列的数据类型
- Options:列选项
- 语法:
db.type 列类型如下:
类型名 | Python类型 | 说明 |
---|---|---|
Integer | int | 普通整数,32位 |
SmallInteger | int | 小范围证书,16位 |
BigInteger | int Or Long | 不限精度整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 定点数 |
String | str | 字符串 |
text | str | 字符串 |
Boolean | bool | 布尔值 |
Date | datatime.Date | 日期 |
Time | datatime.time | 时间 |
DateTime | datetime.datetime | 日期时间 |
Options 列选项
选项名 | 说明 |
---|---|
autoincrement | 是否设置该列自增长,整数主键默认自增长 |
primary_key | 是否设置该列为主键 |
unique | 是否设置列值唯一 |
index | 是否加索引 |
nullable | 表示该列可为空 |
default | 指定该列的默认值 |
-
注:如果一个列中要包含多个列选项使用都好隔开,列选项与列类型之间使用,隔开。
- db.create_all()
作用:
将所有的实体类都创建到数据库上
注意:
只有类不存在才会创建,存在则忽略 - db.drop_all()
作用:
将所有数据表全部删除
- db.create_all()
2.数据迁移
- 模型类的映射管理
- 什么是映射管理
对模型类/实体类的修改允许再映射回数据库 - 依托于第三方库完成管理
包:flask-script
类:manager
作用:对项目进行管理
包:flask-migrate
类:
1. Migrate:
作用:用户管理app 和db之间协调关系
2. MigrateCommand
作用:允许终端中提供实体类的命令 - 实现数据库的迁移
- python3 03.run01.py db init
作用:做一些初始化的行为操作
特点:一个项目中执行一次就够了 - python3 run01.py db migrate
作用:将编写好的实体类生成中间文件
特点:只要检测到实体类有修改,就会生成中间件文件 - python3 run01.py db upgrade
作用:将中间文件映射回 数据库
- python3 03.run01.py db init
- 什么是映射管理
- ORM中的CRUD
- 增加 - C(Create)
- 创建实体对象,并为属性赋值
user = User()
user.uname = ‘xiaokele’
user.age = 6 - 将实体对象增加回数据库
db.sesion.add(实体对象)
# 针对非查询操作,必须手动提交回数据库
db.session.commit() - 配置操作自动提交
针对所有非查询操作
配置成功后,会在执行万试图之后,整体行为提交回数据库、
app.config[‘SQLALCHEMY_COMMIT_ON_TEAROWN’] = True
- 创建实体对象,并为属性赋值
- 查询 - R(Retrieve)
- 基于Session.querry() 进行查询
- db.session.query()
该函数会返回一个Query对象类型为BaseQuery该返回值中会包含针对某一个实体或实体中的所有查询操作
语法:
1. db.session.query(实体类)
查询对应实体所有列的数据
2. db.session.query(实体类.属性一)
查询对应实体类中部分列的数据 - 查询执行函数:
db.session.query().查询执行函数
all() 以列表形式返回query()中所有数据
first() 以实体对象返回第一条数据
first_or_404() 效果同上
- db.session.query()
- 基于Session.querry() 进行查询
- 增加 - C(Create)
from flask import Flaskfrom
flask_sqlalchemy import SQLAlchemyfrom
flask_script import Managerfrom
flask_migrate import Migrate,MigrateCommand
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+pymysql://root:123456@localhost:3306/flask05'
# 配置app启动模式为调试模式
app.config['DEBUG'] = True
# 关闭信号追踪
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 配置自动提交
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app)
# 创建manager对象制定管理对象
manager = Manager(app)
# 创建Migrate对象 并制定药罐练得app和dbmigrate = Migrate(app,db)
# 为Manager增加命令允许数据迁移
manager.add_command('db',MigrateCommand)
# 创建实体类class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True)
uname = db.Column(db.String(30))
uage = db.Column(db.Integer)
umail = db.Column(db.String(200))
def __repr__(self):
return '<user:%r>'%self.uname
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/01-add')
def addUser():
user = User()
user.uname = 'xiaoxuebi'
user.uage = 8
user.umail = '123123@qq.com'
db.session.add(user)
# db.session.commit()
return '数据提交成功!'
@app.route('/02-query')def query_views():
# 测试db.session
#query = db.session.query(User)
# 测试查询执行函数
# query = db.session.query(User).all()
# for x in query:
# print('id:%d,uname:%s,uage:%d,umail:%s'%(x.id,x.uname,x.uage,x.umail))
# return '<script>alert("查询成功")</script>'
x = db.session.query(User).first()
print('id:%d,uname:%s,uage:%d,umail:%s'%(x.id,x.uname,x.uage,x.umail))
return '<script>alert("查询成功")</script>'
if __name__ == '__main__':
# 通过manager管理启动程序
manager.run()