Python 如何制作脚本以在默认sqlite3数据库django中插入数据

Python 如何制作脚本以在默认sqlite3数据库django中插入数据,python,django,database,sqlite,Python,Django,Database,Sqlite,我已经在Django中定义了我的模型和所有内容,如果用户通过我的应用程序进行注册,那么用户就可以在数据库中注册。问题是我有一个包含大量用户的JSON的文件。 我想做一项工作,允许我读取此文件并将所有用户插入我的数据库 最好的方法是什么?如何在不使用Django的情况下连接到数据库?为什么要在不使用Django的情况下连接到数据库?我会使用Django来实现,但您需要初始化Django,以便能够对其运行脚本。像这样的东西应该可以做到: import os, sys sys.path.append(

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


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

为什么要在不使用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
用户
模型,您需要使用自定义模型,而不是

from django.contrib.auth.models import User


如果希望插入数据而不经过django的视图,请使用shell

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

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

您还可以使用
bulk\u create
创建模型

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

您可以改用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()
来自django.core.management.base import BaseCommand的

从yourapp.models导入帖子,标记
类命令(BaseCommand):
args=''
help='我们的帮助字符串出现在这里'
定义创建标签(自我):
tlisp=Tag(name='Python')
tlisp.save()
tjava=Tag(name='Java')
tjava.save()
def句柄(自身、*参数、**选项):
self.\u创建\u标记()
使用此设置,您可以运行
$python manage.py populate\u db
自动填充数据库

当然,您可以扩展此代码以从JSON文件中读取输入,您可以将其保存在应用程序的
data
文件夹中。这允许您将本应属于应用程序一部分的不合理数据提交到版本控制,而不必破坏数据库(从而可能影响超级用户访问)



这个优雅的解决方案归功于Eli Bendersky:

您可以使用模块
sqlite3
sqlalchemy
peewee
。或者您可以尝试将
JSON
转换为
CSV
,然后使用一些数据库查看器/编辑器直接导入数据库。我不知道他们是否可以直接从
JSON
-ie导入数据。只是我真的不知道把那个作业放在哪里,所以我有一个文件夹:project,它包含:django_project(我的应用程序和设置在那里)和一个文件夹作业(我在那里做我所有的作业、爬虫和其他东西来维护我的数据库)使用上面的代码,您可以在脚本中显式初始化Django环境,因此脚本驻留在哪里并不重要。如果愿意,可以将其放在jobs文件夹中。“/path/to/django/project”此路径必须位于我配置数据库的my settings.py上?不,它比该路径低一级。换句话说,它是包含设置文件的文件夹所在目录的路径。请从app_name.models import Dater中尝试

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()