【问题标题】:How to make a script to insert data in my default sqlite3 database django如何制作脚本以在我的默认 sqlite3 数据库 django 中插入数据
【发布时间】:2017-05-21 23:54:09
【问题描述】:

我已经在 Django 中定义了我的模型和所有内容,如果用户通过我的应用程序进行注册,则该用户可以很好地在数据库中注册。问题是我有一个包含大量用户的 JSON 文件。 我想做一项允许我读取此文件并将所有用户插入我的数据库中的工作。

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

【问题讨论】:

  • 您可以使用模块sqlite3sqlalchemypeewee。或者您可以尝试将JSON 转换为CSV,然后使用某些数据库查看器/编辑器直接导入数据库。我不知道他们是否可以直接从JSON 导入数据 - 即。 DB Browser for SQLite

标签: python django database sqlite


【解决方案1】:

为什么要在没有 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

【讨论】:

  • 只是我真的不知道该把工作放在哪里,所以我有一个文件夹:项目包含:django_project(我的应用程序和我的设置在哪里)和一个文件夹工作(我在哪里我所有的工作,爬虫和东西来养活我的数据库)
  • 使用上面的代码,您可以在脚本中显式初始化您的 Django 环境,因此脚本位于何处并不重要。如果你愿意,你可以把它放在工作文件夹中。
  • "/path/to/django/project" 这个路径必须在我配置数据库的 settings.py 中结束?
  • 不,比它低一级。换句话说,它是包含设置文件的文件夹所在目录的路径。
  • 试试from app_name.models import Dater
【解决方案2】:

如果你想插入数据而不通过 django 的视图,使用 shell

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

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

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

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

【讨论】:

    【解决方案3】:

    您可以改用 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 来自动填充您的数据库。

    当然,您可以扩展此代码以读取来自例如的输入。一个 JSON 文件,您可以将其保存在应用程序的 data 文件夹中。这允许您将本应属于您的应用程序一部分的非敏感数据提交给版本控制,而无需破坏数据库(从而可能导致您的超级用户访问)。


    这个优雅的解决方案归功于 Eli Bendersky:https://eli.thegreenplace.net/2014/02/15/programmatically-populating-a-django-database

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 2013-10-06
      • 1970-01-01
      • 2016-05-23
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多