Flask学习5:模型

来源:转载

数据模型

数据库回顾

1.分类

​ 关系型数据库:MySQL、Oracle、SQLite、…

​ 非关系型数据库:MongoDB、Redis、…

2.选择

​ 数据库没有好坏,要根据项目需求进行选择:盲目的评价或跟风只能证明不够

flask-sqlalchemy

1.说明

​ 提供了大多数关系型数据库的支持,而且提供了ORM(对象关系映射)

2.安装

pip install flask-sqlalchemy

3.连接配置

​ 指定数据库地址

MySQL:mysql://username:[email protected]/databaseSQLite: windows:sqlite:///c:/path/to/database linux:sqlite:////c:/path/to/database配置选项: SQLACHEMY_DATABASE_URI

4.使用:

from flask import Flaskfrom flask_script import Managerfrom flask_sqlalchemy import SQLAlchemyapp = 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 [email protected] createall(): db.drop_all() db.create_all() return '数据表已创建'# 删除表python model.py [email protected] dropall(): if prompt_bool('确定要删库跑路吗?'): db.drop_all() return '数据表已删除' return '还是在考虑一下吧'

创建表:python model.py createall

删除表:python model.py dropall

8.自定义终端shell命令

​ 原因是:系统默认有一个shell命令,启动后可以进行终端测试,但是没有导入任何数据,因此需要自己定制。

# 定制shelldef shell_context(): # 返回在shell环境中需要的数据,以字典的形式返回 return dict(db=db, User=User)manager.add_command('shell',Shell(make_context=shell_context))

数据的CURD操作

1.增加数据

# 在请求结束后,自动提交数据库操作(执行commit),否则每次都要手动commitapp.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True# 添加数据@app.route('/insert/')def insert(): # 创建数据模型 # zhangsan = User(username='zhangsan', password='12345', sex=False, email='[email protected]') # lisi = User(username='lisi', password='12345', sex=False, email='[email protected]') # mazi = User(username='mazi', password='12345', sex=False, email='[email protected]') xjt = User(username='xjt', password='12345', sex=False, email='[email protected]') # 添加到会话中 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.常见的字段类型

Integer int 32位 SmallInteger int 16位 BigInteger int/long 不受限制的整数 Float float 浮点数 String str 变长字符串 Text str 变长字符串,做了优化 Boolean bool 布尔值 Date datetime.date 日期 Time datetime.time 时间 DateTime datetime.datetime 日期时间 Interval datetime.timedelta 时间间隔
字段类型 Python类型 说明

2.常见选项

primary_key 是否作为主键索引,默认为False unique 是否作为唯一索引,默认为False index 是否作为普通索引,默认为False nullable 是否可以为空,默认为True default 设置默认值
选项 说明

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 init2.创建迁移脚本,会根据数据模型与数据库的表的差异生成sql语句 python manage.py db migrate3.执行迁移,就是执行上面生成的sql语句 python manage.py upgrade4.以后再迁移,只需2、3两步即可

说明:并不一定每次迁移都会成功,若有冲突或操作失败,需要手动解决

分享给朋友:
您可能感兴趣的文章:
随机阅读: