首页 > 数据库技术 > 详细

Flask:数据库管理

时间:2021-02-17 23:57:34      阅读:33      评论:0      收藏:0      [点我收藏+]
技术分享图片

为什么不使用SQL语句,而使用ORM框架管理数据库?首先,在python程序中嵌入原生SQL语句,不方便维护,ORM框架使用面向对象思想,使用较方便;第二,如果更换底层数据库引擎,ORM框架不需要修改代码。ORM框架也有其弊端,如有一定的性能损耗,且高级查询编写复杂,有一定的学习成本。


配置数据库链接

Flask-SQLAlchemy 中,数据库使用 URL 指定。一般开发环境使用SQLite,生产环境使用MySQL,使用MySQL时,还需要再安装相应的依赖包。

几种最流行的数据库引擎使用的 URL 格式:

数据库引擎 URL
MySQL mysql://username:password@hostname/database
SQLite(Linux,macOS) sqlite:////absolute/path/to/database
SQLite(Windows) sqlite:///c:/absolute/path/to/database

配置数据库:
app.config[‘SQLALCHEMY_DATABASE_URI‘] =‘sqlite:///‘ + os.path.join(basedir, ‘data.sqlite‘)
app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = False
db = SQLAlchemy(app)

# SQLALCHEMY_TRACK_MODIFICATIONS 参数决定是否追踪对象的修改,SQLAlchemy建议配置此变量,不然会有警告。

定义模型

技术分享图片

模型这个术语表示应用使用的持久化实体。在ORM中,模型一般是一个表示数据表的类,类的实例对应一条记录,类中的属性对应于数据库表中的列。

所以模型定义,类似原生SQL的CREATE TABLE语句:

class Role(db.Model):
    # 定义表名
    __tablename__ = ‘roles‘

    # 定义字段
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    def __repr__(self):
        return ‘<Role %r>‘ % self.name

常用列类型与列选项:https://www.cnblogs.com/adamans/articles/9815040.html


关系

关系数据库的表和表之间需要建立“一对多”,“多对一”和“一对一”的关系,这样才能够按照应用程序的逻辑来组织和存储数据。在关系数据库中,关系是通过主键和外键来维护。


一对多


技术分享图片
class Role(db.Model):
    __tablename__ = ‘roles‘
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    
    users = db.relationship(‘User‘, backref=‘role‘)

class User(db.Model):
    __tablename__ = ‘users‘
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    
    role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id‘))

对于一个 Role 类的实例,其 users 属性将返回与角色相关联的用户组成的列表。

backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系。通过 User 实例的这个属性可以获取对应的 Role 模型对象,而不用再通过 role_id 外键获取。

多数情况下,db.relationship() 都能自行找到关系中的外键,如果无法确定外键,就要为 db.relationship() 提供额外的关系参数。

常用的SQLAlchemy关系选项:https://www.cnblogs.com/xintiao-/p/10376708.html


一对一

一对一关系可以用前面介绍的一对多关系表示,但调用 db.relationship() 时要把 uselist 设为 False


多对多

多对多关系需要用到第三张表,成为关联表或级联表。


数据库操作

对数据库的改动通过数据库会话管理,在 Flask-SQLAlchemy 中,会话由 db.session 表示。数据库会话也可回滚。调用 db.session.rollback() 后,添加到数据库会话中的所有对象都将还原到它们在数据库中的状态

创建表、删除表

db.create_all()
db.drop_all()

CREATE

admin_role = Role(name=‘Admin‘)
db.session.add(admin_role)
db.session.add_all([admin_role, mod_role])
db.session.commit()

UPDATE

admin_role.name = ‘Administrator‘
db.session.add(admin_role)
db.session.commit()

DELETE

db.session.delete(mod_role)
db.session.commit()

READ

<模型类>.query.<过滤方法>.<查询方法>

User.query.all()
User.query.filter_by(role=user_role).all()
Role.query.filter_by(name=‘User‘).first()
# 查看查询API...

文档

sqlalchemy中文文档:https://www.osgeo.cn/sqlalchemy/
sqlalchemy英文文档:https://docs.sqlalchemy.org/
flask-sqlalchemy文档:http://www.pythondoc.com/flask-sqlalchemy/index.html

Flask:数据库管理

原文:https://www.cnblogs.com/bqzzz/p/14407451.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!