如何使脚本在我的默认sqlite3数据库django中插入数据

时间:2017-01-07 07:16:19

标签: python django database sqlite

我已经在Django中定义了我的模型,如果用户通过我的应用程序注册,那么用户就可以在数据库中注册。问题是我有一个包含大量用户的JSON的文件。 我想做一份工作,允许我阅读这个文件并将所有用户插入我的数据库。

最好的方法是什么?如何在不使用Django的情况下连接数据库?

3 个答案:

答案 0 :(得分:4)

为什么不想在没有Django的情况下连接数据库?我会用Django来做,但你需要初始化Django,以便能够针对它运行脚本。这样的事情应该这样做:

import os, sys
sys.path.append('/path/to/django/project')
os.environ['DJANGO_SETTINGS_MODULE'] = 'project_name.settings'
import django
django.setup()
from django.contrib.auth.models import User

for row in data:
    user = User.objects.create_user(username=row['username'])

/path/to/django/project是包含您的设置的目录所在的文件夹的路径。例如,层次结构为:

/projects/my_project
/projects/my_project/my_app
/projects/my_project/my_project/setting.py

您需要附加/projects/my_project

如果不是Django User模型,则需要使用自定义模型,而不是

from django.contrib.auth.models import User

from app_name.models import ModelName

答案 1 :(得分:1)

如果要在不经过django视图的情况下插入数据,请使用shell

在应用目录中运行python manage.py shell

然后通过python的json.loads()导入JSON数据,并循环创建和保存数据。

您还可以使用bulk_create创建模型。

YourCustomUserModel.objects.bulk_create([
    YourCustomUserModel(username=datarow.username)
    for datarow in data
])

答案 2 :(得分:0)

您可以改用Django的本机manage.py命令:

yourapp目录中,创建树结构(包括文件夹management),如下所示:

yourapp
├── admin.py
├── __init__.py
├── management
│   ├── commands
│   │   ├── __init__.py
│   │   └── populate_db.py
│   └── __init__.py
├── models.py
... other files

然后,在文件populate_db.py内编写适当的代码以填充数据库,例如:

from django.core.management.base import BaseCommand
from yourapp.models import Post, Tag

class Command(BaseCommand):
    args = '<foo bar ...>'
    help = 'our help string comes here'

    def _create_tags(self):
        tlisp = Tag(name='Python')
        tlisp.save()

        tjava = Tag(name='Java')
        tjava.save()

    def handle(self, *args, **options):
        self._create_tags()

通过此设置,您可以运行$ python manage.py populate_db以自动填充数据库。

当然,您可以扩展此代码以读取例如您可以将其保存在应用程序的data文件夹中的JSON文件。这样一来,您就可以将应用程序中应包含的不敏感数据提交到版本控制中,而不必破坏数据库(从而可能会导致您的超级用户访问权限)。


此精美解决方案的信用归Eli Bendersky所有:https://eli.thegreenplace.net/2014/02/15/programmatically-populating-a-django-database