为什么不使用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
原文:https://www.cnblogs.com/bqzzz/p/14407451.html