栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Creating seed data in a flask-migrate or alembic migration

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Creating seed data in a flask-migrate or alembic migration

Alembic作为其操作之一

bulk_insert()
。该文档提供了以下示例(包含一些我已修复的问题):

from datetime import datefrom sqlalchemy.sql import table, columnfrom sqlalchemy import String, Integer, Datefrom alembic import op# Create an ad-hoc table to use for the insert statement.accounts_table = table('account',    column('id', Integer),    column('name', String),    column('create_date', Date))op.bulk_insert(accounts_table,    [        {'id':1, 'name':'John Smith',     'create_date':date(2010, 10, 5)},        {'id':2, 'name':'Ed Williams',     'create_date':date(2007, 5, 27)},        {'id':3, 'name':'Wendy Jones',     'create_date':date(2008, 8, 15)},    ])

还要注意,Alembic具有一个

execute()
操作,就像
execute()
SQLAlchemy中的普通功能:你可以运行所需的任何SQL,如文档示例所示:

from sqlalchemy.sql import table, columnfrom sqlalchemy import Stringfrom alembic import opaccount = table('account',    column('name', String))op.execute(    account.update().        where(account.c.name==op.inline_literal('account 1')).        values({'name':op.inline_literal('account 2')})        )

请注意,用于创建update语句中使用的元数据的表是直接在架构中定义的。这似乎打破了DRY(不是你的应用程序中已经定义的表),但实际上是非常必要的。如果要尝试使用应用程序中的表或模型定义,则在对应用程序中的表/模型进行更改时,将中断此迁移。你的迁移脚本应该一成不变:对模型的未来版本进行的更改不应更改迁移脚本。使用应用程序模型将意味着定义将根据你检出的模型版本(最可能是最新版本)而改变。因此,你需要表定义在迁移脚本中是自包含的。

要讨论的另一件事是,是否应将种子数据放入作为自己的命令运行的脚本中(例如,使用Flask-script命令,如其他答案所示)。可以使用此方法,但是你应该对此小心。如果要加载的数据是测试数据,那是一回事。但是我已经理解“种子数据”是指应用程序正常工作所需的数据。例如,如果你需要在“角色”表中设置“管理员”和“用户”的记录。该数据应作为迁移的一部分插入。请记住,脚本仅适用于数据库的最新版本,而迁移将适用于要迁移到的或从其中迁移的特定版本。如果你希望脚本加载角色信息,

同样,依靠脚本,你将在迁移之间运行脚本变得更加困难(例如,迁移3-> 4要求初始迁移中的种子数据位于数据库中)。现在,你需要修改Alembic的默认运行方式以运行这些脚本。而且,这些脚本仍会随着时间的推移而改变,并且谁知道你已经从源代码管理中签出了哪个版本的应用程序,这一事实仍然不能忽略。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402463.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号