from flask import Flask
from flask_sqlchemy import SQLAlchemy #操作数据库的扩展包
from flask_script import Manager # 用命令操作的扩展包
app = Flask(__name__)
#创建对象
db = SQLAlchemy(app)
manager = Manager(app)
一、创建和删除数据库
db.create_all() #创建数据库(表),数据库已经存在时不会再创建
db.drop_all() #删除数据库(表)
#添加命令行的创建数据库命令,通过该装饰器修饰的函数名就是终端命令名
@manger.command
def createall(): #变成了一个终端的命令,在终端中输入python manage.py createall
db.create_all()
#添加命令行删除数据库的命令
@manger.command
def dropall():
if prompt_bool('你确定要删除数据库吗?'):
db.drop_all()
return '数据库已经被删除'
return '删除库之前要考虑清楚'
二、设计数据模型类
class User(db.Model):
#表名:转换为小写+下划线的形式
__tablename__ = 'users' #指定表名
id = db.Column(db.Integer,primary_key = True)#设置主键
username = db.Column(db.String(20),unique=True) #作为唯一键
email = db.Column(db.String(60))
三、数据的增删改查
1.增加数据
#创建数据模型对象
liming = User(username = 'liming',email='liming@163.com')
#添加到数据库
db.session.add(liming)
#提交,进行下面的配置后则可以省略这一步
db.session.commit()
#配置自动提交
app.config['SQLAICHEMY_COMMIT_ON_TEARDOWN'] = True
#添加多条数据
hong = User(username='hong',email='hong@163.com')
qing = User(username='qing',email='qing@163.com')
db.add_all([hong,qing])
2.查询数据
#根据主键查询
#查询到返回一个对象,没有查到返回None
u = User.query.get(uid)
if u:
return u.username
return '查询不到'
各种查询操作
- get:根据主键查询
- all:查询所有数据
- first:查询满足条件的第一条
- limit:限制结果集数量
- offset:设置偏移数量
- get_or_404:功能同get,但是找不到时报404
- first_or_404:功能同first,但是找不到时报404
- order_by:排序,可以指定多字段,asc表示升序,desc表示降序
- paginate:分页查询,项目中讲解
- count:统计总数
- filter:指定查询(过滤)条件
-filter条件
- 关系:
>,__gt__,大于,示例:User.query.filter(User.id>1) 等价于 User.query.filter(User.id.__gt__(1))
>=,__ge__
<,__lt__
<=,__le__
==,__eq__
!=,__ne__
- 范围
between:filter(User.id.between(1,3))
in_: filter(User.id.in_((1,3)))
notin_: filter(User.id.notin_((1,3)))
- 内容
contains:包含指定内容,如:filter(User.username.contain('xiao'))
startswith:以指定内容开头
endswith:以指定内容结尾
like:模糊匹配,如:filter(User.username.like('%abc%'))
notlike:模糊取反
- 逻辑
from sqlalchemy import and_, or_, not_
and_:逻辑与,默认的,
filter(User.id > 2, User.age > 17)
等价于:filter(and_(User.id > 2, User.age > 17))
or_:逻辑或
not_:逻辑非
3.修改数据
#根据主键找到对象
u = User.query.get(uid)
if u:
#修改对应的属性
u.email = 'uu@163.com'
#不存在专门的更新操作,当添加的对象有id时自动识别为更新操作
db.session.add(u)
4.删除数据
u = User.query.get(uid)
if u:
db.session.delete(u)
四、模型设计
常见的字段类型:
类型名 python类型 说明
Integer int 32位
SmallInteger int 16位
BigInterger int 没有限制
Float float 浮点数
String str 变长字符串
Text str 优化后的变长字符串
Boolean bool 布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期时间
Interval datetime.timedelta 时间间隔
常见的字段选项
选项 说明
primary 是否为主键索引,默认为False
unique 是否作为唯一索引,默认为Flaser
index 是否作为普通索引,默认为False
nullable 是否可以为空,默认为True
default 设置默认值
五、数据库的迁移
数据库的迁移:在开发中总是会进行数据模型的更改,在已经有了数据库的前提下,此时数据库模型个数据库中的表格不再一致,
将数据模型的改变对应到数据库中的过程。
安装第三方扩展库:pip install flask-migrate
进行相关配置:from flask_migrate import Migrate,MigrateCommand
#创建迁移对象
migrate = Migrate(app,db)
#在命令行下添加迁移命令
manager.add_command('db',MigrateCommand)
在终端中执行:
python manage.py db init #初始化数据库迁移的仓库操作
python manage.py db migrate #创建迁移脚本
python manage.py db upgrade #执行更新操作
六、mysql更改表和字段的编码方式
1.使用show create table user ;查看表的编码方式
2.使用alter table user default character set utf8;用来更改数据表的编码方式
3.使用alter table user convert to character set utf8;更改字段的编码方式
七、随机选择数据库表中的一条数据
from sqlalchemy.sql.expression import func
gugu = Gegu.query.order_by(func.random()).limit(1).all()#返回的是列表的形式
八、把字符串类型的日期转换成日期形式的日期
datetime.date(*map(int,'2018-11-6'.split('-')))
转换成星期
datetime.date(*map(int,'2018-11-6'.split('-'))).weekday()#日期是从0开始的
日期减一天
datetime.date(*map(int,'2018-11-6'.split('-')))-datetime.timedelta(days=3)
九、在模型中外键以及关系的建立和使用