黑马程序员技术交流社区

标题: 【广州python】Flask数据库基本操作-SQLAlchemy [打印本页]

作者: 杰哥,我就服你    时间: 2018-11-29 13:15
标题: 【广州python】Flask数据库基本操作-SQLAlchemy
Flask数据库
D:使用扩展包flask-sqlalchemy来操作数据库(增删改查)
E:通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
U:常用的SQLAlchemy字段类型
类型名
python中类型
说明
Integer
int
普通整数,一般是32位
SmallInteger
int
取值范围小的整数,一般是16位
BigInteger
int或long
不限制精度的整数
Float
float
浮点数
Numeric
decimal.Decimal
普通整数,一般是32位
String
str
变长字符串
Text
str
变长字符串,对较长或不限长度的字符串做了优化
Unicode
unicode
变长Unicode字符串
UnicodeText
unicode
变长Unicode字符串,对较长或不限长度的字符串做了优化
Boolean
bool
布尔值
Date
datetime.date
时间
Time
datetime.datetime
日期和时间
LargeBinary
str
二进制文件

常用的SQLAlchemy列选项
选项名
说明
primary_key
如果为True,代表表的主键
unique
如果为True,代表这列不允许出现重复的值
index
如果为True,为这列创建索引,提高查询效率
nullable
如果为True,允许有空值,如果为False,不允许有空值
default
为这列定义默认值

常用的SQLAlchemy关系选项
选项名
说明
backref
在关系的另一模型中添加反向引用
primary join
明确指定两个模型之间使用的联结条件
uselist
如果为False,不使用列表,而使用标量值
order_by
指定关系中记录的排序方式
secondary
指定多对多中记录的排序方式
secondary join
在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件

①安装扩展包及导包
安装flask-sqlalchemy:pip install flask-sqlalchemy
如果连接的是mysql数据,需安装mysqldb:pip install flask-sqlalchemy
导包:from flask_sqlalchemy import SQLAlchemy
②配置相关数据库的设置
#数据库信息设置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/数据库名'
# 动态追踪修改设置,如未设置只会提示警告,极大影响mysql性能app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
③创建连接数据库的对象
db = SQLAlchemy(app)
④定义模型类,继承db.Model
定义数据库的表名: __tablename__   
设置字段: 字段=db.Column(db.字段类型,字段选项)   
     例如:id = db.Column(db.Integer, primary_key=True)
      name = db.Column(db.String(64), unique=True)
设置关联属性: books = db.relationship('Book', backref='author', lazy='dynamic')
给该模型类添加一个属性,第一个参数为多类类名,通过这个属性可以查询一对多所有对象
第二个参数backref =’该类类名小写‘,是反向给多类申明一个新属性
第三个参数指定是lazy属性,即何时加载数据,dynamic指的是在访问属性的时候,并没有在内存中加载数据,而是返回一个query对象, 需要执行相应方法才可以获取对象,比如.all()
⑤无迁移式的建表和删表
db.drop_all() 删除该数据库所有的表             db.create_all() 在该数据库下创建所有模型类映射的表

增删改查
增:①创建对象:  b =Book(name='图书')
       ②把数据添加到用户会话:db.session.add(b)      
    如果多个对象,使用db.session.add_all([b1,b2,b3])
③提交用户会话到数据库:  db.session.commit()
删:第一种方式:
①查出该对象:     b=Book.query.get(1)
②从用户会话删除该对对象:    db.session.delete(b)
③提交用户会话:  db.session.commit()
第二种方式:
①查出对象直接删除:  Book.query.get(1).delete()
②提交用户会话:  db.session.commit()
改:①查出该对象:      b=Book.query.get(1)
②修改对象属性:  b.name='小说'
③提交用户会话:  db.session.commit()
查:①无条件查询:Book.query.查询执行器
②条件查询:Book.query.过滤器.查询执行器
常用过滤器如下:
过滤器
说明
示例
filter(条件)
返回符合该条件的查询集,BaseQuery对象
Book.query.filter(Book.id==1)
filter_by()
返回符合该等值条件的查询集
Book.query.filter_by(id=1)
limit
使用指定的值限定原查询返回的结果
offset()
偏移原查询返回的结果,返回一个新查询集
order_by()
根据字段进行排序,默认是正序,返回新查询集,desc可以反序
Book.query.order_by(Book.id)
Book.query.order_by(Book.id.desc)
group_by()
根据字段进行分组,返回新查询集合

常用查询执行器如下:
方法
说明
示例
all()
以列表形式返回查询的所有结果
Book.query.filter(Book.id==1).all()
first()
返回查询的第一个结果,如果未查到,返回None
Book.query.filter(Book.id==1).first()
first_or_404()
返回查询的第一个结果,如果未查到,返回404
get()
返回指定主键对应的行,如不存在,返回None
Book.query.get(1)
get_or_404()
返回指定主键对应的行,如不存在,返回404
count()
返回查询结果的数量
Book.query.count()
paginate()
返回一个Paginate对象,它包含指定范围内的结果,参数一:第几页,参数二:每页个数,参数3:如果没有该页数返回False
Book.query.paginate(2,3,False)


逻辑非,逻辑与,逻辑或
from sqlalchemy import not_,and_,or_
示例:User.query.filter(not_(User.name=='chen')).all()
              User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()

一对多,多对一关联查询
一对多:①先查询出一类对象,例如author=Author.query.get(1)
②根据我们设置的relationship属性获取这一类对象下的全部多类对象:
books=author.books                  (即该作者下全部书籍)
多对一:①查询出多类对象,例如book=Book.query.get(2)
②根据我们设置的backref反向设置的属性获取该多类对象对应的一类对象:
author =book.author                 (即这本书所属的作者)


flask数据库迁移
D:在数据库中建立模型类映射的数据库表,如果需要修改数据库模型,还要在修改之后更新数据库,最好的解决的方法使用数据库迁移框架Flask-Migrate
E:建立相关数据库表,而且追踪数据库模式的变化,然后把变动应用到数据库中,还可以回退版本。
U:迁移步骤:
①安装扩展包:迁移扩展包:pip install flask-migrate,脚本管理器包:pip install flask-script
②导包:from flask_migrate import Migrate,MigrateCommand                      from flask_script import Shell,Manager
③创建脚本管理器:manager= Manager(app)
④迁移关联应用和数据库:Migrate(app,db)
⑤添加迁移命令道脚本管理器:manager.add_command('db',MigrateCommand)
⑥使用脚本命令在命令行进行迁移操作:
创建迁移文件夹
python xxx.py db init
生成当前版本迁移文件
python xxx.py db migrate -m '版本说明'
执行当前本迁移文件
python xxx.py db upgrade
回退一个迁移版本
python xxx.py db downgrade
查看迁移历史记录
python xxx.py db history
向上迁移到指定版本
python xxx.py db upgrade 版本号
向下迁移到指定版本
python xxx.py db downgrade 版本号
查看当前迁移版本
python xxx.py db current








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2