对于我们要完成的博客系统来说,可以建模成两个表,分别存储用户角色和用户基本信息、
用户信息表users为
id | 存储用户id |
username | 用户名 |
password | 密码 |
role_id | 角色 |
用户角色存储为
id | 存放角色id |
name | 存放角色名字 |
定义的相关代码为:
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', lazy='dynamic')
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)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __repr__(self):
return '<User %r>' % self.username
关系型数据库把不同表中的行联系起来。角色到用户是一对多的关系,因为一个角色可属于多个用户,而每个用户只能有一个角色。User模型中的role_id列被定义为外键,就是这个外键建立起了关系。
SQLAlchemy用session表示会话,每次都是用把对象先add到session中再提交se = session.add(object),再将回话commit:
se.commit()这样才是完全的把会话提交。
但是每次启动shell会话都要导入数据库实例和模型,这是很没有必要的,所以我们要为shell命令注册一个make_context回调函数。
def make_shell_context():
return dict(app = app,db = db,User = User,Role = Role)
manager.add_command('shell', Shell(make_context = make_shell_context)