Python 从外部脚本访问django sqlite数据库

Python 从外部脚本访问django sqlite数据库,python,django,sqlite,external-script,Python,Django,Sqlite,External Script,我想使用外部脚本预填充数据库。脚本如下 # -*- coding:utf-8-*- import os, sys from random import choice PROJECT_DIR = os.path.abspath(os.path.join(os.path.abspath(__file__),'..','..')) sys.path.append(PROJECT_DIR) os.environ['DJANGO_SETTINGS_MODULE']='geoedu.settings'

我想使用外部脚本预填充数据库。脚本如下

# -*- coding:utf-8-*-
import os, sys
from random import choice
PROJECT_DIR = os.path.abspath(os.path.join(os.path.abspath(__file__),'..','..'))

sys.path.append(PROJECT_DIR)
os.environ['DJANGO_SETTINGS_MODULE']='geoedu.settings'

from school.models import School    
from student.models import Student

if __name__=='__main__':
    student = Student(first_name=choice(first_names_males), last_name=choice(last_names_males),
                  father_name=choice(first_names_males), mother_name=choice(first_names_females),
                  mobile=choice(mobiles), telephone=choice(telephones))
    student.save()
其中选择的参数是带有姓名和电话的列表。当我运行它时,虽然我得到以下错误

django.db.utils.DatabaseError: no such table: student_student
目录树

geoedu
├── geoedu
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
├── geoedu.db
├── geoedu.sublime-project
├── geoedu.sublime-workspace
├── manage.py
├── school
│   ├── admin.py
│   ├── admin.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── tests.py
│   └── views.py
├── scripts
│   └── populate.py
└── student
    ├── admin.py
    ├── admin.pyc
    ├── __init__.py
    ├── __init__.pyc
    ├── models.py
    ├── models.pyc
    ├── tests.py
    └── views.py
它所做的是在脚本文件夹中创建一个新的geoedu.db并使用它(它是空的,没有学生表)

为什么会发生这种情况?PROJECT_DIR是正确的(打印出来的),并且是树的根,树的顶部是geodedu


编辑:创建新学生时将创建新geoedu.db。如果我注释掉那些行,geoedu.db不会被创建

在Django中定义模型可以帮助您操作实例

但是,在此之前,必须在sqlite数据库中创建表“骨架”

为此,您只需通过以下操作将db与Django同步:

python manage.py syncdb
这只能做一次


在未来,您可能需要使您的模型进化(因此需要类似的数据库进化),此时South或adhoc schema进化查询将非常有用(),但就您的原型而言,您可以通过执行syncdb删除数据库并使用good table重新创建它。问题是我在settings.py文件中没有为数据库名称使用绝对路径。我以数据库引擎的名义添加了这个

'NAME':os.path.join(SETTINGS_DIR,'geoedu.db')
一切都正常运转。_DIR项目是

SETTINGS_DIR = os.path.dirname(__file__)
因此,数据库是在“设置”文件夹中创建的。如果你想在项目文件夹内,你应该这样做

'NAME':os.path.abspath(os.path.join(SETTINGS_DIR,'..','geoedu.db'))

但是你是如何在设置文件中定义数据库结构的?你是什么意思?引擎':'django.db.backends.sqlite3',.'NAME':'geoedu.db',…等等它是在与项目目录相同的目录上创建的,正如您可以从tree命令中看到的那样。已工作…猜测使用sqlite3时,数据库的名称必须始终是路径,而不仅仅是名称。感谢@Juliusz为我指明了正确的方向不客气-现在把答案放在下面并批准它;)Syncdb正常执行