当前位置: 首页 > 后端技术 > Python

Flask_sqlalchemy使用说明(一)

时间:2023-03-26 17:14:41 Python

1.扩展初始化fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)db=SQLAlchemy(app)2.数据模型关系假设我们要为博客系统定义一个关系模型。首先系统中要有文章和用户:#博客文章classPost(db.Model):__tablename__='post'#定义表名,表示类名默认小写,所以这一行也可以deletedifid=db.Column(db.Integer,primary_key=True)#定义主键body=db.Column(db.Text)#UserclassUser(db.Model):id=db.Column(db.Integer,primary_key=True)用户名??=db.Column(db.String(64),unique=True,index=True)#定义长度等参数(db.Model是一个基类,有__tablename__,query等属性)如何体现用户之间的关系和文章毛呢布?假设一篇文章只有一个用户写,一个用户可以写多篇文章。这是典型的一对多关系。定义这样的关系需要两个步骤。1.多边定义外键类Post(db.Model):...author_id=db.Column(db.Integer,db.ForeignKey('user.id'))#foreignkey=db.Column(fieldtype,db.ForeignKey(另一边表名.主键字段名)2.在出发边(“一边”)定义关系属性类User(db.Model):...posts=db.relationship('Post')#Setandrelationshipattribute=db.relationship('othersideclassname')#这里用类名来表示返回对象的类型,这样调用一个User对象的posts关系属性可以得到一个对应的一个Post对象的列表,其author_id值等于User对象的id值。同样的,在Post对象中,也可以定义一个类似的author属性。这样,就可以得到对应的authorofablogpost,oryoucangetauser文章很多,在Post类中添加对应关系字段:classPost(db.Model):...author_id=db.Column(db.Integer,db.ForeignKey('user.id'))author=db.relationship('User')好像是这样做的,但是这样做的问题是修改一个对象实例的字段不会自动更新其他类型的相应字段。例如:>>>user=User()>>>post=Post()>>>post.author=user>>>print(user.posts)[]虽然更新了帖子的作者字段,但是用户的posts字段仍然是空的,从逻辑上讲,用户的文章字段author字段和文章是相互关联的。当其中一个更新时,另一个应该同时更新。这是一个双向关系,可以使用back_populates参数来实现:classUser(db.Model):...posts=db.relationship('Post',back_populates='author')classPost(db.模型):。..author_id=db.Column(db.Integer,db.ForeignKey('user.id'))author=db.relationship('User',back_populates='posts')#设置和关系属性=db.relationship('对方的类名',back_populates='对方的关联属性名')使用backref参数也可以达到同样的效果,但是更加简化:classUser(db.Model):...posts=db.relationship('Post',backref='author')#设置和关系属性=db.relationship('对方的类名',backref='对方自动生成的关联属性名')classPost(db.Model):...author_id=db.Column(db.Integer,db.ForeignKey('user.id'))#这里Post已经有了author属性但是符合“显式优于隐式”",或者使用back_populates是合适的。3、Cascading级联,在操作一个对象的同时,也对相关的对象进行一定的操作。在博客系统中,博客帖子和帖子评论就是一个例子。单独评论是没有意义的。文章评论(子)关联并依赖于博客文章(父)。当文章被添加到数据库中时,相关的评论也会被添加;删除文章时,评论不需要存在于数据库中;如果删除了评论和文章,关联就变成了孤儿对象(孤儿对象2333),评论也应该被删除。级联行为由关系函数relationship()的级联参数设置。以上三种情况分别对应save-update、delete和delete-orphan参数值。参数值可以组合。其余参数值及其详细解释可以在Sqlalchemy文档中找到:cascadesclassPost(db.Model):...comments=db.relationship('Comment',back_populates='post',cascade="all,delete-orphan")#all=save-update+merge+deleteclassComments(db.Model):id=db.Column(db.Integer,primary_key=True)body=db.Column(db.Text)post_id=db.Column(db.Integer,db.ForeignKey('post.id'))post=db.relationship('Post',back_populates='comments')