使用夹具或脚本预填充数据库?

Posted

技术标签:

【中文标题】使用夹具或脚本预填充数据库?【英文标题】:Prepopulate database with fixtures or with script? 【发布时间】:2016-09-01 18:59:44 【问题描述】:

我不是专家,但我认为使用类来定义选择并使用这些选择预填充数据库是一个好主意。我认为这更容易改变选择等

所以在我的models.py 我有:

class City(models.Model):
    name = models.CharField(max_length=32)
    distance = models.SmallIntegerField(blank=True, null=True)
    #etc

class OtherClass(models.Model):
    name = models.CharField(max_length=32)
    #etc

class UserProfile(models.Model):
    name = models.CharField(max_length=32)
    city = models.ForeignKey(City)
    otherfield = models.ForeignKey(OtherClass)
    #etc

UserProfile 是用户编译的,City, OtherClass程序员放置选项的地方。

迁移后,我必须创建一些 CityOtherClass 对象:它们将成为选项(是的,它们必须被修复)。

我刚刚了解了fixtures。到目前为止,我使用的是script

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sitopossedimenti.settings')

import django
django.setup()

from core.models import *

def populate():
    namecity1 = add_source('city1', None)
    namecity2 = add_source('city2', None)
    @etc

    nameotherclass1 = add_otherclass('name1', #etc)

    #etc some thousands more

def add_source(name, distance):
    s = model.Source.objects.get_or_create(name=name, distance=distance)[0]
    s.save()
    return s

def add_otherclass:
    #etc

if __name__ == '__main__':
    print ("Starting myapp population script...")
    populate()

目前脚本(大约)可以正常工作,但我不敢改变......但你怎么看?固定装置更好吗?为什么?有区别吗?

【问题讨论】:

【参考方案1】:

俗话说得好,不修。 Fixtures 是更常用的方法,但使用您自己的方法并无害处。如果你正在编写一个新的测试用例,你可能想要使用固定装置,但如果我是你,我就这样吧。

如果您想要一种完全自动化的方式来实现结果,请考虑migration.RunPython。链接的文档包含一个完整的示例,显示正在加载的数据。显然,./manage.py migrate 会发生这种情况,无需额外的步骤。

使用 migrations.RunPython 的优势在于,如果您要与同事共享您的应用程序或安装在不同的服务器上,所需的数据将自动加载到生产服务器中,并且测试也可以完全访问它在测试数据库中。

【讨论】:

以上是关于使用夹具或脚本预填充数据库?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony数据夹具与ManyToMany的关系

离子预填充数据库 Sqlite

如何交付带有预填充领域数据库的应用程序

带有加载夹具的 Django 单元测试,用于解决几个相关的应用程序问题

如何创建夹具文件

Django Admin:从 POST 或 GET 预填充值?