1.分类
关系型数据库:MySQL、Oracle、SQLite、…
非关系型数据库:MongoDB、Redis、…
2.选择
数据库没有好坏,要根据项目需求进行选择:盲目的评价或跟风只能证明不够
1.说明
提供了大多数关系型数据库的支持,而且提供了ORM(对象关系映射)
2.安装
pip install flask-sqlalchemy
3.连接配置
指定数据库地址
MySQL:mysql://username:password@host/database
SQLite:
windows:sqlite:///c:/path/to/database
linux:sqlite:////c:/path/to/database
配置选项:
SQLACHEMY_DATABASE_URI
4.使用:
from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
manager = Manager(app)
# 配置数据库连接地址
import os
# 当前路径
base_dir = os.path.abspath(os.path.dirname(__file__))
# 连接地址
database_uri = 'sqlite:///' + os.path.join(base_dir, 'data.sqlite')
app.config['SQLALCHEMY_DATABASE_URL'] = database_uri
# 创建对象
db = SQLAlchemy(app)
5.添加数据模型
# 继承自特定的基类
# 定义模型类
class User(db.Model):
# 不指定表明,默认会将大驼峰转换为小写+下划线风格
# 如:类名为UserModel =》user_model
# 指定表名
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32), unique=True)
email = db.Column(db.String(64), unique=True)
6.创建表、删除表
# 创建表,若是sqlite没有数据库时会自动创建,若是MySQL会报错
@app.route('/')
def index():
# 删除表
db.drop_all()
# 创建表
db.create_all()
return 'Nice day!'
7.添加命令行删除表和创建表
from flask_script import prompt_bool
# 创建表python model.py createall
@manager.command
def createall():
db.drop_all()
db.create_all()
return '数据表已创建'
# 删除表python model.py dropall
@manager.command
def dropall():
if prompt_bool('确定要删库跑路吗?'):
db.drop_all()
return '数据表已删除'
return '还是在考虑一下吧'
创建表:python model.py createall
删除表:python model.py dropall
8.自定义终端shell命令
原因是:系统默认有一个shell命令,启动后可以进行终端测试,但是没有导入任何数据,因此需要自己定制。
# 定制shell
def shell_context():
# 返回在shell环境中需要的数据,以字典的形式返回
return dict(db=db, User=User)
manager.add_command('shell',Shell(make_context=shell_context))
1.增加数据
# 在请求结束后,自动提交数据库操作(执行commit),否则每次都要手动commit
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 添加数据
@app.route('/insert/')
def insert():
# 创建数据模型
# zhangsan = User(username='zhangsan',, sex=False,)
# lisi = User(username='lisi',, sex=False,)
# mazi = User(username='mazi',, sex=False,)
xjt = User(username='xjt',, sex=False,)
# 添加到会话中
db.session.add(xjt)
# 添加多个
# db.session.add_all([zhangsan, lisi, mazi])
# 提交
db.session.commit() # 如果设置了SQLALCHEMY_COMMIT_ON_TEARDOWN就不用手动commit了
return '已经添加'
2.查询数据
# 根据主键查询数据
@app.route('/select/<uid>')
def select(uid):
# 根据主键进行查询,如果有,返回User对象,没有None
u = User.query.get(uid)
if u:
return u.username
return '查无此人'
3.更新数据
# 修改(更新)数据
@app.route('/update/<uid>')
def update(uid):
u = User.query.get(uid)
if u:
u.username = u.username + 'Copy'
# 更新没有单独的函数,当添加的对象有id时被认为时更新操作
db.session.add(u)
# db.session.commit()
return '修改完成'
return '查无此人'
4.删除数据
# 删除数据
@app.route('/delete/<uid>')
def delete(uid):
u = User.query.get(uid)
if u:
db.session.delete(u)
return '删除成功'
return '查无此人'
真是的项目很少用到物理删除(彻底从磁盘删掉),大多数都是使用逻辑删除(打标记)
5.各种查询
# 各种查询
@app.route('/selectby/')
def select_by():
# 根据主键进行查询
# u = User.query.get(2)
# return u.username
# 查询所有满足条件的
# users = User.query.all()
# return ','.join([u.username for u in users])
# 指定过滤条件(只能是等值条件)
# u = User.query.filter_by(username='Dandan').first()
# return u.username
# 指定过滤条件(可以是等值条件)
# u = User.query.filter(User.id > 2).first()
# u = User.query.filter(User.id == 2).first()
# return u.username
# 有就返回,没有报404
# u = User.query.get_or_404(8)
# u = User.query.filter(User.id > 8).first_or_404()
# return u.username
# 数据统计
total = User.query.count()
return str(total)
自行测试:limit, offset, order_by, paginate
1.常见的字段类型
2.常见选项
3.总结
1.插入数据时,可以不传值的情况:自增的主键、有默认值、可以为空
2.flask-sqlalchemy:要求每个模型都有一个主键,通常为id
1.说明
当数据模型更改时,需要将更改应用到数据库,这个过程叫数据库迁移。
直接删除,然后再创建太过于简单粗暴,副作用大(原来的数据全部丢失)
更好的解决方案是:既能将修改应用到数据库,又不删除原来的数据,若自己不会,可以采用flask-migrate扩展库.
2.安装
pip install flask-migrate
3.配置
from flask_migrate import Migrate, MigrateCommand
# 创建对象
migrate = Migrate(app, db)
# 添加终端命令
manager.add_command('db', MigrateCommand)
4.使用
1.初始化数据库迁移的仓库,执行一次就行了
python manage.py db init
2.创建迁移脚本,会根据数据模型与数据库的表的差异生成sql语句
python manage.py db migrate
3.执行迁移,就是执行上面生成的sql语句
python manage.py upgrade
4.以后再迁移,只需2、3两步即可