使用Flask-SQLAlchemy管理数据库

时间:2021-08-26 03:38:11


1、安装Flask-SQLAlchemy
使用Flask-SQLAlchemy管理数据库

 

 

 

2、hello.py配置数据库

from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
manager = Manager(app)
app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘sqlite:///data.sqlite‘
app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True
db = SQLAlchemy(app)

 

3、hello.py 定义Role和User模型

类变量__tablename__定义在数据库中使用的表名。如果没有定义,Flask-SQLAlchemy会使用一个默认的名字,但默认的表名没有遵守使用复数形式进行命名的约定,最好由我们自己指定表名。其余变量都是该模型的属性,被定义为db.Cloumn类的实例

#定义数据库模型
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

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

def __repr__(self):
return User %r % self.username

 

4、关系
users = db.relation(‘User‘, backref=‘role‘)

role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id‘))
使用Flask-SQLAlchemy管理数据库

 

 

对于Role类的实例,其users属性将返回与角色相关联的用户组成的列表。db.relationship()的第一个参数表明这个关系的另一端是哪个模型,如果模型尚未定义,可使用字符串形式指定
db.relationship()的backref参数向User模型添加一个role属性,从而定义反向关系。这一属性可替代role_id访问Role模型,此时获取的是模型对象,而不是外键的值
如果User模型中有1个以上的外键,db.relationship()无法确定使用哪个外键,这时需要添加额外参数,从而确定所用外键

5、在shell中创建数据库

在shell中激活虚拟环境,运行python hello.py shell

使用Flask-SQLAlchemy管理数据库


我们要让 Flask-SQLAlchemy 根据模型类创建数据库。方法是使用 db.create_all()函数,执行完后,目录下会多一个data.sqlite的文件

6、生成data.sqlite文件后,在pycharm中需下载相应包进行支持,否则数据库不能用

使用Flask-SQLAlchemy管理数据库

 

 


如果没有下载相应文件,红框处会有下载提示,点击下载即可
使用Flask-SQLAlchemy管理数据库

 

 

6、插入行
创建一些角色和用户

from hello import Role, User
admin_role = Role(name=Admin)
mod_role = Role(name=Moderator)
user_role = Role(name=User)
user_john = User(username=john, role=admin_role)
user_susan = User(username=susan, role=user_role)
user_david = User(username=david, role=user_role)

 


此时新建对象的id属性并没有明确设定,因为主键是由 Flask-SQLAlchemy 管理的,现在这些对象只存在于python中,还未写入数据库,因此id未赋值

在 Flask-SQLAlchemy 中,会话由 db.session表示。准备把对象写入数据库之前,先要将其添加到会话中

db.session.add(admin_role)
db.session.add(mod_role)
db.session.add(user_role)
db.session.add(user_john)
db.session.add(user_susan)
db.session.add(user_david)

 


也可简写为:

db.session.add_all([admin_role, mod_role, user_role,... user_john, user_susan, user_david])


提交到会话

db.session.commit()