1、安装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‘))
对于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 根据模型类创建数据库。方法是使用 db.create_all()函数,执行完后,目录下会多一个data.sqlite的文件
6、生成data.sqlite文件后,在pycharm中需下载相应包进行支持,否则数据库不能用
如果没有下载相应文件,红框处会有下载提示,点击下载即可
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()