文章内容

2023/9/18 18:17:09,作 者: 黄兵

SQLAlchemy 插入种子数据或默认数据方法总结


我们在使用 SQLAlchemy 的时候,需要插入默认数据(在 C# 的 Entity Framework 中被称之为种子数据),我不知道在 SQLAlchemy 中被称之为什么数据,我们就把它称之为默认数据吧。

例如:在数据库中有一些在定义模型的时候,会存在一些默认数据,小学的班级有一年级、二年级、三年级……,性别有男和女等等,这些都是一些默认数据,我们在定义模型的时候,一般这些数据都可以直接插入数据库,需要我们提前定义好。

下面是一个代码示例:

# 商品图片类型,例如:商品详情左边小图,商品详情大图等
class AmericaShopProductImageType(db.Model):
__tablename__ = 'america_shop_product_image_types'
__table_args__ = {'comment': '商品图片类型数据表'}
id = db.Column(db.Integer, primary_key=True)
type = db.Column(db.String(64), comment='图片类型')
type_code = db.Column(db.String(64), unique=True, index=True, comment='图片类型代码')

@staticmethod
def insert_types():
types = [{'type': '商品详情页左边小图', 'code': 'product_detail_left_small_pic'},
{'type': '商品详情页小图对应大图', 'code': 'product_detail_left_big_pic'},
{'type': '首页图片', 'code': 'index_page_pic'}]
for item in types:
query_type = AmericaShopProductImageType.query.filter_by(type_code=item['code']).first()
if query_type is None:
data = AmericaShopProductImageType(type=item['type'], type_code=item['code'])
db.session.add(data)
db.session.commit()

上面代码定义了默认的图片类型,同时定义了默认需要插入数据表的数据。

首先通过一个字典存储默认数据,由于可能存在多次运行此代码,导致反复插入数据导致数据重复,所以首先判断数据是否存在,也就是这句:

query_type = AmericaShopProductImageType.query.filter_by(type_code=item['code']).first()

如果数据不存在就插入数据,数据存在跳过,最后向数据库提交数据。

我们如何在部署的时候,插入默认数据呢?

我们直接在 manage.py 文件中定义如下函数:

@app.cli.command()
def deploy():
"""Run deployment tasks."""
# migrate database to latest revision
upgrade()
# 插入图片类型默认数据
AmericaShopProductImageType.insert_types()

在部署的时候执行 deploy 就可以插入默认数据了。

上面的项目结构可具体讲解可以参考:flasky

同时推荐这本书:《Flask Web 开发 基于 Python 的 Web 应用开发实战》这本书,有很详细的讲解。


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - SQLAlchemy 插入种子数据或默认数据方法总结

分享到:

发表评论

评论列表